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.


Ported palacios to Kbuild
[palacios.git] / bios / vmxassist / machine.h
diff --git a/bios/vmxassist/machine.h b/bios/vmxassist/machine.h
new file mode 100644 (file)
index 0000000..0ea2adf
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ * 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__ */
+