f026fa81e513faa70c342c2997149a390ec33c1e
[seabios.git] / src / bregs.h
1 // Structure layout of cpu registers the the bios uses.
2 //
3 // Copyright (C) 2008  Kevin O'Connor <kevin@koconnor.net>
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, di8u, di8l);
41     UREG(esi, si, si8u, si8l);
42     UREG(ebp, bp, bp8u, bp8l);
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 #endif // !__ASSEMBLY__
95
96 #endif // bregs.h