+++ /dev/null
-/*
- * 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__ */
-