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