aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware/vmxassist/machine.h
blob: 82fa12965dae40b38c84b214ac4a71c0c72711b8 (plain)
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
/*
 * 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 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__ */