Date: Tue, 5 Jun 2012 09:49:31 +0000 (UTC) From: "Cherry G. Mathew" <cherry@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r236603 - projects/amd64_xen_pv/sys/amd64/xen Message-ID: <201206050949.q559nV63002787@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: cherry Date: Tue Jun 5 09:49:31 2012 New Revision: 236603 URL: http://svn.freebsd.org/changeset/base/236603 Log: Enable the event channel callback code. Events are now routed via the xen/evtchn/evtchn.c:evtchn_do_upcall() callback. Also initialise the "failsafe" callback. Approved by: gibbs (implicit) Modified: projects/amd64_xen_pv/sys/amd64/xen/exception.S projects/amd64_xen_pv/sys/amd64/xen/machdep.c Modified: projects/amd64_xen_pv/sys/amd64/xen/exception.S ============================================================================== --- projects/amd64_xen_pv/sys/amd64/xen/exception.S Tue Jun 5 09:45:42 2012 (r236602) +++ projects/amd64_xen_pv/sys/amd64/xen/exception.S Tue Jun 5 09:49:31 2012 (r236603) @@ -40,6 +40,8 @@ #include "assym.s" +#define T_EVENT T_RESERVED /* XXX: */ + /* * We're guaranteed that sizeof(struct vcpu_info) == 64 bytes. * log2(64) == 6; @@ -143,6 +145,11 @@ movq %rsp, %rdi ; \ call trap +#define EVENT_UPCALL \ + cld ; \ + movq %rsp, %rdi ; \ + call evtchn_do_upcall + #define DO_AST_MAYBE \ testb $SEL_RPL_MASK, TF_CS(%rsp) /* are we returning to user mode? */ ; \ jz 2f /* can't handle ASTs now if not */ ; \ @@ -473,3 +480,20 @@ ENTRY(fork_trampoline) INTR_EXIT ; /* XXX: more work required - %rsp offset calc etc. */ +IDTVEC(hypervisor_callback) /* Xen only */ + TRAP_FRAME_ENTER_NOERR ; + TRAP_PROLOGUE(T_EVENT) ; + SAVE_SEGMENT_REGS ; + SAVE_GENERAL_REGS ; + DO_STI_MAYBE ; + EVENT_UPCALL ; + DO_AST_MAYBE ; + RESTORE_GENERAL_REGS ; + RESTORE_SEGMENT_REGS ; + TRAP_FRAME_EXIT_NOERR ; + INTR_EXIT ; + +ENTRY(failsafe_callback) + movq msgfailsafe, %rdi ; + call panic ; /* panic("..."); */ +msgfailsafe: .asciz "Failsafe upcall triggered\n" Modified: projects/amd64_xen_pv/sys/amd64/xen/machdep.c ============================================================================== --- projects/amd64_xen_pv/sys/amd64/xen/machdep.c Tue Jun 5 09:45:42 2012 (r236602) +++ projects/amd64_xen_pv/sys/amd64/xen/machdep.c Tue Jun 5 09:49:31 2012 (r236603) @@ -104,7 +104,7 @@ xen_pfn_t *xen_phys_machine; #define PHYSMAP_SIZE (2 * VM_PHYSSEG_MAX) vm_offset_t pa_index = 0; vm_paddr_t phys_avail[PHYSMAP_SIZE + 2]; -vm_paddr_t dump_avail[0]; /* XXX: todo */ +vm_paddr_t dump_avail[2] = {0, 0}; /* XXX: todo */ struct pcpu __pcpu[MAXCPU]; @@ -114,6 +114,10 @@ __aligned(PAGE_SIZE); /* vcpu0 global de struct mtx icu_lock; struct mtx dt_lock; /* lock for GDT and LDT */ /* XXX : please review its use */ +/* Event callback prototypes */ +void Xhypervisor_callback(void); +void failsafe_callback(void); + vm_paddr_t initxen(struct start_info *); extern void identify_cpu(void); @@ -255,6 +259,25 @@ init_exception_table(void) } +static void init_event_callbacks(void) +{ + struct callback_register event = { + .type = CALLBACKTYPE_event, + .address = (unsigned long)Xhypervisor_callback + }; + + struct callback_register failsafe = { + .type = CALLBACKTYPE_failsafe, + .address = (unsigned long)failsafe_callback + }; + + PANIC_IF(HYPERVISOR_callback_op(CALLBACKOP_register, &event)); + + PANIC_IF(HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe)); + + /* XXX: syscall */ +} + #define XEN_CPUID_LEAF_HYPERCALL XEN_CPUID_LEAF(3 - 1) void xen_set_hypercall_page(vm_paddr_t); @@ -406,6 +429,9 @@ initxen(struct start_info *si) /* exception handling */ init_exception_table(); + /* Event handling */ + init_event_callbacks(); + identify_cpu(); /* Final stage of CPU initialization */ //msgbufinit(msgbufp, msgbufsize);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206050949.q559nV63002787>