source: trunk/packages/xen-3.1/xen-3.1/tools/firmware/vmxassist/machine.h @ 34

Last change on this file since 34 was 34, checked in by hartmans, 18 years ago

Add xen and xen-common

File size: 4.5 KB
Line 
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
77struct dtr {
78        unsigned short  size;
79        unsigned long   base __attribute__ ((packed));
80};
81
82struct 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
121static inline void
122outw(unsigned short addr, unsigned short val)
123{
124        __asm__ __volatile__ ("outw %%ax, %%dx" :: "d"(addr), "a"(val));
125}
126
127static inline void
128outb(unsigned short addr, unsigned char val)
129{
130        __asm__ __volatile__ ("outb %%al, %%dx" :: "d"(addr), "a"(val));
131}
132
133static inline unsigned char
134inb(unsigned short addr)
135{
136        unsigned char val;
137
138        __asm__ __volatile__ ("inb %w1,%0" : "=a" (val) : "Nd" (addr));
139        return val;
140}
141
142static inline unsigned
143get_cmos(int reg)
144{
145        outb(0x70, reg);
146        return inb(0x71);
147}
148
149static inline unsigned
150get_cr0(void)
151{
152        unsigned rv;
153        __asm__ __volatile__("movl %%cr0, %0" : "=r"(rv));
154        return rv;
155}
156
157static inline void
158set_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
169static inline unsigned
170get_cr2(void)
171{
172        unsigned rv;
173
174        __asm__ __volatile__("movl %%cr2, %0" : "=r"(rv));
175        return rv;
176}
177
178static inline unsigned
179get_cr4(void)
180{
181        unsigned rv;
182        __asm__ __volatile__("movl %%cr4, %0" : "=r"(rv));
183        return rv;
184}
185
186static inline void
187set_cr3(unsigned addr)
188{
189        __asm__ __volatile__("movl %0, %%cr3" : /* no outputs */ : "r"(addr));
190}
191
192static inline void
193set_cr4(unsigned value)
194{
195        __asm__ __volatile__("movl %0, %%cr4" : /* no outputs */ : "r"(value));
196}
197
198#ifdef TEST
199static inline void
200breakpoint(void)
201{
202        outw(0x8A00, 0x8AE0);
203}
204#endif /* TEST */
205
206#endif /* __ASSEMBLY__ */
207
208#endif /* __MACHINE_H__ */
209
Note: See TracBrowser for help on using the repository browser.