176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef REGISTERS_H 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define REGISTERS_H 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @file 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * i386 registers. 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This file defines data structures that allow easy access to i386 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * register dumps. 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( GPL2_OR_LATER ); 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h> 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * A 16-bit general register. 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This type encapsulates a 16-bit register such as %ax, %bx, %cx, 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * %dx, %si, %di, %bp or %sp. 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef union { 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t l; 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t byte; 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t h; 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } PACKED; 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t word; 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} PACKED reg16_t; 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * A 32-bit general register. 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This type encapsulates a 32-bit register such as %eax, %ebx, %ecx, 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * %edx, %esi, %edi, %ebp or %esp. 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef union { 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t l; 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t byte; 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t h; 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } PACKED; 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t word; 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t dword; 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} PACKED reg32_t; 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * A 32-bit general register dump. 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the data structure that is created on the stack by the @c 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * pushal instruction, and can be read back using the @c popal 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * instruction. 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct i386_regs { 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t di; 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t edi; 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t si; 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t esi; 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t bp; 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t ebp; 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t sp; 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t esp; 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t bl; 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t bh; 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } PACKED; 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t bx; 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t ebx; 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t dl; 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t dh; 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } PACKED; 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t dx; 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t edx; 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t cl; 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t ch; 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } PACKED; 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t cx; 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t ecx; 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t al; 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t ah; 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } PACKED; 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t ax; 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t eax; 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} PACKED; 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * A segment register dump. 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The i386 has no equivalent of the @c pushal or @c popal 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * instructions for the segment registers. We adopt the convention of 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * always using the sequences 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @code 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * pushw %gs ; pushw %fs ; pushw %es ; pushw %ds ; pushw %ss ; pushw %cs 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @endcode 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * and 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @code 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * addw $4, %sp ; popw %ds ; popw %es ; popw %fs ; popw %gs 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @endcode 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the data structure that is created and read back by these 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * instruction sequences. 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct i386_seg_regs { 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t cs; 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t ss; 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t ds; 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t es; 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t fs; 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t gs; 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} PACKED; 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * A full register dump. 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This data structure is created by the instructions 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @code 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * pushfl 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * pushal 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * pushw %gs ; pushw %fs ; pushw %es ; pushw %ds ; pushw %ss ; pushw %cs 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @endcode 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * and can be read back using the instructions 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @code 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * addw $4, %sp ; popw %ds ; popw %es ; popw %fs ; popw %gs 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * popal 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * popfl 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @endcode 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * prot_call() and kir_call() create this data structure on the stack 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * and pass in a pointer to this structure. 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct i386_all_regs { 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct i386_seg_regs segs; 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct i386_regs regs; 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t flags; 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} PACKED; 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Flags */ 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define CF ( 1 << 0 ) 18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PF ( 1 << 2 ) 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define AF ( 1 << 4 ) 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ZF ( 1 << 6 ) 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SF ( 1 << 7 ) 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define OF ( 1 << 11 ) 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Segment:offset structure. Note that the order within the structure 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * is offset:segment. 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct segoff { 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t offset; 19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t segment; 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} PACKED; 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct segoff segoff_t; 19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* REGISTERS_H */ 199