Date: Wed, 20 Jun 2012 11:30:16 +0000 (UTC) From: "Cherry G. Mathew" <cherry@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r237299 - in projects/amd64_xen_pv/sys/amd64: include xen Message-ID: <201206201130.q5KBUGAD039400@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: cherry Date: Wed Jun 20 11:30:15 2012 New Revision: 237299 URL: http://svn.freebsd.org/changeset/base/237299 Log: Add more Xen interface primitives to privileged ops (eg: cli, load_cr3 etc ) Approved by: gibbs (implicit) Modified: projects/amd64_xen_pv/sys/amd64/include/cpufunc.h projects/amd64_xen_pv/sys/amd64/xen/machdep.c projects/amd64_xen_pv/sys/amd64/xen/mm.c Modified: projects/amd64_xen_pv/sys/amd64/include/cpufunc.h ============================================================================== --- projects/amd64_xen_pv/sys/amd64/include/cpufunc.h Wed Jun 20 10:59:11 2012 (r237298) +++ projects/amd64_xen_pv/sys/amd64/include/cpufunc.h Wed Jun 20 11:30:15 2012 (r237299) @@ -46,9 +46,11 @@ #ifdef XEN extern void xen_cli(void); extern void xen_sti(void); -extern void xen_load_cr3(u_int data); +extern u_long xen_rcr2(void); +extern void xen_load_cr3(u_long data); extern void xen_tlb_flush(void); extern void xen_invlpg(vm_offset_t addr); +extern void write_rflags(u_long rflags); extern u_long read_rflags(void); #endif /* XEN */ @@ -118,7 +120,11 @@ clflush(u_long addr) static __inline void disable_intr(void) { +#ifdef XEN + xen_cli(); +#else __asm __volatile("cli" : : : "memory"); +#endif } static __inline void @@ -355,7 +361,11 @@ wbinvd(void) } static __inline void +#ifdef XEN +_write_rflags(u_long rf) +#else write_rflags(u_long rf) +#endif { __asm __volatile("pushq %0; popfq" : : "r" (rf)); } @@ -391,6 +401,9 @@ rcr2(void) { u_long data; +#ifdef XEN + return (xen_rcr2()); +#endif __asm __volatile("movq %%cr2,%0" : "=r" (data)); return (data); } @@ -398,8 +411,11 @@ rcr2(void) static __inline void load_cr3(u_long data) { - +#ifdef XEN + xen_load_cr3(data); +#else __asm __volatile("movq %0,%%cr3" : : "r" (data) : "memory"); +#endif } static __inline u_long @@ -443,8 +459,11 @@ invltlb(void) static __inline void invlpg(u_long addr) { - +#ifdef XEN + xen_invlpg(addr); +#else __asm __volatile("invlpg %0" : : "m" (*(char *)addr) : "memory"); +#endif } static __inline u_short Modified: projects/amd64_xen_pv/sys/amd64/xen/machdep.c ============================================================================== --- projects/amd64_xen_pv/sys/amd64/xen/machdep.c Wed Jun 20 10:59:11 2012 (r237298) +++ projects/amd64_xen_pv/sys/amd64/xen/machdep.c Wed Jun 20 11:30:15 2012 (r237299) @@ -367,7 +367,7 @@ initxen(struct start_info *si) if (si->mod_start != 0) { /* we have a ramdisk or kernel module */ preload_metadata = (caddr_t)(si->mod_start); - // preload_bootstrap_relocate(KERNBASE); XXX: not sure this is needed. + preload_bootstrap_relocate(KERNBASE); } kmdp = preload_search_by_type("elf kernel"); @@ -376,8 +376,7 @@ initxen(struct start_info *si) #ifdef notyet boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int); - kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *); // XXX: + - // KERNBASE; + kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *); #endif /* notyet */ #ifdef DDB @@ -446,8 +445,8 @@ initxen(struct start_info *si) init_param2(physmem); - //msgbufinit(msgbufp, msgbufsize); - //fpuinit(); + msgbufinit(msgbufp, msgbufsize); + //fpuinit(); XXX: TODO /* * Set up thread0 pcb after fpuinit calculated pcb + fpu save @@ -466,9 +465,6 @@ initxen(struct start_info *si) _ufssel = GSEL(GUFS32_SEL, SEL_UPL); _ugssel = GSEL(GUGS32_SEL, SEL_UPL); - /* console */ - printk("Hello world!\n"); - return (u_int64_t) thread0.td_pcb; } @@ -1053,19 +1049,30 @@ printk(const char *fmt, ...) static __inline void -cpu_write_rflags(u_int ef) +cpu_write_rflags(u_long rf) { - __asm __volatile("pushl %0; popfl" : : "r" (ef)); + __asm __volatile("pushq %0; popfq" : : "r" (rf)); } -static __inline u_int +static __inline u_long cpu_read_rflags(void) { - u_int ef; + u_long rf; + + __asm __volatile("pushfq; popq %0" : "=r" (rf)); + return (rf); +} + +#ifdef KTR +static __inline u_long +rrbp(void) +{ + u_long data; - __asm __volatile("pushfl; popl %0" : "=r" (ef)); - return (ef); + __asm __volatile("movq 4(%%rbp),%0" : "=r" (data)); + return (data); } +#endif u_long read_rflags(void) @@ -1082,6 +1089,17 @@ read_rflags(void) } void +write_rflags(u_long rflags) +{ + u_int intr; + + CTR2(KTR_SPARE2, "%x xen_restore_flags rflags %x", rrbp(), rflags); + intr = ((rflags & PSL_I) == 0); + __restore_flags(intr); + _write_rflags(rflags); +} + +void xen_cli(void) { CTR1(KTR_SPARE2, "%x xen_cli disabling interrupts", rrbp()); @@ -1095,6 +1113,13 @@ xen_sti(void) __sti(); } +u_long +xen_rcr2(void) +{ + + return (HYPERVISOR_shared_info->vcpu_info[curcpu].arch.cr2); +} + char *console_page; #include <machine/tss.h> struct amd64tss common_tss[MAXCPU]; Modified: projects/amd64_xen_pv/sys/amd64/xen/mm.c ============================================================================== --- projects/amd64_xen_pv/sys/amd64/xen/mm.c Wed Jun 20 10:59:11 2012 (r237298) +++ projects/amd64_xen_pv/sys/amd64/xen/mm.c Wed Jun 20 11:30:15 2012 (r237299) @@ -158,6 +158,12 @@ xen_invlpg(vm_offset_t va) PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } +inline void +xen_load_cr3(u_long val) +{ + xen_pt_switch(val); +} + void xen_pt_switch(vm_paddr_t kpml4phys) { @@ -195,8 +201,10 @@ _xen_queue_pt_update(vm_paddr_t ptr, vm_ { SET_VCPU(); +#ifdef revisit if (__predict_true(gdtset)) mtx_assert(&vm_page_queue_mtx, MA_OWNED); +#endif KASSERT((ptr & 7) == 0, ("misaligned update"));
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206201130.q5KBUGAD039400>