]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
inmates: Provide support for 32-bit inmates
authorJan Kiszka <jan.kiszka@siemens.com>
Wed, 30 Apr 2014 07:29:42 +0000 (09:29 +0200)
committerJan Kiszka <jan.kiszka@siemens.com>
Wed, 30 Apr 2014 08:03:37 +0000 (10:03 +0200)
Adjust the makefile and provide a 32-bit header for i386 inmates.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
inmates/Makefile
inmates/apic-demo.c
inmates/header-32.S [new file with mode: 0644]
inmates/header.S
inmates/inmate.h
inmates/inmate.lds

index abb26867ca7b3acca01b239fd0ef16be2494369d..98df5bfc88138567f681eb2db597ecb248454eaa 100644 (file)
@@ -26,8 +26,17 @@ LDFLAGS += -T
 
 
 ifeq ($(SRCARCH), x86)
+
 KBUILD_CFLAGS += -m64
+
 INMATES := tiny-demo.bin apic-demo.bin
+
+AFLAGS_header-32.o := -m32
+CFLAGS_printk-32.o := -m32
+
+$(obj)/printk-32.o: $(obj)/printk.c
+       $(call if_changed_rule,cc_o_c)
+
 endif
 
 tiny-demo-y := tiny-demo.o header.o printk.o pm-timer.o
index 48d62c135c4e7cd55461c45630e60f62b7cebf9d..292c30c67789bb6101e492da184c68ecc84a34b4 100644 (file)
@@ -112,7 +112,7 @@ static void init_apic(void)
        printk("Calibrated APIC frequency: %lu kHz\n",
               (apic_frequency * 16 + 500) / 1000);
 
-       idt[APIC_TIMER_VECTOR * 4] = (entry & 0xffff) | (INMATE_CS << 16);
+       idt[APIC_TIMER_VECTOR * 4] = (entry & 0xffff) | (INMATE_CS64 << 16);
        idt[APIC_TIMER_VECTOR * 4 + 1] = 0x8e00 | (entry & 0xffff0000);
        idt[APIC_TIMER_VECTOR * 4 + 2] = entry >> 32;
 
diff --git a/inmates/header-32.S b/inmates/header-32.S
new file mode 100644 (file)
index 0000000..56f0a20
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Jailhouse, a Linux-based partitioning hypervisor
+ *
+ * Copyright (c) Siemens AG, 2014
+ *
+ * Authors:
+ *  Jan Kiszka <jan.kiszka@siemens.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ */
+
+#include <inmate.h>
+
+#define X86_CR0_PE     0x00000001
+#define X86_CR0_WP     0x00010000
+#define X86_CR0_PG     0x80000000
+
+#define X86_CR4_PSE    0x00000010
+
+       .code16gcc
+       .section ".boot", "ax"
+
+       ljmp $0xf000,$start16
+
+
+       .section ".startup", "ax"
+
+start16:
+       cs,lgdtl gdt_ptr
+
+       mov %cr0,%eax
+       or $X86_CR0_PE,%al
+       mov %eax,%cr0
+
+       ljmpl $INMATE_CS32,$start32 + FSEGMENT_BASE
+
+
+       .code32
+start32:
+       mov %cr4,%eax
+       or $X86_CR4_PSE,%eax
+       mov %eax,%cr4
+
+       mov $loader_pdpt + FSEGMENT_BASE,%eax
+       mov %eax,%cr3
+
+       mov $(X86_CR0_PG | X86_CR0_WP | X86_CR0_PE),%eax
+       mov %eax,%cr0
+
+       mov $stack_top,%esp
+
+       mov $INMATE_DS32,%eax
+       mov %eax,%ds
+       mov %eax,%es
+       mov %eax,%ss
+
+       xor %eax,%eax
+       mov $bss_start,%edi
+       mov $bss_dwords,%ecx
+       rep stosl
+
+       mov $inmate_main,%eax
+       jmp *%eax
+
+
+       .align(16)
+       .global loader_gdt
+loader_gdt:
+       .quad   0
+       .quad   0x00cf9b000000ffff
+       .quad   0x00af9b000000ffff
+       .quad   0x00cf93000000ffff
+
+gdt_ptr:
+       .short  gdt_ptr - loader_gdt - 1
+       .long   loader_gdt + FSEGMENT_BASE
+
+       .align(4096)
+       .global loader_pdpt
+loader_pdpt:
+       .long   0x00000083
index 51067731b7b08914104a8a71221502c631417e45..8881ffb24cd161198624229fc0679be871ed101f 100644 (file)
@@ -36,7 +36,7 @@ start16:
        or $X86_CR0_PE,%al
        mov %eax,%cr0
 
-       ljmpl $LOADER_CS32,$start32 + FSEGMENT_BASE
+       ljmpl $INMATE_CS32,$start32 + FSEGMENT_BASE
 
 
        .code32
@@ -56,7 +56,7 @@ start32:
        mov $(X86_CR0_PG | X86_CR0_WP | X86_CR0_PE),%eax
        mov %eax,%cr0
 
-       ljmpl $INMATE_CS,$start64 + FSEGMENT_BASE
+       ljmpl $INMATE_CS64,$start64 + FSEGMENT_BASE
 
        .code64
 start64:
index 599bc5fd6092e8b94c18ac94307afc151974798d..4e9b08b2d5bacde4b1ff43802c84922681a73d94 100644 (file)
@@ -12,8 +12,9 @@
 
 #define FSEGMENT_BASE  0xf0000
 
-#define LOADER_CS32    0x8
-#define INMATE_CS      0x10
+#define INMATE_CS32    0x8
+#define INMATE_CS64    0x10
+#define INMATE_DS32    0x18
 
 #ifndef __ASSEMBLY__
 typedef signed char s8;
index 8ab694e96f9c78cfadab18cfb68b5dcae10e88ab..84d782d0d22c7af4c18afbd9271e3249159b303d 100644 (file)
@@ -30,6 +30,7 @@ SECTIONS
                *(.bss)
                . = ALIGN(8);
        }
+       bss_dwords = SIZEOF(.bss) / 4;
        bss_qwords = SIZEOF(.bss) / 8;
 
        . = 0xf0000 + SIZEOF(.startup);