xref: /freebsd/sys/compat/x86bios/x86bios.h (revision 19de5df5e5ddb928640951dcb5cbac3b3bb6c62e)
119de5df5SJung-uk Kim /*-
219de5df5SJung-uk Kim  * Written by paradox <ddkprog@yahoo.com>
319de5df5SJung-uk Kim  * Public domain.
419de5df5SJung-uk Kim  *
519de5df5SJung-uk Kim  * x86 registers were borrowed from x86emu.h x86emu_regs.h
619de5df5SJung-uk Kim  * for compatability.
719de5df5SJung-uk Kim  *
819de5df5SJung-uk Kim  * $FreeBSD$
919de5df5SJung-uk Kim  */
1019de5df5SJung-uk Kim 
1119de5df5SJung-uk Kim #ifndef _X86BIOS_H_
1219de5df5SJung-uk Kim #define _X86BIOS_H_
1319de5df5SJung-uk Kim 
1419de5df5SJung-uk Kim #include <sys/types.h>
1519de5df5SJung-uk Kim #include <sys/endian.h>
1619de5df5SJung-uk Kim #include <sys/systm.h>
1719de5df5SJung-uk Kim 
1819de5df5SJung-uk Kim #ifdef	__BIG_ENDIAN__
1919de5df5SJung-uk Kim 
2019de5df5SJung-uk Kim struct x86_register32 {
2119de5df5SJung-uk Kim 	uint32_t e_reg;
2219de5df5SJung-uk Kim };
2319de5df5SJung-uk Kim 
2419de5df5SJung-uk Kim struct x86_register16 {
2519de5df5SJung-uk Kim 	uint16_t filler0;
2619de5df5SJung-uk Kim 	uint16_t x_reg;
2719de5df5SJung-uk Kim };
2819de5df5SJung-uk Kim 
2919de5df5SJung-uk Kim struct x86_register8 {
3019de5df5SJung-uk Kim 	uint8_t filler0, filler1;
3119de5df5SJung-uk Kim 	uint8_t h_reg, l_reg;
3219de5df5SJung-uk Kim };
3319de5df5SJung-uk Kim 
3419de5df5SJung-uk Kim #else /* !__BIG_ENDIAN__ */
3519de5df5SJung-uk Kim 
3619de5df5SJung-uk Kim struct x86_register32 {
3719de5df5SJung-uk Kim 	uint32_t e_reg;
3819de5df5SJung-uk Kim };
3919de5df5SJung-uk Kim 
4019de5df5SJung-uk Kim struct x86_register16 {
4119de5df5SJung-uk Kim 	uint16_t x_reg;
4219de5df5SJung-uk Kim };
4319de5df5SJung-uk Kim 
4419de5df5SJung-uk Kim struct x86_register8 {
4519de5df5SJung-uk Kim 	uint8_t l_reg, h_reg;
4619de5df5SJung-uk Kim };
4719de5df5SJung-uk Kim 
4819de5df5SJung-uk Kim #endif /* __BIG_ENDIAN__ */
4919de5df5SJung-uk Kim 
5019de5df5SJung-uk Kim union x86_register {
5119de5df5SJung-uk Kim 	struct x86_register32	I32_reg;
5219de5df5SJung-uk Kim 	struct x86_register16	I16_reg;
5319de5df5SJung-uk Kim 	struct x86_register8	I8_reg;
5419de5df5SJung-uk Kim };
5519de5df5SJung-uk Kim 
5619de5df5SJung-uk Kim struct x86regs {
5719de5df5SJung-uk Kim 	uint16_t		register_cs;
5819de5df5SJung-uk Kim 	uint16_t		register_ds;
5919de5df5SJung-uk Kim 	uint16_t		register_es;
6019de5df5SJung-uk Kim 	uint16_t		register_fs;
6119de5df5SJung-uk Kim 	uint16_t		register_gs;
6219de5df5SJung-uk Kim 	uint16_t		register_ss;
6319de5df5SJung-uk Kim 	uint32_t		register_flags;
6419de5df5SJung-uk Kim 	union x86_register	register_a;
6519de5df5SJung-uk Kim 	union x86_register	register_b;
6619de5df5SJung-uk Kim 	union x86_register	register_c;
6719de5df5SJung-uk Kim 	union x86_register	register_d;
6819de5df5SJung-uk Kim 
6919de5df5SJung-uk Kim 	union x86_register	register_sp;
7019de5df5SJung-uk Kim 	union x86_register	register_bp;
7119de5df5SJung-uk Kim 	union x86_register	register_si;
7219de5df5SJung-uk Kim 	union x86_register	register_di;
7319de5df5SJung-uk Kim 	union x86_register	register_ip;
7419de5df5SJung-uk Kim };
7519de5df5SJung-uk Kim 
7619de5df5SJung-uk Kim typedef struct x86regs	x86regs_t;
7719de5df5SJung-uk Kim 
7819de5df5SJung-uk Kim /* 8 bit registers */
7919de5df5SJung-uk Kim #define R_AH	register_a.I8_reg.h_reg
8019de5df5SJung-uk Kim #define R_AL	register_a.I8_reg.l_reg
8119de5df5SJung-uk Kim #define R_BH	register_b.I8_reg.h_reg
8219de5df5SJung-uk Kim #define R_BL	register_b.I8_reg.l_reg
8319de5df5SJung-uk Kim #define R_CH	register_c.I8_reg.h_reg
8419de5df5SJung-uk Kim #define R_CL	register_c.I8_reg.l_reg
8519de5df5SJung-uk Kim #define R_DH	register_d.I8_reg.h_reg
8619de5df5SJung-uk Kim #define R_DL	register_d.I8_reg.l_reg
8719de5df5SJung-uk Kim 
8819de5df5SJung-uk Kim /* 16 bit registers */
8919de5df5SJung-uk Kim #define R_AX	register_a.I16_reg.x_reg
9019de5df5SJung-uk Kim #define R_BX	register_b.I16_reg.x_reg
9119de5df5SJung-uk Kim #define R_CX	register_c.I16_reg.x_reg
9219de5df5SJung-uk Kim #define R_DX	register_d.I16_reg.x_reg
9319de5df5SJung-uk Kim 
9419de5df5SJung-uk Kim /* 32 bit extended registers */
9519de5df5SJung-uk Kim #define R_EAX	register_a.I32_reg.e_reg
9619de5df5SJung-uk Kim #define R_EBX	register_b.I32_reg.e_reg
9719de5df5SJung-uk Kim #define R_ECX	register_c.I32_reg.e_reg
9819de5df5SJung-uk Kim #define R_EDX	register_d.I32_reg.e_reg
9919de5df5SJung-uk Kim 
10019de5df5SJung-uk Kim /* special registers */
10119de5df5SJung-uk Kim #define R_SP	register_sp.I16_reg.x_reg
10219de5df5SJung-uk Kim #define R_BP	register_bp.I16_reg.x_reg
10319de5df5SJung-uk Kim #define R_SI	register_si.I16_reg.x_reg
10419de5df5SJung-uk Kim #define R_DI	register_di.I16_reg.x_reg
10519de5df5SJung-uk Kim #define R_IP	register_ip.I16_reg.x_reg
10619de5df5SJung-uk Kim #define R_FLG	register_flags
10719de5df5SJung-uk Kim 
10819de5df5SJung-uk Kim /* special registers */
10919de5df5SJung-uk Kim #define R_ESP	register_sp.I32_reg.e_reg
11019de5df5SJung-uk Kim #define R_EBP	register_bp.I32_reg.e_reg
11119de5df5SJung-uk Kim #define R_ESI	register_si.I32_reg.e_reg
11219de5df5SJung-uk Kim #define R_EDI	register_di.I32_reg.e_reg
11319de5df5SJung-uk Kim #define R_EIP	register_ip.I32_reg.e_reg
11419de5df5SJung-uk Kim #define R_EFLG	register_flags
11519de5df5SJung-uk Kim 
11619de5df5SJung-uk Kim /* segment registers */
11719de5df5SJung-uk Kim #define R_CS	register_cs
11819de5df5SJung-uk Kim #define R_DS	register_ds
11919de5df5SJung-uk Kim #define R_SS	register_ss
12019de5df5SJung-uk Kim #define R_ES	register_es
12119de5df5SJung-uk Kim #define R_FS	register_fs
12219de5df5SJung-uk Kim #define R_GS	register_gs
12319de5df5SJung-uk Kim 
12419de5df5SJung-uk Kim #define SEG_ADDR(x)	(((x) >> 4) & 0x00F000)
12519de5df5SJung-uk Kim #define SEG_OFF(x)	((x) & 0x0FFFF)
12619de5df5SJung-uk Kim #define FARP(x)		((le32toh(x) & 0xffff) + ((le32toh(x) >> 12) & 0xffff00))
12719de5df5SJung-uk Kim 
12819de5df5SJung-uk Kim #define MAPPED_MEMORY_SIZE	0xc00000
12919de5df5SJung-uk Kim #define PAGE_RESERV		(4096*5)
13019de5df5SJung-uk Kim 
13119de5df5SJung-uk Kim __BEGIN_DECLS
13219de5df5SJung-uk Kim void  x86biosCall(struct x86regs *regs, int intno);
13319de5df5SJung-uk Kim void *x86biosAlloc(int count, int *segs);
13419de5df5SJung-uk Kim void  x86biosFree(void *pbuf, int count);
13519de5df5SJung-uk Kim void *x86biosOffs(uint32_t offs);
13619de5df5SJung-uk Kim __END_DECLS
13719de5df5SJung-uk Kim 
13819de5df5SJung-uk Kim #endif /* !_X86BIOS_H_ */
139