blob: e59a7f447d0ae3d149115937405a6ac63bbf4bdf [file] [log] [blame]
Kevin O'Connor9521e262008-07-04 13:04:29 -04001// Structure layout of cpu registers the the bios uses.
2//
3// Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
4//
Kevin O'Connorb1b7c2a2009-01-15 20:52:58 -05005// This file may be distributed under the terms of the GNU LGPLv3 license.
Kevin O'Connor9521e262008-07-04 13:04:29 -04006
7#ifndef __BREGS_H
8#define __BREGS_H
9
Kevin O'Connor3eac0092008-11-16 09:59:32 -050010// CPU flag bitdefs
Kevin O'Connor3eac0092008-11-16 09:59:32 -050011#define F_CF (1<<0)
Kevin O'Connor05600342009-01-02 13:10:58 -050012#define F_ZF (1<<6)
13#define F_IF (1<<9)
Kevin O'Connor65e63422008-07-19 14:12:32 -040014
Kevin O'Connor3eac0092008-11-16 09:59:32 -050015// 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__
Kevin O'Connor9521e262008-07-04 13:04:29 -040023
24/****************************************************************
25 * Registers saved/restored in romlayout.S
26 ****************************************************************/
27
Kevin O'Connor3eac0092008-11-16 09:59:32 -050028#include "types.h" // u16
29
Kevin O'Connor9521e262008-07-04 13:04:29 -040030#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; }; }
31
32// Layout of registers passed in to irq handlers. Note that this
33// layout corresponds to code in romlayout.S - don't change it here
34// without also updating the assembler code.
35struct bregs {
36 u16 ds;
37 u16 es;
38 UREG(edi, di, di_hi, di_lo);
39 UREG(esi, si, si_hi, si_lo);
Kevin O'Connor7da210c2009-05-16 23:57:08 -040040 UREG(ebp, bp, bp_hi, bp_lo);
Kevin O'Connor9521e262008-07-04 13:04:29 -040041 UREG(ebx, bx, bh, bl);
42 UREG(edx, dx, dh, dl);
43 UREG(ecx, cx, ch, cl);
44 UREG(eax, ax, ah, al);
45 u16 ip;
46 u16 cs;
47 u16 flags;
48} PACKED;
49
50
51/****************************************************************
52 * Helper functions
53 ****************************************************************/
54
Kevin O'Connor9521e262008-07-04 13:04:29 -040055static inline void
56set_cf(struct bregs *regs, int cond)
57{
58 if (cond)
59 regs->flags |= F_CF;
60 else
61 regs->flags &= ~F_CF;
62}
63
64// Frequently used return codes
65#define RET_EUNSUPPORTED 0x86
66
67static inline void
68set_success(struct bregs *regs)
69{
70 set_cf(regs, 0);
71}
72
73static inline void
74set_code_success(struct bregs *regs)
75{
76 regs->ah = 0;
77 set_cf(regs, 0);
78}
79
80static inline void
81set_fail_silent(struct bregs *regs)
82{
83 set_cf(regs, 1);
84}
85
86static inline void
87set_code_fail_silent(struct bregs *regs, u8 code)
88{
89 regs->ah = code;
90 set_cf(regs, 1);
91}
92
Kevin O'Connor05600342009-01-02 13:10:58 -050093#define set_fail(regs) \
94 __set_fail((regs), __LINE__, __func__)
95#define set_code_fail(regs, code) \
96 __set_code_fail((regs), (code) | (__LINE__ << 8), __func__)
Kevin O'Connor9521e262008-07-04 13:04:29 -040097
Kevin O'Connora68aeaf2008-07-07 21:37:10 -040098// output.c
Kevin O'Connor05600342009-01-02 13:10:58 -050099void __set_fail(struct bregs *regs, int lineno, const char *fname);
100void __set_code_fail(struct bregs *regs, u32 linecode, const char *fname);
Kevin O'Connor9521e262008-07-04 13:04:29 -0400101
Kevin O'Connor3eac0092008-11-16 09:59:32 -0500102#endif // !__ASSEMBLY__
103
Kevin O'Connor9521e262008-07-04 13:04:29 -0400104#endif // bregs.h