123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- #ifndef REGISTERS_H
- #define REGISTERS_H
-
- /** @file
- *
- * i386 registers.
- *
- * This file defines data structures that allow easy access to i386
- * register dumps.
- *
- */
-
- FILE_LICENCE ( GPL2_OR_LATER );
-
- #include <stdint.h>
-
- /**
- * A 16-bit general register.
- *
- * This type encapsulates a 16-bit register such as %ax, %bx, %cx,
- * %dx, %si, %di, %bp or %sp.
- *
- */
- typedef union {
- struct {
- union {
- uint8_t l;
- uint8_t byte;
- };
- uint8_t h;
- } PACKED;
- uint16_t word;
- } PACKED reg16_t;
-
- /**
- * A 32-bit general register.
- *
- * This type encapsulates a 32-bit register such as %eax, %ebx, %ecx,
- * %edx, %esi, %edi, %ebp or %esp.
- *
- */
- typedef union {
- struct {
- union {
- uint8_t l;
- uint8_t byte;
- };
- uint8_t h;
- } PACKED;
- uint16_t word;
- uint32_t dword;
- } PACKED reg32_t;
-
- /**
- * A 32-bit general register dump.
- *
- * This is the data structure that is created on the stack by the @c
- * pushal instruction, and can be read back using the @c popal
- * instruction.
- *
- */
- struct i386_regs {
- union {
- uint16_t di;
- uint32_t edi;
- };
- union {
- uint16_t si;
- uint32_t esi;
- };
- union {
- uint16_t bp;
- uint32_t ebp;
- };
- union {
- uint16_t sp;
- uint32_t esp;
- };
- union {
- struct {
- uint8_t bl;
- uint8_t bh;
- } PACKED;
- uint16_t bx;
- uint32_t ebx;
- };
- union {
- struct {
- uint8_t dl;
- uint8_t dh;
- } PACKED;
- uint16_t dx;
- uint32_t edx;
- };
- union {
- struct {
- uint8_t cl;
- uint8_t ch;
- } PACKED;
- uint16_t cx;
- uint32_t ecx;
- };
- union {
- struct {
- uint8_t al;
- uint8_t ah;
- } PACKED;
- uint16_t ax;
- uint32_t eax;
- };
- } PACKED;
-
- /**
- * A segment register dump.
- *
- * The i386 has no equivalent of the @c pushal or @c popal
- * instructions for the segment registers. We adopt the convention of
- * always using the sequences
- *
- * @code
- *
- * pushw %gs ; pushw %fs ; pushw %es ; pushw %ds ; pushw %ss ; pushw %cs
- *
- * @endcode
- *
- * and
- *
- * @code
- *
- * addw $4, %sp ; popw %ds ; popw %es ; popw %fs ; popw %gs
- *
- * @endcode
- *
- * This is the data structure that is created and read back by these
- * instruction sequences.
- *
- */
- struct i386_seg_regs {
- uint16_t cs;
- uint16_t ss;
- uint16_t ds;
- uint16_t es;
- uint16_t fs;
- uint16_t gs;
- } PACKED;
-
- /**
- * A full register dump.
- *
- * This data structure is created by the instructions
- *
- * @code
- *
- * pushfl
- * pushal
- * pushw %gs ; pushw %fs ; pushw %es ; pushw %ds ; pushw %ss ; pushw %cs
- *
- * @endcode
- *
- * and can be read back using the instructions
- *
- * @code
- *
- * addw $4, %sp ; popw %ds ; popw %es ; popw %fs ; popw %gs
- * popal
- * popfl
- *
- * @endcode
- *
- * prot_call() and kir_call() create this data structure on the stack
- * and pass in a pointer to this structure.
- *
- */
- struct i386_all_regs {
- struct i386_seg_regs segs;
- struct i386_regs regs;
- uint32_t flags;
- } PACKED;
-
- /* Flags */
- #define CF ( 1 << 0 )
- #define PF ( 1 << 2 )
- #define AF ( 1 << 4 )
- #define ZF ( 1 << 6 )
- #define SF ( 1 << 7 )
- #define OF ( 1 << 11 )
-
- /* Segment:offset structure. Note that the order within the structure
- * is offset:segment.
- */
- struct segoff {
- uint16_t offset;
- uint16_t segment;
- } PACKED;
-
- typedef struct segoff segoff_t;
-
- #endif /* REGISTERS_H */
|