From 9521e26a164eb4689b34d82a5de0d998bdd4c4dc Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Fri, 4 Jul 2008 13:04:29 -0400 Subject: Extract 'struct bregs' out of biosvar.h; clean up header includes. --- src/bregs.h | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/bregs.h (limited to 'src/bregs.h') diff --git a/src/bregs.h b/src/bregs.h new file mode 100644 index 0000000..8da6c52 --- /dev/null +++ b/src/bregs.h @@ -0,0 +1,90 @@ +// Structure layout of cpu registers the the bios uses. +// +// Copyright (C) 2008 Kevin O'Connor +// +// This file may be distributed under the terms of the GNU GPLv3 license. + +#ifndef __BREGS_H +#define __BREGS_H + + +/**************************************************************** + * Registers saved/restored in romlayout.S + ****************************************************************/ + +#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; }; } + +// Layout of registers passed in to irq handlers. Note that this +// layout corresponds to code in romlayout.S - don't change it here +// without also updating the assembler code. +struct bregs { + u16 ds; + u16 es; + UREG(edi, di, di_hi, di_lo); + UREG(esi, si, si_hi, si_lo); + UREG(ebx, bx, bh, bl); + UREG(edx, dx, dh, dl); + UREG(ecx, cx, ch, cl); + UREG(eax, ax, ah, al); + u16 ip; + u16 cs; + u16 flags; +} PACKED; + + +/**************************************************************** + * Helper functions + ****************************************************************/ + +// bregs flags bitdefs +#define F_ZF (1<<6) +#define F_CF (1<<0) + +static inline void +set_cf(struct bregs *regs, int cond) +{ + if (cond) + regs->flags |= F_CF; + else + regs->flags &= ~F_CF; +} + +// Frequently used return codes +#define RET_EUNSUPPORTED 0x86 + +static inline void +set_success(struct bregs *regs) +{ + set_cf(regs, 0); +} + +static inline void +set_code_success(struct bregs *regs) +{ + regs->ah = 0; + set_cf(regs, 0); +} + +static inline void +set_fail_silent(struct bregs *regs) +{ + set_cf(regs, 1); +} + +static inline void +set_code_fail_silent(struct bregs *regs, u8 code) +{ + regs->ah = code; + set_cf(regs, 1); +} + +#define set_fail(regs) \ + __set_fail(__func__, (regs)) +#define set_code_fail(regs, code) \ + __set_code_fail(__func__, (regs), (code)) + +// util.c +void __set_fail(const char *fname, struct bregs *regs); +void __set_code_fail(const char *fname, struct bregs *regs, u8 code); + +#endif // bregs.h -- cgit v1.1