forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Introduce asm header that contains the appldata data structures and the diag inline assembly. Signed-off-by: Gerald Schaefer <[email protected]> Signed-off-by: Martin Schwidefsky <[email protected]>
- Loading branch information
Gerald Schaefer
authored and
Martin Schwidefsky
committed
Sep 20, 2006
1 parent
45af3af
commit 1f38d61
Showing
4 changed files
with
103 additions
and
85 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
/* | ||
* include/asm-s390/appldata.h | ||
* | ||
* Copyright (C) IBM Corp. 2006 | ||
* | ||
* Author(s): Melissa Howland <[email protected]> | ||
*/ | ||
|
||
#ifndef _ASM_S390_APPLDATA_H | ||
#define _ASM_S390_APPLDATA_H | ||
|
||
#include <asm/io.h> | ||
|
||
#ifndef CONFIG_64BIT | ||
|
||
#define APPLDATA_START_INTERVAL_REC 0x00 /* Function codes for */ | ||
#define APPLDATA_STOP_REC 0x01 /* DIAG 0xDC */ | ||
#define APPLDATA_GEN_EVENT_REC 0x02 | ||
#define APPLDATA_START_CONFIG_REC 0x03 | ||
|
||
/* | ||
* Parameter list for DIAGNOSE X'DC' | ||
*/ | ||
struct appldata_parameter_list { | ||
u16 diag; /* The DIAGNOSE code X'00DC' */ | ||
u8 function; /* The function code for the DIAGNOSE */ | ||
u8 parlist_length; /* Length of the parameter list */ | ||
u32 product_id_addr; /* Address of the 16-byte product ID */ | ||
u16 reserved; | ||
u16 buffer_length; /* Length of the application data buffer */ | ||
u32 buffer_addr; /* Address of the application data buffer */ | ||
} __attribute__ ((packed)); | ||
|
||
#else /* CONFIG_64BIT */ | ||
|
||
#define APPLDATA_START_INTERVAL_REC 0x80 | ||
#define APPLDATA_STOP_REC 0x81 | ||
#define APPLDATA_GEN_EVENT_REC 0x82 | ||
#define APPLDATA_START_CONFIG_REC 0x83 | ||
|
||
/* | ||
* Parameter list for DIAGNOSE X'DC' | ||
*/ | ||
struct appldata_parameter_list { | ||
u16 diag; | ||
u8 function; | ||
u8 parlist_length; | ||
u32 unused01; | ||
u16 reserved; | ||
u16 buffer_length; | ||
u32 unused02; | ||
u64 product_id_addr; | ||
u64 buffer_addr; | ||
} __attribute__ ((packed)); | ||
|
||
#endif /* CONFIG_64BIT */ | ||
|
||
struct appldata_product_id { | ||
char prod_nr[7]; /* product number */ | ||
u16 prod_fn; /* product function */ | ||
u8 record_nr; /* record number */ | ||
u16 version_nr; /* version */ | ||
u16 release_nr; /* release */ | ||
u16 mod_lvl; /* modification level */ | ||
} __attribute__ ((packed)); | ||
|
||
static inline int appldata_asm(struct appldata_product_id *id, | ||
unsigned short fn, void *buffer, | ||
unsigned short length) | ||
{ | ||
struct appldata_parameter_list parm_list; | ||
int ry; | ||
|
||
if (!MACHINE_IS_VM) | ||
return -ENOSYS; | ||
parm_list.diag = 0xdc; | ||
parm_list.function = fn; | ||
parm_list.parlist_length = sizeof(parm_list); | ||
parm_list.buffer_length = length; | ||
parm_list.product_id_addr = (unsigned long) id; | ||
parm_list.buffer_addr = virt_to_phys(buffer); | ||
asm volatile( | ||
"diag %1,%0,0xdc" | ||
: "=d" (ry) | ||
: "d" (&parm_list), "m" (parm_list), "m" (*id) | ||
: "cc"); | ||
return ry; | ||
} | ||
|
||
#endif /* _ASM_S390_APPLDATA_H */ |