|
|
1.1 ! root 1: // Structure layout of cpu registers the the bios uses. ! 2: // ! 3: // Copyright (C) 2008 Kevin O'Connor <[email protected]> ! 4: // ! 5: // This file may be distributed under the terms of the GNU LGPLv3 license. ! 6: ! 7: #ifndef __BREGS_H ! 8: #define __BREGS_H ! 9: ! 10: // CPU flag bitdefs ! 11: #define F_CF (1<<0) ! 12: #define F_ZF (1<<6) ! 13: #define F_IF (1<<9) ! 14: ! 15: // CR0 flags ! 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 ! 20: ! 21: ! 22: #ifndef __ASSEMBLY__ ! 23: ! 24: #include "farptr.h" // struct segoff_s ! 25: ! 26: /**************************************************************** ! 27: * Registers saved/restored in romlayout.S ! 28: ****************************************************************/ ! 29: ! 30: #include "types.h" // u16 ! 31: ! 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; }; } ! 33: ! 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. ! 37: struct bregs { ! 38: u16 ds; ! 39: u16 es; ! 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); ! 47: struct segoff_s code; ! 48: u16 flags; ! 49: } PACKED; ! 50: ! 51: ! 52: /**************************************************************** ! 53: * Helper functions ! 54: ****************************************************************/ ! 55: ! 56: static inline void ! 57: set_cf(struct bregs *regs, int cond) ! 58: { ! 59: if (cond) ! 60: regs->flags |= F_CF; ! 61: else ! 62: regs->flags &= ~F_CF; ! 63: } ! 64: ! 65: // Frequently used return codes ! 66: #define RET_EUNSUPPORTED 0x86 ! 67: ! 68: static inline void ! 69: set_success(struct bregs *regs) ! 70: { ! 71: set_cf(regs, 0); ! 72: } ! 73: ! 74: static inline void ! 75: set_code_success(struct bregs *regs) ! 76: { ! 77: regs->ah = 0; ! 78: set_cf(regs, 0); ! 79: } ! 80: ! 81: static inline void ! 82: set_invalid_silent(struct bregs *regs) ! 83: { ! 84: set_cf(regs, 1); ! 85: } ! 86: ! 87: static inline void ! 88: set_code_invalid_silent(struct bregs *regs, u8 code) ! 89: { ! 90: regs->ah = code; ! 91: set_cf(regs, 1); ! 92: } ! 93: ! 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__) ! 100: ! 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__) ! 107: ! 108: // output.c ! 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); ! 116: ! 117: #endif // !__ASSEMBLY__ ! 118: ! 119: #endif // bregs.h
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.