[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [IA64][MINIOS] PKR support
# HG changeset patch # User Alex Williamson <alex.williamson@xxxxxx> # Date 1185840869 21600 # Node ID d69a57b29e3fa38a044010c12f366f15244e4257 # Parent 57f519c41534de7448f8029df96917ffd71f6334 [IA64][MINIOS] PKR support - adds optimization feature for region 7 identity mapping - adds protection keys to region 5 and region 7 addresses, may be used for testing the hypervisor protection key support Signed-off-by: Dietmar Hahn <dietmar.hahn@xxxxxxxxxxxxxxxxxxx> --- extras/mini-os/arch/ia64/common.c | 21 ++++++++++++++++++++- extras/mini-os/arch/ia64/ia64.S | 14 ++++++++++++-- extras/mini-os/arch/ia64/ivt.S | 4 ++-- extras/mini-os/include/ia64/hypercall-ia64.h | 10 ++++++++++ extras/mini-os/include/ia64/ia64_cpu.h | 2 +- extras/mini-os/include/ia64/page.h | 4 ++++ 6 files changed, 49 insertions(+), 6 deletions(-) diff -r 57f519c41534 -r d69a57b29e3f extras/mini-os/arch/ia64/common.c --- a/extras/mini-os/arch/ia64/common.c Mon Jul 30 16:51:52 2007 -0600 +++ b/extras/mini-os/arch/ia64/common.c Mon Jul 30 18:14:29 2007 -0600 @@ -103,7 +103,8 @@ map_pal_code(void) */ ia64_ptc_l(machineFwG.ia64_pal_base, PTE_PS_16K); ia64_write_itr_i(&pte, IA64_TR_PAL, - (uint64_t) machineFwG.ia64_pal_base, PTE_PS_16K, 0); + (uint64_t)machineFwG.ia64_pal_base, + PTE_PS_16K, IA64_KEY_REG7); xen_set_virtual_psr_ic(1); } @@ -180,6 +181,21 @@ init_boot_params(void) bootverbose = 1; } +static void +set_opt_feature(void) +{ + struct xen_ia64_opt_feature optf; + + optf.cmd = XEN_IA64_OPTF_IDENT_MAP_REG7; + optf.on = XEN_IA64_OPTF_ON; + optf.pgprot = ((1 << PTE_OFF_P) | (1 << PTE_OFF_A) | (1 << PTE_OFF_D) | + (PTE_MA_WB << PTE_OFF_MA) | + (PTE_PL_KERN << PTE_OFF_PL) | + (PTE_AR_RW << PTE_OFF_AR)); + optf.key = IA64_KEY_REG7; + HYPERVISOR_opt_feature(&optf); +} + void arch_init(start_info_t *si) { @@ -213,6 +229,9 @@ arch_init(start_info_t *si) printk("efi_get_time() failed\n"); registerCallback(); + + set_opt_feature(); + initialized = 1; } diff -r 57f519c41534 -r d69a57b29e3f extras/mini-os/arch/ia64/ia64.S --- a/extras/mini-os/arch/ia64/ia64.S Mon Jul 30 16:51:52 2007 -0600 +++ b/extras/mini-os/arch/ia64/ia64.S Mon Jul 30 18:14:29 2007 -0600 @@ -101,11 +101,21 @@ ENTRY(_start) ;; mov rr[r3]=r2 ;; - + /* + * Setup protection keys for region 5 and 7. + */ + mov r2=(IA64_KEY_REG5 << IA64_PKR_KEY) | IA64_PKR_VALID + mov r3=(IA64_KEY_REG7 << IA64_PKR_KEY) | IA64_PKR_VALID + mov r14=0x1 + ;; + mov pkr[r0]=r2 /* Region 5 */ + mov pkr[r14]=r3 /* Region 7 */ + ;; /* * Now pin mappings into the TLB for kernel text and data */ - mov r18=KERNEL_TR_PAGE_SIZE<<IA64_ITIR_PS + mov r18=(KERNEL_TR_PAGE_SIZE<<IA64_ITIR_PS)| \ + (IA64_KEY_REG5<<IA64_ITIR_KEY) movl r17=KERNEL_START ;; mov cr.itir=r18 diff -r 57f519c41534 -r d69a57b29e3f extras/mini-os/arch/ia64/ivt.S --- a/extras/mini-os/arch/ia64/ivt.S Mon Jul 30 16:51:52 2007 -0600 +++ b/extras/mini-os/arch/ia64/ivt.S Mon Jul 30 18:14:29 2007 -0600 @@ -249,7 +249,7 @@ ENTRY(save_tf_rse_switch) /* xen special handling for possibly lazy cover */ movl r8=XSI_PRECOVER_IFS; ;; - ld8 r21=[r8]; + ld8 r21=[r8] ;; #if defined(BIG_ENDIAN) // swap because mini-os is in BE mux1 r21=r21,@rev @@ -771,7 +771,7 @@ adt_reg7_addr: * addresses. Currently I don't do a check. */ movl r20=~((7 << IA64_RR_IDX_POS) | 0xfff) - movl r18=((PTE_PS_16K<<IA64_ITIR_PS)|(0<<IA64_ITIR_KEY)) + movl r18=((PTE_PS_16K<<IA64_ITIR_PS)|(IA64_KEY_REG7<<IA64_ITIR_KEY)) ;; movl r19= ((1<<PTE_OFF_P) | (PTE_MA_WB<<PTE_OFF_MA) | \ (1<<PTE_OFF_A) | (1<<PTE_OFF_D) | \ diff -r 57f519c41534 -r d69a57b29e3f extras/mini-os/include/ia64/hypercall-ia64.h --- a/extras/mini-os/include/ia64/hypercall-ia64.h Mon Jul 30 16:51:52 2007 -0600 +++ b/extras/mini-os/include/ia64/hypercall-ia64.h Mon Jul 30 18:14:29 2007 -0600 @@ -223,4 +223,14 @@ xencomm_arch_hypercall_grant_table_op(un int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count); +static inline int +HYPERVISOR_opt_feature(void *arg) +{ + struct xencomm_handle *new_arg; + + new_arg = xencomm_create_inline(arg); + + return _hypercall1(int, opt_feature, new_arg); +} + #endif /* __HYPERCALL_H__ */ diff -r 57f519c41534 -r d69a57b29e3f extras/mini-os/include/ia64/ia64_cpu.h --- a/extras/mini-os/include/ia64/ia64_cpu.h Mon Jul 30 16:51:52 2007 -0600 +++ b/extras/mini-os/include/ia64/ia64_cpu.h Mon Jul 30 18:14:29 2007 -0600 @@ -141,7 +141,7 @@ #define MOS_IA64_PSR_BE 0 #endif -#define STARTUP_PSR (IA64_PSR_IT | \ +#define STARTUP_PSR (IA64_PSR_IT | IA64_PSR_PK | \ IA64_PSR_DT | IA64_PSR_RT | MOS_IA64_PSR_BE | \ IA64_PSR_BN | IA64_PSR_CPL_KERN | IA64_PSR_AC) diff -r 57f519c41534 -r d69a57b29e3f extras/mini-os/include/ia64/page.h --- a/extras/mini-os/include/ia64/page.h Mon Jul 30 16:51:52 2007 -0600 +++ b/extras/mini-os/include/ia64/page.h Mon Jul 30 18:14:29 2007 -0600 @@ -99,6 +99,10 @@ extern paddr_t phys_avail[]; #define KERN_VIRT_2_PHYS(x) (((x) - KERNEL_START) + \ (1 << KERNEL_PHYS_START_SHIFT)) +/* Some protection keys for region 5 and 7 addresses. */ +#define IA64_KEY_REG7 0x234 /* Region 7 - identity mapped addresses */ +#define IA64_KEY_REG5 0x89a /* Region 5 - kernel addresses */ + // This is xen specific ! #define PAGE_SHIFT_XEN_16K 14 // For 16KB page size #define mfn_to_virt(mfn) ((void*)__va((mfn) << PAGE_SHIFT_XEN_16K)) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |