socsvn commit: r287552 - in soc2015/mihai/bhyve-on-arm-head/sys: arm/vmm modules/vmm-arm
mihai at FreeBSD.org
mihai at FreeBSD.org
Wed Jun 24 21:55:55 UTC 2015
Author: mihai
Date: Wed Jun 24 21:55:52 2015
New Revision: 287552
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=287552
Log:
soc2015: mihai: bhyve-on-arm-head: sys: arm: vmm: complete initialization part
Added:
soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S
Deleted:
soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/init.S
Modified:
soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c
soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.h
soc2015/mihai/bhyve-on-arm-head/sys/modules/vmm-arm/Makefile
Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c Wed Jun 24 20:51:48 2015 (r287551)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c Wed Jun 24 21:55:52 2015 (r287552)
@@ -21,29 +21,69 @@
lpae_pd_entry_t hyp_l1pd[2 * LPAE_L1_ENTRIES];
extern void _hypervisor_stub_trap(void *vect_addr);
-char *stack = NULL;
+extern void* _init_hyp_vector;
+
+char *stack;
+char *hyp_code;
static int
arm_init(int ipinum)
{
- char *stack_top, *hyp_code;
+ char *stack_top;
+ size_t hyp_code_size;
+ uint64_t *phys_hyp_l1pd;
stack = malloc(PAGE_SIZE, M_HYP);
stack_top = stack + PAGE_SIZE;
- lpae_vmmmap_set(NULL, stack, ptophys(stack), PAGE_SIZE, VM_PROT_READ | VM_PROT_WRITE);
+ lpae_vmmmap_set(NULL, stack, ptophys(stack), PAGE_SIZE,
+ VM_PROT_READ | VM_PROT_WRITE);
+
+ /*
+ * Allocate a PAGE for the HYP code to be sure it's PAGE_SIZE
+ * aligned and doesn't cross a page boundary.
+ */
+ hyp_code_size = _hyp_code_stop - _hyp_code_start;
+ hyp_code_size = (hyp_code_size + PAGE_SIZE) & PAGE_SIZE;
+ hyp_code = contigmalloc(hyp_code_size, M_HYP, 0, 0x0,
+ 0xffffffff, PAGE_SIZE, 0);
+ memcpy(hyp_code, _hyp_code_start, hyp_code_size);
- /* Allocate a PAGE for the HYP code to be sure it's PAGE_SIZE aligned and doesn't cross a page boundary */
- hyp_code = malloc(PAGE_SIZE, M_HYP);
- memcpy(hyp_code, _hyp_code_start, _hyp_code_stop - _hyp_code_start);
+ printf("%s hyp_code_size: %p, _hyp_code_start: %p, hyp_code: %p\n", __func__, (void*) _hyp_code_start, (void*) hyp_code);
/* Create two mappings:
* - one identity - VA == PA
- * - one normal mappings to HYP pagetable */
- lpae_vmmmap_set(NULL, hyp_code, ptophys(hyp_code), PAGE_SIZE, VM_PROT_READ | VM_PROT_WRITE);
- lpae_vmmmap_set(NULL, ptophys(hyp_code), ptophys(hyp_code), PAGE_SIZE, VM_PROT_READ | VM_PROT_WRITE);
+ * - one normal mappings to HYP pagetable
+ */
+ lpae_vmmmap_set(NULL, hyp_code, ptophys(hyp_code), hyp_code_size,
+ VM_PROT_READ | VM_PROT_WRITE);
+ lpae_vmmmap_set(NULL, ptophys(hyp_code), ptophys(hyp_code), hyp_code_size,
+ VM_PROT_READ | VM_PROT_WRITE);
+
+ /*
+ * Flush all caches to be sure we have the
+ * code and tables in physical memory
+ */
+ cpu_idcache_wbinv_all();
+ cpu_l2cache_wbinv_all();
+
+ /*
+ * Install the temporary vector from which
+ * will do the initialization part of VMM
+ */
+ _hypervisor_stub_trap(vtophys(_init_hyp_vector));
+
+ /*
+ * Special init call to activate the MMU
+ * and change the exception vector.
+ * - r0 - first parameter unused
+ * - r1 - stack pointer
+ * - r2 - lower 32 bits for the HTTBR
+ * - r3 - upper 32 bits for the HTTBR
+ */
+ phys_hyp_l1pd = vtophys(&hyp_l1pd[0]);
+ vmm_call_hyp(NULL, stack_top, LOW(phys_hyp_l1pd), HIGH(phys_hyp_l1pd);
- vmm_call_hyp(NULL, stack_top, &hyp_l1pd[0], &hyp_l1pd[0]);
return 0;
}
Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.h
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.h Wed Jun 24 20:51:48 2015 (r287551)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.h Wed Jun 24 21:55:52 2015 (r287552)
@@ -7,3 +7,5 @@
uint64_t vmm_call_hyp(void *hyp_func_addr, ...);
+#define HIGH(x) (x >> 32)
+#define LOW(x) (x & ((1 << 32) - 1))
Added: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S Wed Jun 24 21:55:52 2015 (r287552)
@@ -0,0 +1,134 @@
+#include "assym.s"
+#include <sys/syscall.h>
+#include <machine/asm.h>
+#include <machine/asmacros.h>
+#include <machine/armreg.h>
+#include <machine/sysreg.h>
+#include <machine/cpuconf.h>
+
+#define SYS_WRITE0 4
+
+.text
+ .globl _hyp_code_start
+ .globl _hyp_code_end
+ .globl _hyp_vector
+ .globl _init_hyp_vector
+
+_hyp_code_start:
+
+__semi_call:
+ svc 0x123456
+ mov pc, lr
+
+ASENTRY_NP(kvm_call_hyp)
+ hvc #0
+ bx lr
+END(kvm_call_hyp)
+
+ .align 5
+_init_hyp_vector:
+ .word 0 /* Reset */
+ .word 0 /* undev */
+ .word 0 /* SVC */
+ .word 0 /* PABT */
+ .word 0 /* DABT */
+ b hyp_init_hvc /* HYP-Mode */
+ .word 0 /* FIQ */
+ .word 0 /* IRQ */
+
+hyp_init_hvc:
+ mov sp, r1 /* r1 contains the stack pointer */
+
+ /* Find the offset between the two vectors */
+ adr r0, _init_hyp_vector
+ adr r1, _hyp_vector
+ sub r1, r1, r0
+
+ mrc p15, 4, r0, c12, c0, 0 @ get current HVBAR
+ add r0, r0, r1 @ find the address of the _hyp_vector
+ mcr p15, 4, r0, c12, c0, 0 @ set HVBAR to the new vector
+
+ mcrr p15, 4, r2, r3, c2 @ set the HTTBR (r2 is the low word, r3 is the low word)
+ isb
+
+ @ Flush the TLB of this page
+ adr r1, _hyp_code_start
+ mcr p15, 4, r0, c8, c7, 0 @ TLBIALLH
+ dsb ish
+
+ eret
+
+ .align 5
+_hyp_vector:
+ b hyp_reset /* Reset */
+ b hyp_undef /* undef */
+ b hyp_svc /* SVC */
+ b hyp_pabt /* PABT */
+ b hyp_dabt /* DABT */
+ b hyp_hvc /* HYP-Mode */
+ b hyp_fiq /* FIQ */
+ b hyp_irq /* IRQ */
+
+ .align
+hyp_reset:
+ b loop
+
+ .align
+hyp_undef:
+ mov r0, #SYS_WRITE0
+ adr r1, und_die_str
+ bl __semi_call
+ mrs r0, ELR_hyp
+ b loop
+
+ .align
+hyp_svc:
+ mov r0, #SYS_WRITE0
+ adr r1, svc_die_str
+ bl __semi_call
+ mrs r0, ELR_hyp
+ b loop
+ .align
+
+hyp_pabt:
+ mov r0, #SYS_WRITE0
+ adr r1, pabt_die_str
+ bl __semi_call
+ mrs r0, ELR_hyp
+ mrc p15, 4, r1, c5, c2, 0 @ HSR (syndrome register)
+ mrc p15, 4, r2, c6, c0, 2 @ HIFAR (hyp instruction fault address)
+ b loop
+
+ .align
+hyp_dabt:
+ mov r0, #SYS_WRITE0
+ adr r1, dabt_die_str
+ bl __semi_call
+ mrs r0, ELR_hyp
+ mrc p15, 4, r1, c5, c2, 0 @ HSR (syndrome register)
+ mrc p15, 4, r2, c6, c0, 0 @ HDFAR (hyp data fault address)
+ b loop
+
+ .align
+hyp_hvc:
+
+ .align
+hyp_fiq:
+ b loop
+ .align
+hyp_irq:
+ b loop
+ .align
+loop:
+ b loop
+
+und_die_str:
+ .ascii "unexpected undefined exception in Hyp mode at r0: %#08x\n"
+pabt_die_str:
+ .ascii "unexpected prefetch abort in Hyp mode at r0: %#08x\n"
+dabt_die_str:
+ .ascii "unexpected data abort in Hyp mode at r0: %#08x\n"
+svc_die_str:
+ .ascii "unexpected HVC/SVC trap in Hyp mode at r0: %#08x\n"
+
+_hyp_code_end:
Modified: soc2015/mihai/bhyve-on-arm-head/sys/modules/vmm-arm/Makefile
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/modules/vmm-arm/Makefile Wed Jun 24 20:51:48 2015 (r287551)
+++ soc2015/mihai/bhyve-on-arm-head/sys/modules/vmm-arm/Makefile Wed Jun 24 21:55:52 2015 (r287552)
@@ -11,7 +11,7 @@
vmm_dev.c \
mmu.c \
vmm_stat.c \
- init.S
+ hyp.S
.include <bsd.kmod.mk>
More information about the svn-soc-all
mailing list