|
|
1.1 ! root 1: #ifndef REGISTERS_H ! 2: #define REGISTERS_H ! 3: ! 4: /** @file ! 5: * ! 6: * i386 registers. ! 7: * ! 8: * This file defines data structures that allow easy access to i386 ! 9: * register dumps. ! 10: * ! 11: */ ! 12: ! 13: FILE_LICENCE ( GPL2_OR_LATER ); ! 14: ! 15: #include <stdint.h> ! 16: ! 17: /** ! 18: * A 16-bit general register. ! 19: * ! 20: * This type encapsulates a 16-bit register such as %ax, %bx, %cx, ! 21: * %dx, %si, %di, %bp or %sp. ! 22: * ! 23: */ ! 24: typedef union { ! 25: struct { ! 26: union { ! 27: uint8_t l; ! 28: uint8_t byte; ! 29: }; ! 30: uint8_t h; ! 31: } __attribute__ (( packed )); ! 32: uint16_t word; ! 33: } __attribute__ (( packed )) reg16_t; ! 34: ! 35: /** ! 36: * A 32-bit general register. ! 37: * ! 38: * This type encapsulates a 32-bit register such as %eax, %ebx, %ecx, ! 39: * %edx, %esi, %edi, %ebp or %esp. ! 40: * ! 41: */ ! 42: typedef union { ! 43: struct { ! 44: union { ! 45: uint8_t l; ! 46: uint8_t byte; ! 47: }; ! 48: uint8_t h; ! 49: } __attribute__ (( packed )); ! 50: uint16_t word; ! 51: uint32_t dword; ! 52: } __attribute__ (( packed )) reg32_t; ! 53: ! 54: /** ! 55: * A 32-bit general register dump. ! 56: * ! 57: * This is the data structure that is created on the stack by the @c ! 58: * pushal instruction, and can be read back using the @c popal ! 59: * instruction. ! 60: * ! 61: */ ! 62: struct i386_regs { ! 63: union { ! 64: uint16_t di; ! 65: uint32_t edi; ! 66: }; ! 67: union { ! 68: uint16_t si; ! 69: uint32_t esi; ! 70: }; ! 71: union { ! 72: uint16_t bp; ! 73: uint32_t ebp; ! 74: }; ! 75: union { ! 76: uint16_t sp; ! 77: uint32_t esp; ! 78: }; ! 79: union { ! 80: struct { ! 81: uint8_t bl; ! 82: uint8_t bh; ! 83: } __attribute__ (( packed )); ! 84: uint16_t bx; ! 85: uint32_t ebx; ! 86: }; ! 87: union { ! 88: struct { ! 89: uint8_t dl; ! 90: uint8_t dh; ! 91: } __attribute__ (( packed )); ! 92: uint16_t dx; ! 93: uint32_t edx; ! 94: }; ! 95: union { ! 96: struct { ! 97: uint8_t cl; ! 98: uint8_t ch; ! 99: } __attribute__ (( packed )); ! 100: uint16_t cx; ! 101: uint32_t ecx; ! 102: }; ! 103: union { ! 104: struct { ! 105: uint8_t al; ! 106: uint8_t ah; ! 107: } __attribute__ (( packed )); ! 108: uint16_t ax; ! 109: uint32_t eax; ! 110: }; ! 111: } __attribute__ (( packed )); ! 112: ! 113: /** ! 114: * A segment register dump. ! 115: * ! 116: * The i386 has no equivalent of the @c pushal or @c popal ! 117: * instructions for the segment registers. We adopt the convention of ! 118: * always using the sequences ! 119: * ! 120: * @code ! 121: * ! 122: * pushw %gs ; pushw %fs ; pushw %es ; pushw %ds ; pushw %ss ; pushw %cs ! 123: * ! 124: * @endcode ! 125: * ! 126: * and ! 127: * ! 128: * @code ! 129: * ! 130: * addw $4, %sp ; popw %ds ; popw %es ; popw %fs ; popw %gs ! 131: * ! 132: * @endcode ! 133: * ! 134: * This is the data structure that is created and read back by these ! 135: * instruction sequences. ! 136: * ! 137: */ ! 138: struct i386_seg_regs { ! 139: uint16_t cs; ! 140: uint16_t ss; ! 141: uint16_t ds; ! 142: uint16_t es; ! 143: uint16_t fs; ! 144: uint16_t gs; ! 145: } __attribute__ (( packed )); ! 146: ! 147: /** ! 148: * A full register dump. ! 149: * ! 150: * This data structure is created by the instructions ! 151: * ! 152: * @code ! 153: * ! 154: * pushfl ! 155: * pushal ! 156: * pushw %gs ; pushw %fs ; pushw %es ; pushw %ds ; pushw %ss ; pushw %cs ! 157: * ! 158: * @endcode ! 159: * ! 160: * and can be read back using the instructions ! 161: * ! 162: * @code ! 163: * ! 164: * addw $4, %sp ; popw %ds ; popw %es ; popw %fs ; popw %gs ! 165: * popal ! 166: * popfl ! 167: * ! 168: * @endcode ! 169: * ! 170: * prot_call() and kir_call() create this data structure on the stack ! 171: * and pass in a pointer to this structure. ! 172: * ! 173: */ ! 174: struct i386_all_regs { ! 175: struct i386_seg_regs segs; ! 176: struct i386_regs regs; ! 177: uint32_t flags; ! 178: } __attribute__ (( packed )); ! 179: ! 180: /* Flags */ ! 181: #define CF ( 1 << 0 ) ! 182: #define PF ( 1 << 2 ) ! 183: #define AF ( 1 << 4 ) ! 184: #define ZF ( 1 << 6 ) ! 185: #define SF ( 1 << 7 ) ! 186: #define OF ( 1 << 11 ) ! 187: ! 188: /* Segment:offset structure. Note that the order within the structure ! 189: * is offset:segment. ! 190: */ ! 191: struct segoff { ! 192: uint16_t offset; ! 193: uint16_t segment; ! 194: } __attribute__ (( packed )); ! 195: ! 196: typedef struct segoff segoff_t; ! 197: ! 198: #endif /* REGISTERS_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.