1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
|
/*
* machine.h: Intel CPU specific definitions
*
* Leendert van Doorn, leendert@watson.ibm.com
* Copyright (c) 2005, International Business Machines Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place - Suite 330, Boston, MA 02111-1307 USA.
*/
#ifndef __MACHINE_H__
#define __MACHINE_H__
/* the size of our stack (4KB) */
#define STACK_SIZE 8192
#define TSS_SELECTOR 0x08
#define CODE_SELECTOR 0x10
#define DATA_SELECTOR 0x18
#define CR0_PE (1 << 0)
#define CR0_EM (1 << 2)
#define CR0_TS (1 << 3)
#define CR0_NE (1 << 5)
#define CR0_PG (1 << 31)
#define CR4_VME (1 << 0)
#define CR4_PVI (1 << 1)
#define CR4_PSE (1 << 4)
#define CR4_PAE (1 << 5)
#define EFLAGS_ZF (1 << 6)
#define EFLAGS_TF (1 << 8)
#define EFLAGS_IF (1 << 9)
#define EFLAGS_DF (1 << 10)
#define EFLAGS_IOPL (3 << 12)
#define EFLAGS_VM ((1 << 17) | EFLAGS_IOPL)
#define EFLAGS_VIF (1 << 19)
#define EFLAGS_VIP (1 << 20)
#define LOG_PGSIZE 12 /* log2(page size) */
#define LOG_PDSIZE 22 /* log2(page directory size) */
/* Derived constants */
#define PGSIZE (1 << LOG_PGSIZE) /* page size */
#define PGMASK (~(PGSIZE - 1)) /* page mask */
#define LPGSIZE (1 << LOG_PDSIZE) /* large page size */
#define LPGMASK (~(LPGSIZE - 1)) /* large page mask */
#ifdef TEST
#define PTE_P (1 << 0) /* Present */
#define PTE_RW (1 << 1) /* Read/Write */
#define PTE_US (1 << 2) /* User/Supervisor */
#define PTE_PS (1 << 7) /* Page Size */
#endif
/* Programmable Interrupt Contoller (PIC) defines */
#define PIC_MASTER 0x20
#define PIC_SLAVE 0xA0
#define PIC_CMD 0 /* command */
#define PIC_ISR 0 /* interrupt status */
#define PIC_IMR 1 /* interrupt mask */
#ifndef __ASSEMBLY__
struct dtr {
unsigned short size;
unsigned long base __attribute__ ((packed));
};
struct tss {
unsigned short prev_link;
unsigned short _1;
unsigned long esp0;
unsigned short ss0;
unsigned short _2;
unsigned long esp1;
unsigned short ss1;
unsigned short _3;
unsigned long esp2;
unsigned short ss2;
unsigned short _4;
unsigned long cr3;
unsigned long eip;
unsigned long eflags;
unsigned long eax;
unsigned long ecx;
unsigned long edx;
unsigned long ebx;
unsigned long esi;
unsigned long edi;
unsigned long esp;
unsigned long ebp;
unsigned long es;
unsigned long cs;
unsigned long ss;
unsigned long ds;
unsigned long fs;
unsigned long gs;
unsigned short ldt_segment;
unsigned short _5;
unsigned short _6;
unsigned short iomap_base;
#ifdef ENABLE_VME
unsigned long int_redir[8];
#endif
unsigned char iomap[8192];
};
static inline void
outw(unsigned short addr, unsigned short val)
{
__asm__ __volatile__ ("outw %%ax, %%dx" :: "d"(addr), "a"(val));
}
static inline void
outb(unsigned short addr, unsigned char val)
{
__asm__ __volatile__ ("outb %%al, %%dx" :: "d"(addr), "a"(val));
}
static inline unsigned char
inb(unsigned short addr)
{
unsigned char val;
__asm__ __volatile__ ("inb %w1,%0" : "=a" (val) : "Nd" (addr));
return val;
}
static inline unsigned
get_cmos(int reg)
{
outb(0x70, reg);
return inb(0x71);
}
static inline unsigned
get_cr0(void)
{
unsigned rv;
__asm__ __volatile__("movl %%cr0, %0" : "=r"(rv));
return rv;
}
static inline void
set_cr0(unsigned value)
{
__asm__ __volatile__(
"movl %0, %%cr0\n"
"jmp 1f\n"
"1: nop\n"
: /* no outputs */
: "r"(value)
);
}
static inline unsigned
get_cr2(void)
{
unsigned rv;
__asm__ __volatile__("movl %%cr2, %0" : "=r"(rv));
return rv;
}
static inline unsigned
get_cr4(void)
{
unsigned rv;
__asm__ __volatile__("movl %%cr4, %0" : "=r"(rv));
return rv;
}
static inline void
set_cr3(unsigned addr)
{
__asm__ __volatile__("movl %0, %%cr3" : /* no outputs */ : "r"(addr));
}
static inline void
set_cr4(unsigned value)
{
__asm__ __volatile__("movl %0, %%cr4" : /* no outputs */ : "r"(value));
}
#ifdef TEST
static inline void
breakpoint(void)
{
outw(0x8A00, 0x8AE0);
}
#endif /* TEST */
#endif /* __ASSEMBLY__ */
#endif /* __MACHINE_H__ */
|