Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


imported SEABIOS source tree
[palacios.git] / bios / seabios / 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