Adjust the makefile and provide a 32-bit header for i386 inmates.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
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
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;
--- /dev/null
+/*
+ * 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
or $X86_CR0_PE,%al
mov %eax,%cr0
- ljmpl $LOADER_CS32,$start32 + FSEGMENT_BASE
+ ljmpl $INMATE_CS32,$start32 + FSEGMENT_BASE
.code32
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:
#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;
*(.bss)
. = ALIGN(8);
}
+ bss_dwords = SIZEOF(.bss) / 4;
bss_qwords = SIZEOF(.bss) / 8;
. = 0xf0000 + SIZEOF(.startup);