/* * 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_CF (1 << 0) #define EFLAGS_PF (1 << 2) #define EFLAGS_AF (1 << 4) #define EFLAGS_ZF (1 << 6) #define EFLAGS_SF (1 << 7) #define EFLAGS_TF (1 << 8) #define EFLAGS_IF (1 << 9) #define EFLAGS_DF (1 << 10) #define EFLAGS_OF (1 << 11) #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 */ /* 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[8193]; }; 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)); } #endif /* __ASSEMBLY__ */ #endif /* __MACHINE_H__ */