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.


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