1 #ifndef ROMBIOS_COMPAT
2 #define ROMBIOS_COMPAT
3
4 /*
5 * Compatibility functions and structures for transitioning between
6 * 16 bit Bochs BIOS and 32 bit BIOS code.
7 */
8
9 #define ADDR_FROM_SEG_OFF(seg, off) (void *)((((uint32_t)(seg)) << 4) + (off))
10
11 #include <stdint.h>
12
13 typedef uint8_t Bit8u;
14 typedef uint16_t Bit16u;
15 typedef uint32_t Bit32u;
16
17 #define SetCF(x) (x)->u.r8.flagsl |= 0x01
18 #define SetZF(x) (x)->u.r8.flagsl |= 0x40
19 #define ClearCF(x) (x)->u.r8.flagsl &= 0xfe
20 #define ClearZF(x) (x)->u.r8.flagsl &= 0xbf
21 #define GetCF(x) ((x)->u.r8.flagsl & 0x01)
22
23 #define SET_CF() *FLAGS |= 0x0001
24 #define CLEAR_CF() *FLAGS &= 0xfffe
25 #define GET_CF() (*FLAGS & 0x0001)
26
27 #define SET_ZF() *FLAGS |= 0x0040
28 #define CLEAR_ZF() *FLAGS &= 0xffbf
29
30
31 typedef struct {
32 union {
33 struct {
34 Bit32u edi, esi, ebp, esp;
35 Bit32u ebx, edx, ecx, eax;
36 } r32;
37 struct {
38 Bit16u di, filler1, si, filler2, bp, filler3, sp, filler4;
39 Bit16u bx, filler5, dx, filler6, cx, filler7, ax, filler8;
40 } r16;
41 struct {
42 Bit32u filler[4];
43 Bit8u bl, bh;
44 Bit16u filler1;
45 Bit8u dl, dh;
46 Bit16u filler2;
47 Bit8u cl, ch;
48 Bit16u filler3;
49 Bit8u al, ah;
50 Bit16u filler4;
51 } r8;
52 } u;
53 } pushad_regs_t;
54
55
56
read_dword(Bit16u seg,Bit16u off)57 static inline Bit32u read_dword(Bit16u seg, Bit16u off)
58 {
59 uint32_t *addr = (uint32_t *)ADDR_FROM_SEG_OFF(seg,off);
60 return *addr;
61 }
62
read_word(Bit16u seg,Bit16u off)63 static inline Bit16u read_word(Bit16u seg, Bit16u off)
64 {
65 uint16_t *addr = (uint16_t *)ADDR_FROM_SEG_OFF(seg,off);
66 return *addr;
67 }
68
read_byte(Bit16u seg,Bit16u off)69 static inline Bit8u read_byte(Bit16u seg, Bit16u off)
70 {
71 uint8_t *addr = (uint8_t *)ADDR_FROM_SEG_OFF(seg,off);
72 return *addr;
73 }
74
write_dword(Bit16u seg,Bit16u off,Bit32u val)75 static inline void write_dword(Bit16u seg, Bit16u off, Bit32u val)
76 {
77 uint32_t *addr = (uint32_t *)ADDR_FROM_SEG_OFF(seg,off);
78 *addr = val;
79 }
80
write_word(Bit16u seg,Bit16u off,Bit16u val)81 static inline void write_word(Bit16u seg, Bit16u off, Bit16u val)
82 {
83 uint16_t *addr = (uint16_t *)ADDR_FROM_SEG_OFF(seg,off);
84 *addr = val;
85 }
86
write_byte(Bit16u seg,Bit16u off,Bit8u val)87 static inline void write_byte(Bit16u seg, Bit16u off, Bit8u val)
88 {
89 uint8_t *addr = (uint8_t *)ADDR_FROM_SEG_OFF(seg,off);
90 *addr = val;
91 }
92
93 #define X(idx, ret, fn, args...) ret fn (args);
94 #include "32bitprotos.h"
95 #undef X
96
97 #endif
98