1 // Structure layout of cpu registers the the bios uses.
3 // Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
5 // This file may be distributed under the terms of the GNU LGPLv3 license.
16 #define CR0_PG (1<<31) // Paging
17 #define CR0_CD (1<<30) // Cache disable
18 #define CR0_NW (1<<29) // Not Write-through
19 #define CR0_PE (1<<0) // Protection enable
24 #include "farptr.h" // struct segoff_s
26 /****************************************************************
27 * Registers saved/restored in romlayout.S
28 ****************************************************************/
30 #include "types.h" // u16
32 #define UREG(ER, R, RH, RL) union { u32 ER; struct { u16 R; u16 R ## _hi; }; struct { u8 RL; u8 RH; u8 R ## _hilo; u8 R ## _hihi; }; }
34 // Layout of registers passed in to irq handlers. Note that this
35 // layout corresponds to code in romlayout.S - don't change it here
36 // without also updating the assembler code.
40 UREG(edi, di, di_hi, di_lo);
41 UREG(esi, si, si_hi, si_lo);
42 UREG(ebp, bp, bp_hi, bp_lo);
43 UREG(ebx, bx, bh, bl);
44 UREG(edx, dx, dh, dl);
45 UREG(ecx, cx, ch, cl);
46 UREG(eax, ax, ah, al);
52 /****************************************************************
54 ****************************************************************/
57 set_cf(struct bregs *regs, int cond)
65 // Frequently used return codes
66 #define RET_EUNSUPPORTED 0x86
69 set_success(struct bregs *regs)
75 set_code_success(struct bregs *regs)
82 set_invalid_silent(struct bregs *regs)
88 set_code_invalid_silent(struct bregs *regs, u8 code)
94 #define warn_invalid(regs) \
95 __warn_invalid((regs), __LINE__, __func__)
96 #define set_invalid(regs) \
97 __set_invalid((regs), __LINE__, __func__)
98 #define set_code_invalid(regs, code) \
99 __set_code_invalid((regs), (code) | (__LINE__ << 8), __func__)
101 #define warn_unimplemented(regs) \
102 __warn_unimplemented((regs), __LINE__, __func__)
103 #define set_unimplemented(regs) \
104 __set_unimplemented((regs), __LINE__, __func__)
105 #define set_code_unimplemented(regs, code) \
106 __set_code_unimplemented((regs), (code) | (__LINE__ << 8), __func__)
109 void __warn_invalid(struct bregs *regs, int lineno, const char *fname);
110 void __warn_unimplemented(struct bregs *regs, int lineno, const char *fname);
111 void __set_invalid(struct bregs *regs, int lineno, const char *fname);
112 void __set_unimplemented(struct bregs *regs, int lineno, const char *fname);
113 void __set_code_invalid(struct bregs *regs, u32 linecode, const char *fname);
114 void __set_code_unimplemented(struct bregs *regs, u32 linecode
115 , const char *fname);
117 #endif // !__ASSEMBLY__