diff options
-rw-r--r-- | .hgtags | 2 | ||||
-rw-r--r-- | .rootkeys | 4 | ||||
-rw-r--r-- | docs/misc/XenDebugger-HOWTO | 304 | ||||
-rw-r--r-- | linux-2.6.11-xen-sparse/arch/xen/kernel/evtchn.c | 2 | ||||
-rw-r--r-- | linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/entry.S | 77 | ||||
-rw-r--r-- | linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup.c | 31 | ||||
-rw-r--r-- | patches/linux-2.6.11/linux-2.6.11.12.patch (renamed from patches/linux-2.6.11/linux-2.6.11.11.patch) | 279 | ||||
-rw-r--r-- | tools/debugger/pdb/readme | 84 | ||||
-rw-r--r-- | tools/examples/xmexample.vmx | 4 | ||||
-rw-r--r-- | tools/firmware/vmxassist/Makefile | 14 | ||||
-rw-r--r-- | tools/firmware/vmxassist/head.S | 3 | ||||
-rw-r--r-- | tools/firmware/vmxassist/trap.S | 3 | ||||
-rw-r--r-- | tools/python/xen/lowlevel/xs/xs.c | 6 | ||||
-rw-r--r-- | tools/python/xen/lowlevel/xu/xu.c | 2 | ||||
-rw-r--r-- | tools/xcs/xcs_proto.h | 2 | ||||
-rw-r--r-- | xen/arch/x86/mm.c | 2 | ||||
-rw-r--r-- | xen/arch/x86/x86_32/entry.S | 20 | ||||
-rw-r--r-- | xen/arch/x86/x86_32/seg_fixup.c | 45 | ||||
-rw-r--r-- | xen/arch/x86/x86_64/entry.S | 4 | ||||
-rw-r--r-- | xen/drivers/char/serial.c | 4 | ||||
-rw-r--r-- | xen/include/asm-x86/page.h | 1 |
21 files changed, 459 insertions, 434 deletions
@@ -6,7 +6,7 @@ fb875591fd72e15c31879c0e9034d99b80225595 RELEASE-2.0.4 1a522944f76540ea9d73fcc1b0d13d0f670183f0 RELEASE-2.0.5 2a5814ad2e5634a5fa291b703a152e7fc0b4faf0 RELEASE-2.0.6 487b2ee37d1cecb5f3e7a546b05ad097a0226f2f beta1 -1f84d0497a5901b9f8d1a051b87871d140b7e23f ia64-stable +da92dcde82ea3a765c16231da72454c2edcf6bbb ia64-stable 3d330e41f41ce1bc118c02346e18949ad5d67f6b latest-semistable 30c521db4c71960b0cf1d9c9e1b658e77b535a3e latest-stable 9afec5bc14aeb197ef37ea54a57eacd427463fc3 semistable @@ -17,7 +17,6 @@ 3f9e7d60PWZJeVh5xdnk0nLUdxlqEA docs/figs/xenlogo.eps 418a3248xjIqmNKo0v_XQSfAvlBGFw docs/html.sty 41c0c4116itF389v0CEWcmzue6zJkA docs/misc/VMX_changes.txt -4022a73cgxX1ryj1HgS-IwwB6NUi2A docs/misc/XenDebugger-HOWTO 412f4bd9sm5mCQ8BkrgKcAKZGadq7Q docs/misc/blkif-drivers-explained.txt 420b949cy9ZGzED74Fz_DaWlK7tT4g docs/misc/crashdb.txt 4251a1f82AexscYEiF4Iku8Gc_kWfQ docs/misc/grant-tables.txt @@ -468,7 +467,7 @@ 413aa1d0oNP8HXLvfPuMe6cSroUfSA patches/linux-2.6.11/agpgart.patch 427261074Iy1MkbbqIV6zdZDWWx_Jg patches/linux-2.6.11/i386-cpu-hotplug-updated-for-mm.patch 42372652KCUP-IOH9RN19YQmGhs4aA patches/linux-2.6.11/iomap.patch -428359d4b3fDYtazwXi4UUmSWaOUew patches/linux-2.6.11/linux-2.6.11.11.patch +428359d4b3fDYtazwXi4UUmSWaOUew patches/linux-2.6.11/linux-2.6.11.12.patch 4296fb998LGSWCcljGKbOCUv3h9uRQ patches/linux-2.6.11/net-csum.patch 429ae875I9ZrqrRDjGD34IC2kzDREw patches/linux-2.6.11/rcu-nohz.patch 429ba3007184K-y6WHQ6KgY65-lEIQ patches/linux-2.6.11/udp-frag.patch @@ -542,6 +541,7 @@ 42a0c8dasiso9c-2sCvHBzP6YVjATA tools/debugger/pdb/evtchn.mli 42a0c8daXD_6Y62A_u5-PO_Klrhi0w tools/debugger/pdb/pdb_caml_xc.c 42a0c8danJXun9ay5SPBhhkKvuUPfg tools/debugger/pdb/pdb_xen.c +42b03d06llc_GE7fXGQ6-rYR4VFAcw tools/debugger/pdb/readme 42a0c8dbjK6Du89D2SUcxsuAdlUu3w tools/debugger/pdb/server.ml 401d7e160vaxMBAUSLSicuZ7AQjJ3w tools/examples/Makefile 401d7e16UgeqroJQTIhwkrDVkoWgZQ tools/examples/README diff --git a/docs/misc/XenDebugger-HOWTO b/docs/misc/XenDebugger-HOWTO deleted file mode 100644 index f4d2998b1a..0000000000 --- a/docs/misc/XenDebugger-HOWTO +++ /dev/null @@ -1,304 +0,0 @@ -Pervasive Debugging -=================== - -Alex Ho (alex.ho at cl.cam.ac.uk) - -Introduction ------------- - -The pervasive debugging project is leveraging Xen to -debug distributed systems. We have added a gdb stub -to Xen to allow for remote debugging of both Xen and -guest operating systems. More information about the -pervasive debugger is available at: http://www.cl.cam.ac.uk/netos/pdb - - -Implementation --------------- - -The gdb stub communicates with gdb running over a serial line. -The main entry point is pdb_handle_exception() which is invoked -from: pdb_key_pressed() ('D' on the console) - do_int3_exception() (interrupt 3: breakpoint exception) - do_debug() (interrupt 1: debug exception) - -This accepts characters from the serial port and passes gdb -commands to pdb_process_command() which implements the gdb stub -interface. This file draws heavily from the kgdb project and -sample gdbstub provided with gdb. - -The stub can examine registers, single step and continue, and -read and write memory (in Xen, a domain, or a Linux process' -address space). The debugger does not currently trace the -current process, so all bets are off if context switch occurs -in the domain. - - -Setup ------ - - +-------+ telnet +-----------+ serial +-------+ - | GDB |--------| nsplitd |--------| Xen | - +-------+ +-----------+ +-------+ - -To run pdb, Xen must be appropriately configured and -a suitable serial interface attached to the target machine. -GDB and nsplitd can run on the same machine. - -Xen Configuration - - Add the "pdb=xxx" option to your Xen boot command line - where xxx is one of the following values: - com1 gdb stub should communicate on com1 - com1H gdb stub should communicate on com1 (with high bit set) - com2 gdb stub should communicate on com2 - com2H gdb stub should communicate on com2 (with high bit set) - - Symbolic debugging infomration is quite helpful too: - xeno.bk/xen/arch/x86/Rules.mk - add -g to CFLAGS to compile Xen with symbols - xeno.bk/linux-2.4.27-xen-sparse/arch/xen/Makefile - add -g to CFLAGS to compile Linux with symbols - - You may also want to consider dedicating a register to the - frame pointer (disable the -fomit-frame-pointer compile flag). - - When booting Xen and domain 0, look for the console text - "pdb: pervasive debugger" just before DOM0 starts up. - -Serial Port Configuration - - pdb expects to communicate with gdb using the serial port. Since - this port is often shared with the machine's console output, pdb can - discriminate its communication by setting the high bit of each byte. - - A new tool has been added to the source tree which splits - the serial output from a remote machine into two streams: - one stream (without the high bit) is the console and - one stream (with the high bit stripped) is the pdb communication. - - See: xeno.bk/tools/misc/nsplitd - - nsplitd configuration - --------------------- - hostname$ more /etc/xinetd.d/nsplit - service nsplit1 - { - socket_type = stream - protocol = tcp - wait = no - user = wanda - server = /usr/sbin/in.nsplitd - server_args = serial.cl.cam.ac.uk:wcons00 - disable = no - only_from = 128.232.0.0/17 127.0.0.1 - } - - hostname$ egrep 'wcons00|nsplit1' /etc/services - wcons00 9600/tcp # Wanda remote console - nsplit1 12010/tcp # Nemesis console splitter ports. - - Note: nsplitd was originally written for the Nemesis project - at Cambridge. - - After nsplitd accepts a connection on <port> (12010 in the above - example), it starts listening on port <port + 1>. Characters sent - to the <port + 1> will have the high bit set and vice versa for - characters received. - - You can connect to the nsplitd using - 'tools/misc/xencons <host> <port>' - -GDB 6.0 - pdb has been tested with gdb 6.0. It should also work with - earlier versions. - - -Usage ------ - -1. Boot Xen and Linux -2. Interrupt Xen by pressing 'D' at the console - You should see the console message: - (XEN) pdb_handle_exception [0x88][0x101000:0xfc5e72ac] - At this point Xen is frozen and the pdb stub is waiting for gdb commands - on the serial line. -3. Attach with gdb - (gdb) file xeno.bk/xen/xen - Reading symbols from xeno.bk/xen/xen...done. - (gdb) target remote <hostname>:<port + 1> /* contact nsplitd */ - Remote debugging using serial.srg:12131 - continue_cpu_idle_loop () at current.h:10 - warning: shared library handler failed to enable breakpoint - (gdb) break __enter_scheduler - Breakpoint 1 at 0xfc510a94: file schedule.c, line 330. - (gdb) cont - Continuing. - - Program received signal SIGTRAP, Trace/breakpoint trap. - __enter_scheduler () at schedule.c:330 - (gdb) step - (gdb) step - (gdb) print next /* the variable prev has been optimized away! */ - $1 = (struct task_struct *) 0x0 - (gdb) delete - Delete all breakpoints? (y or n) y -4. You can add additional symbols to gdb - (gdb) add-sym xeno.bk/linux-2.4.27-xen0/vmlinux - add symbol table from file "xeno.bk/linux-2.4.27-xen0/vmlinux" at - (y or n) y - Reading symbols from xeno.bk/linux-2.4.27-xen0/vmlinux...done. - (gdb) x/s cpu_vendor_names[0] - 0xc01530d2 <cpdext+62898>: "Intel" - (gdb) break free_uid - Breakpoint 2 at 0xc0012250 - (gdb) cont - Continuing. /* run a command in domain 0 */ - - Program received signal SIGTRAP, Trace/breakpoint trap. - free_uid (up=0xbffff738) at user.c:77 - - (gdb) print *up - $2 = {__count = {counter = 0}, processes = {counter = 135190120}, files = { - counter = 0}, next = 0x395, pprev = 0xbffff878, uid = 134701041} - (gdb) finish - Run till exit from #0 free_uid (up=0xbffff738) at user.c:77 - - Program received signal SIGTRAP, Trace/breakpoint trap. - release_task (p=0xc2da0000) at exit.c:51 - (gdb) print *p - $3 = {state = 4, flags = 4, sigpending = 0, addr_limit = {seg = 3221225472}, - exec_domain = 0xc016a040, need_resched = 0, ptrace = 0, lock_depth = -1, - counter = 1, nice = 0, policy = 0, mm = 0x0, processor = 0, - cpus_runnable = 1, cpus_allowed = 4294967295, run_list = {next = 0x0, - prev = 0x0}, sleep_time = 18995, next_task = 0xc017c000, - prev_task = 0xc2f94000, active_mm = 0x0, local_pages = {next = 0xc2da0054, - prev = 0xc2da0054}, allocation_order = 0, nr_local_pages = 0, - ... -5. To resume Xen, enter the "continue" command to gdb. - This sends the packet $c#63 along the serial channel. - - (gdb) cont - Continuing. - -Debugging Multiple Domains & Processes --------------------------------------- - -pdb supports debugging multiple domains & processes. You can switch -between different domains and processes within domains and examine -variables in each. - -The pdb context identifies the current debug target. It is stored -in the xen variable pdb_ctx and defaults to xen. - - target pdb_ctx.domain pdb_ctx.process - ------ -------------- --------------- - xen -1 -1 - guest os 0,1,2,... -1 - process 0,1,2,... 0,1,2,... - -Unfortunately, gdb doesn't understand debugging multiple process -simultaneously (we're working on it), so at present you are limited -to just one set of symbols for symbolic debugging. When debugging -processes, pdb currently supports just Linux 2.4. - - define setup - file xeno-clone/xeno.bk/xen/xen - add-sym xeno-clone/xeno.bk/linux-2.4.27-xen0/vmlinux - add-sym ~ach61/a.out - end - - -1. Connect with gdb as before. A couple of Linux-specific - symbols need to be defined. - - (gdb) target remote <hostname>:<port + 1> /* contact nsplitd */ - Remote debugging using serial.srg:12131 - continue_cpu_idle_loop () at current.h:10 - warning: shared library handler failed to enable breakpoint - (gdb) set pdb_pidhash_addr = &pidhash - (gdb) set pdb_init_task_union_addr = &init_task_union - -2. The pdb context defaults to Xen and we can read Xen's memory. - An attempt to access domain 0 memory fails. - - (gdb) print pdb_ctx - $1 = {valid = 0, domain = -1, process = -1, ptbr = 1052672} - (gdb) print hexchars - $2 = "0123456789abcdef" - (gdb) print cpu_vendor_names - Cannot access memory at address 0xc0191f80 - -3. Now we change to domain 0. In addition to changing pdb_ctx.domain, - we need to change pdb_ctx.valid to signal pdb of the change. - It is now possible to examine Xen and Linux memory. - - (gdb) set pdb_ctx.domain=0 - (gdb) set pdb_ctx.valid=1 - (gdb) print hexchars - $3 = "0123456789abcdef" - (gdb) print cpu_vendor_names - $4 = {0xc0158b46 "Intel", 0xc0158c37 "Cyrix", 0xc0158b55 "AMD", - 0xc0158c3d "UMC", 0xc0158c41 "NexGen", 0xc0158c48 "Centaur", - 0xc0158c50 "Rise", 0xc0158c55 "Transmeta"} - -4. Now change to a process within domain 0. Again, we need to - change pdb_ctx.valid in addition to pdb_ctx.process. - - (gdb) set pdb_ctx.process=962 - (gdb) set pdb_ctx.valid =1 - (gdb) print pdb_ctx - $1 = {valid = 0, domain = 0, process = 962, ptbr = 52998144} - (gdb) print aho_a - $2 = 20 - -5. Now we can read the same variable from another process running - the same executable in another domain. - - (gdb) set pdb_ctx.domain=1 - (gdb) set pdb_ctx.process=1210 - (gdb) set pdb_ctx.valid=1 - (gdb) print pdb_ctx - $3 = {valid = 0, domain = 1, process = 1210, ptbr = 70574080} - (gdb) print aho_a - $4 = 27 - - -Some Helpful .gdbinit Commands ------------------------------- - -define setup - file .../install/boot/xen-syms - add-sym .../install/boot/vmlinux-syms-2.4.27-xen0 - add-sym /homes/aho/a.out -end -document setup - load symbols for xen, xenolinux (dom 0), and "a.out" -end - -define setup-linux - set pdb_pidhash_addr = &pidhash - set pdb_init_task_union_addr = &init_task_union - - set task_struct_mm_offset = (void *)&(init_task_union.task.mm) - (void *)&(init_task_union.task) - set task_struct_next_task_offset = (void *)&(init_task_union.task.next_task) - (void *)&(init_task_union.task) - set task_struct_pid_offset = (void *)&(init_task_union.task.pid) - (void *)&(init_task_union.task) - set task_struct_pidhash_next_offset = (void *)&(init_task_union.task.pidhash_next) - (void *)&(init_task_union.task) - set task_struct_comm_offset = (void *)&(init_task_union.task.comm) - (void *)&(init_task_union.task) - set task_struct_comm_length = sizeof (init_task_union.task.comm) - - set mm_struct_pgd_offset = sizeof (struct vm_area_struct *) * 2 + sizeof (rb_root_t) -end -document setup-linux - define various xenolinux specific offsets and sizes in pdb -end - - - - -Changes -------- - -04.07.15 aho .gdbinit -04.02.05 aho creation -04.03.31 aho add description on debugging multiple domains diff --git a/linux-2.6.11-xen-sparse/arch/xen/kernel/evtchn.c b/linux-2.6.11-xen-sparse/arch/xen/kernel/evtchn.c index 4e8db3e003..7019e33687 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/kernel/evtchn.c +++ b/linux-2.6.11-xen-sparse/arch/xen/kernel/evtchn.c @@ -47,6 +47,8 @@ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) EXPORT_SYMBOL(force_evtchn_callback); EXPORT_SYMBOL(evtchn_do_upcall); +EXPORT_SYMBOL(bind_evtchn_to_irq); +EXPORT_SYMBOL(unbind_evtchn_from_irq); #endif /* diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/entry.S b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/entry.S index 3f28d0e04e..e01fdd064a 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/entry.S +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/entry.S @@ -63,42 +63,28 @@ VGCF_IN_SYSCALL = (1<<8) #define sizeof_vcpu_shift 3 #ifdef CONFIG_SMP -#define XEN_GET_VCPU_INFO(reg) -#define preempt_disable(reg) incl TI_preempt_count(reg) -#define preempt_enable(reg) decl TI_preempt_count(reg) -#define XEN_LOCK_VCPU_INFO_SMP(reg) preempt_disable(%rbp) ; \ - movl TI_cpu(%rbp),reg ; \ +#define preempt_disable(reg) incl threadinfo_preempt_count(reg) +#define preempt_enable(reg) decl threadinfo_preempt_count(reg) +#define XEN_GET_VCPU_INFO(reg) preempt_disable(%rbp) ; \ + movq %gs:pda_cpunumber,reg ; \ shl $sizeof_vcpu_shift,reg ; \ - addl HYPERVISOR_shared_info,reg -#define XEN_UNLOCK_VCPU_INFO_SMP(reg) preempt_enable(%rbp) -#define XEN_UNLOCK_VCPU_INFO_SMP_fixup .byte 0xff,0xff,0xff -#define Ux00 0xff -#define XEN_LOCKED_BLOCK_EVENTS(reg) movb $1,evtchn_upcall_mask(reg) -#define XEN_BLOCK_EVENTS(reg) XEN_LOCK_VCPU_INFO_SMP(reg) ; \ - XEN_LOCKED_BLOCK_EVENTS(reg) ; \ - XEN_UNLOCK_VCPU_INFO_SMP(reg) -#define XEN_UNBLOCK_EVENTS(reg) XEN_LOCK_VCPU_INFO_SMP(reg) ; \ - movb $0,evtchn_upcall_mask(reg) ; \ - XEN_UNLOCK_VCPU_INFO_SMP(reg) -#define XEN_SAVE_UPCALL_MASK(reg,tmp,off) GET_THREAD_INFO(%ebp) ; \ - XEN_LOCK_VCPU_INFO_SMP(reg) ; \ - movb evtchn_upcall_mask(reg), tmp ; \ - movb tmp, off(%rsp) ; \ - XEN_UNLOCK_VCPU_INFO_SMP(reg) + addq HYPERVISOR_shared_info,reg +#define XEN_PUT_VCPU_INFO(reg) preempt_enable(%rbp) ; \ +#define XEN_PUT_VCPU_INFO_fixup .byte 0xff,0xff,0xff #else #define XEN_GET_VCPU_INFO(reg) movq HYPERVISOR_shared_info,reg -#define XEN_LOCK_VCPU_INFO_SMP(reg) movq HYPERVISOR_shared_info,reg -#define XEN_UNLOCK_VCPU_INFO_SMP(reg) -#define XEN_UNLOCK_VCPU_INFO_SMP_fixup -#define Ux00 0x00 -#define XEN_LOCKED_BLOCK_EVENTS(reg) movb $1,evtchn_upcall_mask(reg) -#define XEN_BLOCK_EVENTS(reg) XEN_LOCKED_BLOCK_EVENTS(reg) -#define XEN_UNBLOCK_EVENTS(reg) movb $0,evtchn_upcall_mask(reg) -#define XEN_SAVE_UPCALL_MASK(reg,tmp,off) \ - movb evtchn_upcall_mask(reg), tmp; \ - movb tmp, off(%rsp) +#define XEN_PUT_VCPU_INFO(reg) +#define XEN_PUT_VCPU_INFO_fixup #endif +#define XEN_LOCKED_BLOCK_EVENTS(reg) movb $1,evtchn_upcall_mask(reg) +#define XEN_LOCKED_UNBLOCK_EVENTS(reg) movb $0,evtchn_upcall_mask(reg) +#define XEN_BLOCK_EVENTS(reg) XEN_GET_VCPU_INFO(reg) ; \ + XEN_LOCKED_BLOCK_EVENTS(reg) ; \ + XEN_PUT_VCPU_INFO(reg) +#define XEN_UNBLOCK_EVENTS(reg) XEN_GET_VCPU_INFO(reg) ; \ + XEN_LOCKED_UNBLOCK_EVENTS(reg) ; \ + XEN_PUT_VCPU_INFO(reg) #define XEN_TEST_PENDING(reg) testb $0xFF,evtchn_upcall_pending(reg) .code64 @@ -256,8 +242,6 @@ ENTRY(system_call) CFI_STARTPROC SAVE_ARGS -8,0 movq %rax,ORIG_RAX-ARGOFFSET(%rsp) - XEN_GET_VCPU_INFO(%r11) - XEN_SAVE_UPCALL_MASK(%r11,%cl,EVENT_MASK-ARGOFFSET) # saved %rcx XEN_UNBLOCK_EVENTS(%r11) GET_THREAD_INFO(%rcx) testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),threadinfo_flags(%rcx) @@ -277,7 +261,6 @@ ret_from_sys_call: /* edi: flagmask */ sysret_check: GET_THREAD_INFO(%rcx) - XEN_GET_VCPU_INFO(%rsi) XEN_BLOCK_EVENTS(%rsi) movl threadinfo_flags(%rcx),%edx andl %edi,%edx @@ -291,7 +274,6 @@ sysret_check: sysret_careful: bt $TIF_NEED_RESCHED,%edx jnc sysret_signal - XEN_GET_VCPU_INFO(%rsi) XEN_BLOCK_EVENTS(%rsi) pushq %rdi call schedule @@ -301,7 +283,6 @@ sysret_careful: /* Handle a signal */ sysret_signal: /* sti */ - XEN_GET_VCPU_INFO(%rsi) XEN_UNBLOCK_EVENTS(%rsi) testl $(_TIF_SIGPENDING|_TIF_NOTIFY_RESUME|_TIF_SINGLESTEP),%edx jz 1f @@ -345,7 +326,6 @@ badsys: * Has correct top of stack, but partial stack frame. */ ENTRY(int_ret_from_sys_call) - XEN_GET_VCPU_INFO(%rsi) XEN_BLOCK_EVENTS(%rsi) testb $3,CS-ARGOFFSET(%rsp) jnz 1f @@ -369,7 +349,6 @@ int_careful: bt $TIF_NEED_RESCHED,%edx jnc int_very_careful /* sti */ - XEN_GET_VCPU_INFO(%rsi) XEN_UNBLOCK_EVENTS(%rsi) pushq %rdi call schedule @@ -379,7 +358,6 @@ int_careful: /* handle signals and tracing -- both require a full stack frame */ int_very_careful: /* sti */ - XEN_GET_VCPU_INFO(%rsi) XEN_UNBLOCK_EVENTS(%rsi) SAVE_REST /* Check for syscall exit trace */ @@ -529,11 +507,11 @@ retint_check: retint_restore_args: movb EVENT_MASK-REST_SKIP(%rsp), %al notb %al # %al == ~saved_mask - XEN_LOCK_VCPU_INFO_SMP(%rsi) + XEN_GET_VCPU_INFO(%rsi) andb evtchn_upcall_mask(%rsi),%al andb $1,%al # %al == mask & ~saved_mask jnz restore_all_enable_events # != 0 => reenable event delivery - XEN_UNLOCK_VCPU_INFO_SMP(%rsi) + XEN_PUT_VCPU_INFO(%rsi) RESTORE_ARGS 0,8,0 testb $3,8(%rsp) # check CS @@ -548,13 +526,11 @@ user_mode: retint_careful: bt $TIF_NEED_RESCHED,%edx jnc retint_signal - XEN_GET_VCPU_INFO(%rsi) XEN_UNBLOCK_EVENTS(%rsi) /* sti */ pushq %rdi call schedule popq %rdi - XEN_GET_VCPU_INFO(%rsi) XEN_BLOCK_EVENTS(%rsi) GET_THREAD_INFO(%rcx) /* cli */ @@ -563,7 +539,6 @@ retint_careful: retint_signal: testl $(_TIF_SIGPENDING|_TIF_NOTIFY_RESUME|_TIF_SINGLESTEP),%edx jz retint_restore_args - XEN_GET_VCPU_INFO(%rsi) XEN_UNBLOCK_EVENTS(%rsi) SAVE_REST movq $-1,ORIG_RAX(%rsp) @@ -571,7 +546,6 @@ retint_signal: movq %rsp,%rdi # &pt_regs call do_notify_resume RESTORE_REST - XEN_GET_VCPU_INFO(%rsi) XEN_BLOCK_EVENTS(%rsi) movl $_TIF_NEED_RESCHED,%edi GET_THREAD_INFO(%rcx) @@ -590,10 +564,8 @@ retint_kernel: jc retint_restore_args movl $PREEMPT_ACTIVE,threadinfo_preempt_count(%rcx) /* sti */ - XEN_GET_VCPU_INFO(%rsi) XEN_UNBLOCK_EVENTS(%rsi) call schedule - XEN_GET_VCPU_INFO(%rsi) /* %esi can be different */ XEN_BLOCK_EVENTS(%rsi) /* cli */ GET_THREAD_INFO(%rcx) @@ -728,17 +700,10 @@ error_call_handler: movq %rsp,%rdi movq ORIG_RAX(%rsp),%rsi # get error code movq $-1,ORIG_RAX(%rsp) - leaq do_hypervisor_callback,%rcx - cmpq %rax,%rcx - je 0f # don't save event mask for callbacks - XEN_GET_VCPU_INFO(%r11) - XEN_SAVE_UPCALL_MASK(%r11,%cl,EVENT_MASK) -0: call *%rax error_exit: RESTORE_REST /* cli */ - XEN_GET_VCPU_INFO(%rsi) XEN_BLOCK_EVENTS(%rsi) GET_THREAD_INFO(%rcx) testb $3,CS-ARGOFFSET(%rsp) @@ -807,7 +772,7 @@ restore_all_enable_events: scrit: /**** START OF CRITICAL REGION ****/ XEN_TEST_PENDING(%rsi) jnz 14f # process more events if necessary... - XEN_UNLOCK_VCPU_INFO_SMP(%rsi) + XEN_PUT_VCPU_INFO(%rsi) RESTORE_ARGS 0,8,0 testb $3,8(%rsp) # check CS jnz crit_user_mode @@ -817,7 +782,7 @@ crit_user_mode: SWITCH_TO_USER 0 14: XEN_LOCKED_BLOCK_EVENTS(%rsi) - XEN_UNLOCK_VCPU_INFO_SMP(%rsi) + XEN_PUT_VCPU_INFO(%rsi) SAVE_REST movq %rsp,%rdi # set the argument again jmp 11b diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup.c b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup.c index 8951d61c2a..72d4cd59e4 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup.c +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup.c @@ -727,23 +727,20 @@ void __init setup_arch(char **cmdline_p) acpi_reserve_bootmem(); #endif #ifdef CONFIG_BLK_DEV_INITRD - if (xen_start_info.mod_start) { - if (LOADER_TYPE && INITRD_START) { - if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) { - /* reserve_bootmem_generic(INITRD_START, INITRD_SIZE); */ - initrd_start = INITRD_START + PAGE_OFFSET; - initrd_end = initrd_start+INITRD_SIZE; - initrd_below_start_ok = 1; - } - else { - printk(KERN_ERR "initrd extends beyond end of memory " - "(0x%08lx > 0x%08lx)\ndisabling initrd\n", - (unsigned long)(INITRD_START + INITRD_SIZE), - (unsigned long)(end_pfn << PAGE_SHIFT)); - initrd_start = 0; - } - } - } + if (xen_start_info.mod_start) { + if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) { + /*reserve_bootmem_generic(INITRD_START, INITRD_SIZE);*/ + initrd_start = INITRD_START + PAGE_OFFSET; + initrd_end = initrd_start+INITRD_SIZE; + initrd_below_start_ok = 1; + } else { + printk(KERN_ERR "initrd extends beyond end of memory " + "(0x%08lx > 0x%08lx)\ndisabling initrd\n", + (unsigned long)(INITRD_START + INITRD_SIZE), + (unsigned long)(end_pfn << PAGE_SHIFT)); + initrd_start = 0; + } + } #endif paging_init(); #ifdef CONFIG_X86_LOCAL_APIC diff --git a/patches/linux-2.6.11/linux-2.6.11.11.patch b/patches/linux-2.6.11/linux-2.6.11.12.patch index 5720fd25ec..592ea13001 100644 --- a/patches/linux-2.6.11/linux-2.6.11.11.patch +++ b/patches/linux-2.6.11/linux-2.6.11.12.patch @@ -65,7 +65,7 @@ diff --git a/Makefile b/Makefile SUBLEVEL = 11 -EXTRAVERSION = -NAME=Woozy Numbat -+EXTRAVERSION = .11 ++EXTRAVERSION = .12 +NAME=Woozy Beaver # *DOCUMENTATION* @@ -448,6 +448,19 @@ diff --git a/arch/um/kernel/sys_call_table.c b/arch/um/kernel/sys_call_table.c [ __NR_add_key ] = (syscall_handler_t *) sys_add_key, [ __NR_request_key ] = (syscall_handler_t *) sys_request_key, [ __NR_keyctl ] = (syscall_handler_t *) sys_keyctl, +diff --git a/arch/x86_64/kernel/apic.c b/arch/x86_64/kernel/apic.c +--- a/arch/x86_64/kernel/apic.c ++++ b/arch/x86_64/kernel/apic.c +@@ -775,9 +775,7 @@ void __init setup_boot_APIC_clock (void) + + void __init setup_secondary_APIC_clock(void) + { +- local_irq_disable(); /* FIXME: Do we need this? --RR */ + setup_APIC_timer(calibration_result); +- local_irq_enable(); + } + + void __init disable_APIC_timer(void) diff --git a/arch/x86_64/kernel/ptrace.c b/arch/x86_64/kernel/ptrace.c --- a/arch/x86_64/kernel/ptrace.c +++ b/arch/x86_64/kernel/ptrace.c @@ -481,6 +494,45 @@ diff --git a/arch/x86_64/kernel/ptrace.c b/arch/x86_64/kernel/ptrace.c } put_stack_long(child, regno - sizeof(struct pt_regs), value); return 0; +@@ -247,7 +252,7 @@ asmlinkage long sys_ptrace(long request, + break; + + switch (addr) { +- case 0 ... sizeof(struct user_regs_struct): ++ case 0 ... sizeof(struct user_regs_struct) - sizeof(long): + tmp = getreg(child, addr); + break; + case offsetof(struct user, u_debugreg[0]): +@@ -292,7 +297,7 @@ asmlinkage long sys_ptrace(long request, + break; + + switch (addr) { +- case 0 ... sizeof(struct user_regs_struct): ++ case 0 ... sizeof(struct user_regs_struct) - sizeof(long): + ret = putreg(child, addr, data); + break; + /* Disallows to set a breakpoint into the vsyscall */ +diff --git a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c +--- a/arch/x86_64/kernel/smpboot.c ++++ b/arch/x86_64/kernel/smpboot.c +@@ -309,8 +309,6 @@ void __init smp_callin(void) + Dprintk("CALLIN, before setup_local_APIC().\n"); + setup_local_APIC(); + +- local_irq_enable(); +- + /* + * Get our bogomips. + */ +@@ -324,8 +322,6 @@ void __init smp_callin(void) + */ + smp_store_cpu_info(cpuid); + +- local_irq_disable(); +- + /* + * Allow the master to continue. + */ diff --git a/arch/x86_64/mm/fault.c b/arch/x86_64/mm/fault.c --- a/arch/x86_64/mm/fault.c +++ b/arch/x86_64/mm/fault.c @@ -724,7 +776,15 @@ diff --git a/drivers/media/video/bt819.c b/drivers/media/video/bt819.c diff --git a/drivers/media/video/bttv-cards.c b/drivers/media/video/bttv-cards.c --- a/drivers/media/video/bttv-cards.c +++ b/drivers/media/video/bttv-cards.c -@@ -2718,8 +2718,6 @@ void __devinit bttv_init_card2(struct bt +@@ -1939,7 +1939,6 @@ struct tvcard bttv_tvcards[] = { + .no_tda9875 = 1, + .no_tda7432 = 1, + .tuner_type = TUNER_ABSENT, +- .no_video = 1, + .pll = PLL_28, + },{ + .name = "Teppro TEV-560/InterVision IV-560", +@@ -2718,8 +2717,6 @@ void __devinit bttv_init_card2(struct bt } btv->pll.pll_current = -1; @@ -1415,6 +1475,82 @@ diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c spin_unlock(rsv_lock); } } +diff --git a/fs/hfs/mdb.c b/fs/hfs/mdb.c +--- a/fs/hfs/mdb.c ++++ b/fs/hfs/mdb.c +@@ -333,6 +333,8 @@ void hfs_mdb_close(struct super_block *s + * Release the resources associated with the in-core MDB. */ + void hfs_mdb_put(struct super_block *sb) + { ++ if (!HFS_SB(sb)) ++ return; + /* free the B-trees */ + hfs_btree_close(HFS_SB(sb)->ext_tree); + hfs_btree_close(HFS_SB(sb)->cat_tree); +@@ -340,4 +342,7 @@ void hfs_mdb_put(struct super_block *sb) + /* free the buffers holding the primary and alternate MDBs */ + brelse(HFS_SB(sb)->mdb_bh); + brelse(HFS_SB(sb)->alt_mdb_bh); ++ ++ kfree(HFS_SB(sb)); ++ sb->s_fs_info = NULL; + } +diff --git a/fs/hfs/super.c b/fs/hfs/super.c +--- a/fs/hfs/super.c ++++ b/fs/hfs/super.c +@@ -263,7 +263,7 @@ static int hfs_fill_super(struct super_b + res = -EINVAL; + if (!parse_options((char *)data, sbi)) { + hfs_warn("hfs_fs: unable to parse mount options.\n"); +- goto bail3; ++ goto bail; + } + + sb->s_op = &hfs_super_operations; +@@ -276,7 +276,7 @@ static int hfs_fill_super(struct super_b + hfs_warn("VFS: Can't find a HFS filesystem on dev %s.\n", + hfs_mdb_name(sb)); + res = -EINVAL; +- goto bail2; ++ goto bail; + } + + /* try to get the root inode */ +@@ -306,10 +306,8 @@ bail_iput: + iput(root_inode); + bail_no_root: + hfs_warn("hfs_fs: get root inode failed.\n"); ++bail: + hfs_mdb_put(sb); +-bail2: +-bail3: +- kfree(sbi); + return res; + } + +diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c +--- a/fs/hfsplus/super.c ++++ b/fs/hfsplus/super.c +@@ -207,7 +207,9 @@ static void hfsplus_write_super(struct s + static void hfsplus_put_super(struct super_block *sb) + { + dprint(DBG_SUPER, "hfsplus_put_super\n"); +- if (!(sb->s_flags & MS_RDONLY)) { ++ if (!sb->s_fs_info) ++ return; ++ if (!(sb->s_flags & MS_RDONLY) && HFSPLUS_SB(sb).s_vhdr) { + struct hfsplus_vh *vhdr = HFSPLUS_SB(sb).s_vhdr; + + vhdr->modify_date = hfsp_now2mt(); +@@ -223,6 +225,8 @@ static void hfsplus_put_super(struct sup + iput(HFSPLUS_SB(sb).alloc_file); + iput(HFSPLUS_SB(sb).hidden_dir); + brelse(HFSPLUS_SB(sb).s_vhbh); ++ kfree(sb->s_fs_info); ++ sb->s_fs_info = NULL; + } + + static int hfsplus_statfs(struct super_block *sb, struct kstatfs *buf) diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -1534,6 +1670,21 @@ diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c SetPageError(page); kunmap(page); unlock_page(page); +diff --git a/fs/jbd/checkpoint.c b/fs/jbd/checkpoint.c +--- a/fs/jbd/checkpoint.c ++++ b/fs/jbd/checkpoint.c +@@ -339,8 +339,10 @@ int log_do_checkpoint(journal_t *journal + } + } while (jh != last_jh && !retry); + +- if (batch_count) ++ if (batch_count) { + __flush_batch(journal, bhs, &batch_count); ++ retry = 1; ++ } + + /* + * If someone cleaned up this transaction while we slept, we're diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c @@ -1921,6 +2072,36 @@ diff --git a/mm/mmap.c b/mm/mmap.c } EXPORT_SYMBOL(get_unmapped_area); +diff --git a/mm/rmap.c b/mm/rmap.c +--- a/mm/rmap.c ++++ b/mm/rmap.c +@@ -641,7 +641,7 @@ static void try_to_unmap_cluster(unsigne + pgd_t *pgd; + pud_t *pud; + pmd_t *pmd; +- pte_t *pte; ++ pte_t *pte, *original_pte; + pte_t pteval; + struct page *page; + unsigned long address; +@@ -673,7 +673,7 @@ static void try_to_unmap_cluster(unsigne + if (!pmd_present(*pmd)) + goto out_unlock; + +- for (pte = pte_offset_map(pmd, address); ++ for (original_pte = pte = pte_offset_map(pmd, address); + address < end; pte++, address += PAGE_SIZE) { + + if (!pte_present(*pte)) +@@ -710,7 +710,7 @@ static void try_to_unmap_cluster(unsigne + (*mapcount)--; + } + +- pte_unmap(pte); ++ pte_unmap(original_pte); + + out_unlock: + spin_unlock(&mm->page_table_lock); diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c @@ -1951,6 +2132,42 @@ diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c return -EINVAL; #if defined(CONFIG_KMOD) +diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c +--- a/net/bridge/br_input.c ++++ b/net/bridge/br_input.c +@@ -54,6 +54,9 @@ int br_handle_frame_finish(struct sk_buf + struct net_bridge_fdb_entry *dst; + int passedup = 0; + ++ /* insert into forwarding database after filtering to avoid spoofing */ ++ br_fdb_insert(p->br, p, eth_hdr(skb)->h_source, 0); ++ + if (br->dev->flags & IFF_PROMISC) { + struct sk_buff *skb2; + +@@ -108,8 +111,7 @@ int br_handle_frame(struct net_bridge_po + if (eth_hdr(skb)->h_source[0] & 1) + goto err; + +- if (p->state == BR_STATE_LEARNING || +- p->state == BR_STATE_FORWARDING) ++ if (p->state == BR_STATE_LEARNING) + br_fdb_insert(p->br, p, eth_hdr(skb)->h_source, 0); + + if (p->br->stp_enabled && +diff --git a/net/bridge/br_stp_bpdu.c b/net/bridge/br_stp_bpdu.c +--- a/net/bridge/br_stp_bpdu.c ++++ b/net/bridge/br_stp_bpdu.c +@@ -140,6 +140,9 @@ int br_stp_handle_bpdu(struct sk_buff *s + struct net_bridge *br = p->br; + unsigned char *buf; + ++ /* insert into forwarding database after filtering to avoid spoofing */ ++ br_fdb_insert(p->br, p, eth_hdr(skb)->h_source, 0); ++ + /* need at least the 802 and STP headers */ + if (!pskb_may_pull(skb, sizeof(header)+1) || + memcmp(skb->data, header, sizeof(header))) diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c --- a/net/bridge/netfilter/ebtables.c +++ b/net/bridge/netfilter/ebtables.c @@ -1994,6 +2211,41 @@ diff --git a/net/ipv4/fib_hash.c b/net/ipv4/fib_hash.c return v; } +diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c +--- a/net/ipv4/netfilter/ip_queue.c ++++ b/net/ipv4/netfilter/ip_queue.c +@@ -3,6 +3,7 @@ + * communicating with userspace via netlink. + * + * (C) 2000-2002 James Morris <jmorris@intercode.com.au> ++ * (C) 2003-2005 Netfilter Core Team <coreteam@netfilter.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as +@@ -14,6 +15,7 @@ + * Zander). + * 2000-08-01: Added Nick Williams' MAC support. + * 2002-06-25: Code cleanup. ++ * 2005-05-26: local_bh_{disable,enable} around nf_reinject (Harald Welte) + * + */ + #include <linux/module.h> +@@ -66,7 +68,15 @@ static DECLARE_MUTEX(ipqnl_sem); + static void + ipq_issue_verdict(struct ipq_queue_entry *entry, int verdict) + { ++ /* TCP input path (and probably other bits) assume to be called ++ * from softirq context, not from syscall, like ipq_issue_verdict is ++ * called. TCP input path deadlocks with locks taken from timer ++ * softirq, e.g. We therefore emulate this by local_bh_disable() */ ++ ++ local_bh_disable(); + nf_reinject(entry->skb, entry->info, verdict); ++ local_bh_enable(); ++ + kfree(entry); + } + diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -2141,6 +2393,29 @@ diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c err = rose_add_node(&rose_route, dev); dev_put(dev); return err; +diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c +--- a/net/sched/sch_netem.c ++++ b/net/sched/sch_netem.c +@@ -184,10 +184,15 @@ static int netem_enqueue(struct sk_buff + /* Random duplication */ + if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor)) { + struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC); +- +- pr_debug("netem_enqueue: dup %p\n", skb2); +- if (skb2) +- delay_skb(sch, skb2); ++ if (skb2) { ++ struct Qdisc *rootq = sch->dev->qdisc; ++ u32 dupsave = q->duplicate; ++ ++ /* prevent duplicating a dup... */ ++ q->duplicate = 0; ++ rootq->enqueue(skb2, rootq); ++ q->duplicate = dupsave; ++ } + } + + /* If doing simple delay then gap == 0 so all packets diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c diff --git a/tools/debugger/pdb/readme b/tools/debugger/pdb/readme new file mode 100644 index 0000000000..be1c44279e --- /dev/null +++ b/tools/debugger/pdb/readme @@ -0,0 +1,84 @@ + +PDB 0.3 +http://www.cl.cam.ac.uk/netos/pdb + +Alex Ho +June 2005 + + +This is the latest incarnation of the pervasive debugger. +PDB is a remote stub for GDB. Running as a user-space +application in domain 0, it can debug any other domain. + + ++------+ tcp/ip +-------+ +| GDB |--------------| PDB | ++------+ +-------+ +-------+ + | Dom 0 | | Dom U | + +-------+---+-------+ + | Xen | + +-------------------+ + +Installation + +- Install OCaml 3.08 in domain 0. + http://caml.inria.fr/download.en.html is a good place to start. + +- Build Xen with debugger support + make domu_debug=y xen + +- (optional) + Build the target domains with debugging symbols. + make CONFIG_DEBUG_INFO=true CONFIG_FRAME_POINTER=false linux-2.6-xenU-build + + You can also change linux-2.6.11-xenU/Makefile + CONFIG_CC_OPTIMIZE_FOR_SIZE from -O2 to -O + +- Build PDB + (cd tools/debugger/libxendebug; make install) + (cd tools/debugger/pdb; make) + +Usage + +- PDB does not currently support SMP. Please boot xen with "maxcpus=1" + +- Run PDB + domain-0.xeno# ./pdb <port> + +- Run GDB + hostname% gdb <xeno.bk>/dist/install/boot/vmlinux-syms-2.6.11.11-xenU + + (gdb) target remote domain-0.xeno:<port> + + At this point, you'll get an error message such as: + Remote debugging using domain-0.xeno:5000 + 0x00000000 in ?? () + warning: shared library handler failed to enable breakpoint + Although GDB is connected to PDB, PDB doesn't know which domain + you'd like to debug, so it's just feeding GDB a bunch of zeros. + + (gdb) maint packet x context = domain <domid> <vcpu> + + This tells PDB that we'd like to debug a particular domain & vcpu. + However, since we're sending the command directly to PDB, GDB doesn't + know that we now have a proper target. We can force GDB to invalidate + its register cache. This is optional; the next time the program + stops GDB will query for the registers automatically. + + (gdb) flushreg + + + the following gdb commands should work :) + + break + step, stepi + next, nexti + continue + print + + +To Do + +- watchpoints +- support for SMP +- support for user applications diff --git a/tools/examples/xmexample.vmx b/tools/examples/xmexample.vmx index 428c6e39af..1936d46a69 100644 --- a/tools/examples/xmexample.vmx +++ b/tools/examples/xmexample.vmx @@ -8,7 +8,7 @@ #---------------------------------------------------------------------------- # Kernel image file. -kernel = "/boot/vmlinuz-rhel3-static" +kernel = "/usr/lib/xen/boot/vmxloader" # Optional ramdisk. #ramdisk = "/boot/initrd.gz" @@ -75,7 +75,7 @@ root = "/dev/hda1 ro" #nfs_root = '/full/path/to/root/directory' # Sets runlevel 4. -extra = "acpi=off console=ttyS0 console=tty0 1" +#extra = "acpi=off console=ttyS0 console=tty0 1" #---------------------------------------------------------------------------- # Set according to whether you want the domain restarted when it exits. diff --git a/tools/firmware/vmxassist/Makefile b/tools/firmware/vmxassist/Makefile index 545acdf743..a9b142363c 100644 --- a/tools/firmware/vmxassist/Makefile +++ b/tools/firmware/vmxassist/Makefile @@ -18,6 +18,9 @@ # Place - Suite 330, Boston, MA 02111-1307 USA. # +XEN_ROOT = ../../.. +include $(XEN_ROOT)/tools/Rules.mk + # The emulator code lives in ROM space TEXTADDR=0x000D0000 DEFINES=-DDEBUG -DTEXTADDR=${TEXTADDR} @@ -32,19 +35,24 @@ CPP=cpp -P OBJCOPY=objcopy -p -O binary -R .note -R .comment -R .bss -S --gap-fill=0 CFLAGS=${DEFINES} -I. $(XENINC) -Wall -fno-builtin -O2 -msoft-float +ifeq ($(XEN_COMPILE_ARCH),x86_64) +CFLAGS += -m32 -march=i686 +LDFLAGS += -m elf_i386 +endif + OBJECTS = head.o trap.o vm86.o setup.o util.o all: vmxloader vmxloader: roms.h vmxloader.c - ${CC} ${DEFINES} -c vmxloader.c - $(CC) -o vmxloader.tmp -nostdlib -Wl,-N -Wl,-Ttext -Wl,0x100000 vmxloader.o + ${CC} ${CFLAGS} ${DEFINES} -c vmxloader.c + $(CC) -o vmxloader.tmp -m32 -nostdlib -Wl,-N -Wl,-Ttext -Wl,0x100000 vmxloader.o objcopy --change-addresses=0xC0000000 vmxloader.tmp vmxloader rm -f vmxloader.tmp vmxassist.bin: vmxassist.ld ${OBJECTS} ${CPP} ${DEFINES} vmxassist.ld > vmxassist.tmp - ${LD} -o vmxassist -nostdlib --fatal-warnings -N -T vmxassist.tmp ${OBJECTS} + ${LD} -o vmxassist ${LDFLAGS} -nostdlib --fatal-warnings -N -T vmxassist.tmp ${OBJECTS} nm -n vmxassist > vmxassist.sym ${OBJCOPY} vmxassist vmxassist.tmp dd if=vmxassist.tmp of=vmxassist.bin ibs=512 conv=sync diff --git a/tools/firmware/vmxassist/head.S b/tools/firmware/vmxassist/head.S index 131fbd50cc..1541a1c8e9 100644 --- a/tools/firmware/vmxassist/head.S +++ b/tools/firmware/vmxassist/head.S @@ -106,6 +106,7 @@ rom_gdtr: * main and setup our own environment. */ .globl _start + .code32 _start: cli @@ -135,7 +136,7 @@ _start: .align 4 .globl halt halt: - pushl $halt_msg + push $halt_msg call printf #ifdef TEST movw $0x8A00, %dx diff --git a/tools/firmware/vmxassist/trap.S b/tools/firmware/vmxassist/trap.S index a469f68fc8..e4294e88c2 100644 --- a/tools/firmware/vmxassist/trap.S +++ b/tools/firmware/vmxassist/trap.S @@ -20,7 +20,6 @@ #include "machine.h" #include "offsets.h" - /* * All processor exception/faults/interrupts end up here. * @@ -43,6 +42,7 @@ .endm .section .rodata + .code32 .align 4 .global trap_handlers trap_handlers: @@ -96,6 +96,7 @@ trap_handlers: TRAP_HANDLER 47, 0 /* irq 15 */ .text + .code32 .align 16 common_trap: /* common trap handler */ pushl %gs diff --git a/tools/python/xen/lowlevel/xs/xs.c b/tools/python/xen/lowlevel/xs/xs.c index 6ecddc6fd4..0da0fbcb3e 100644 --- a/tools/python/xen/lowlevel/xs/xs.c +++ b/tools/python/xen/lowlevel/xs/xs.c @@ -14,9 +14,9 @@ */ /* Needed for Python versions earlier than 2.3. */ -//#ifndef PyMODINIT_FUNC -//#define PyMODINIT_FUNC DL_EXPORT(void) -//#endif +#ifndef PyMODINIT_FUNC +#define PyMODINIT_FUNC DL_EXPORT(void) +#endif #define PYPKG "xen.lowlevel.xs" diff --git a/tools/python/xen/lowlevel/xu/xu.c b/tools/python/xen/lowlevel/xu/xu.c index 65660ba6dc..cd616e75bc 100644 --- a/tools/python/xen/lowlevel/xu/xu.c +++ b/tools/python/xen/lowlevel/xu/xu.c @@ -72,7 +72,7 @@ static void set_cloexec(int fd) static int xcs_ctrl_fd = -1; /* control connection to the xcs server. */ static int xcs_data_fd = -1; /* data connection to the xcs server. */ -static u32 xcs_session_id = 0; +static unsigned long xcs_session_id = 0; static int xcs_ctrl_send(xcs_msg_t *msg); static int xcs_ctrl_read(xcs_msg_t *msg); diff --git a/tools/xcs/xcs_proto.h b/tools/xcs/xcs_proto.h index fa04621f40..7038467c90 100644 --- a/tools/xcs/xcs_proto.h +++ b/tools/xcs/xcs_proto.h @@ -40,7 +40,7 @@ #define TYPE_VIRQ 0xfffe typedef struct { - u32 session_id; + unsigned long session_id; } xcs_connect_msg_t; typedef struct { diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 7fd5b8c579..9b3d631bc0 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -1246,7 +1246,7 @@ void free_page_type(struct pfn_info *page, unsigned int type) { gpfn = __mfn_to_gpfn(owner, page_to_pfn(page)); ASSERT(VALID_M2P(gpfn)); - remove_shadow(owner, gpfn, type); + remove_shadow(owner, gpfn, type & PGT_type_mask); } } diff --git a/xen/arch/x86/x86_32/entry.S b/xen/arch/x86/x86_32/entry.S index 8e7ecfe31d..475474b99a 100644 --- a/xen/arch/x86/x86_32/entry.S +++ b/xen/arch/x86/x86_32/entry.S @@ -176,10 +176,10 @@ vmx_process_softirqs: restore_all_guest: testl $X86_EFLAGS_VM,UREGS_eflags(%esp) jnz restore_all_vm86 -FLT1: mov UREGS_ds(%esp),%ds -FLT2: mov UREGS_es(%esp),%es -FLT3: mov UREGS_fs(%esp),%fs -FLT4: mov UREGS_gs(%esp),%gs +FLT1: mov UREGS_ds(%esp),%ds +FLT2: mov UREGS_es(%esp),%es +FLT3: mov UREGS_fs(%esp),%fs +FLT4: mov UREGS_gs(%esp),%gs restore_all_vm86: popl %ebx popl %ecx @@ -306,7 +306,7 @@ create_bounce_frame: testl $(2|X86_EFLAGS_VM),%ecx jz ring1 /* jump if returning to an existing ring-1 activation */ movl VCPU_kernel_sp(%ebx),%esi -FLT6: mov VCPU_kernel_ss(%ebx),%gs +FLT6: mov VCPU_kernel_ss(%ebx),%gs testl $X86_EFLAGS_VM,UREGS_eflags+4(%esp) jz nvm86_1 subl $16,%esi /* push ES/DS/FS/GS (VM86 stack frame) */ @@ -326,13 +326,11 @@ FLT12: movl %eax,%gs:4(%esi) jmp 1f ring1: /* obtain ss/esp from oldss/oldesp -- a ring-1 activation exists */ movl UREGS_esp+4(%esp),%esi -FLT13: mov UREGS_ss+4(%esp),%gs +FLT13: mov UREGS_ss+4(%esp),%gs 1: /* Construct a stack frame: EFLAGS, CS/EIP */ movb TRAPBOUNCE_flags(%edx),%cl subl $12,%esi movl UREGS_eip+4(%esp),%eax - test %eax,%eax - jz domain_crash_synchronous FLT14: movl %eax,%gs:(%esi) movl VCPU_vcpu_info(%ebx),%eax pushl VCPUINFO_upcall_mask(%eax) @@ -383,11 +381,13 @@ FLT26: movl %eax,%gs:12(%esi) nvm86_3:/* Rewrite our stack frame and return to ring 1. */ /* IA32 Ref. Vol. 3: TF, VM, RF and NT flags are cleared on trap. */ andl $0xfffcbeff,UREGS_eflags+4(%esp) - mov %gs,UREGS_ss+4(%esp) + mov %gs,UREGS_ss+4(%esp) movl %esi,UREGS_esp+4(%esp) movzwl TRAPBOUNCE_cs(%edx),%eax movl %eax,UREGS_cs+4(%esp) movl TRAPBOUNCE_eip(%edx),%eax + test %eax,%eax + jz domain_crash_synchronous movl %eax,UREGS_eip+4(%esp) movb $0,TRAPBOUNCE_flags(%edx) ret @@ -670,7 +670,7 @@ do_switch_vm86: # GS:ESI == Ring-1 stack activation movl UREGS_esp(%esp),%esi -VFLT1: mov UREGS_ss(%esp),%gs +VFLT1: mov UREGS_ss(%esp),%gs # ES:EDI == Ring-0 stack activation leal UREGS_eip(%esp),%edi diff --git a/xen/arch/x86/x86_32/seg_fixup.c b/xen/arch/x86/x86_32/seg_fixup.c index 9931825f60..d7d318551c 100644 --- a/xen/arch/x86/x86_32/seg_fixup.c +++ b/xen/arch/x86/x86_32/seg_fixup.c @@ -277,7 +277,7 @@ int gpf_emulate_4gb(struct cpu_user_regs *regs) u32 disp32 = 0; u8 *eip; /* ptr to instruction start */ u8 *pb, b; /* ptr into instr. / current instr. byte */ - u16 *pseg = NULL; /* segment for memory operand (NULL=default) */ + int gs_override = 0; /* WARNING: We only work for ring-3 segments. */ if ( unlikely(VM86_MODE(regs)) || unlikely(!RING_3(regs)) ) @@ -310,30 +310,20 @@ int gpf_emulate_4gb(struct cpu_user_regs *regs) switch ( b ) { case 0x67: /* Address-size override */ - DPRINTK("Unhandleable prefix byte %02x\n", b); - goto fixme; - case 0x66: /* Operand-size override */ - case 0xf0: /* LOCK */ - case 0xf2: /* REPNE/REPNZ */ - case 0xf3: /* REP/REPE/REPZ */ - break; case 0x2e: /* CS override */ - pseg = ®s->cs; - break; case 0x3e: /* DS override */ - pseg = ®s->ds; - break; case 0x26: /* ES override */ - pseg = ®s->es; - break; case 0x64: /* FS override */ - pseg = ®s->fs; + case 0x36: /* SS override */ + DPRINTK("Unhandled prefix %02x\n", b); + goto fail; + case 0x66: /* Operand-size override */ + case 0xf0: /* LOCK */ + case 0xf2: /* REPNE/REPNZ */ + case 0xf3: /* REP/REPE/REPZ */ break; case 0x65: /* GS override */ - pseg = ®s->gs; - break; - case 0x36: /* SS override */ - pseg = ®s->ss; + gs_override = 1; break; default: /* Not a prefix byte */ goto done_prefix; @@ -341,6 +331,12 @@ int gpf_emulate_4gb(struct cpu_user_regs *regs) } done_prefix: + if ( !gs_override ) + { + DPRINTK("Only instructions with GS override\n"); + goto fail; + } + decode = insn_decode[b]; /* opcode byte */ pb++; if ( decode == 0 ) @@ -351,12 +347,13 @@ int gpf_emulate_4gb(struct cpu_user_regs *regs) if ( !(decode & HAS_MODRM) ) { + /* Must be a <disp32>, or bail. */ if ( (decode & 7) != 4 ) goto fail; if ( get_user(offset, (u32 *)pb) ) { - DPRINTK("Fault while extracting <disp8>.\n"); + DPRINTK("Fault while extracting <disp32>.\n"); goto page_fault; } pb += 4; @@ -394,8 +391,6 @@ int gpf_emulate_4gb(struct cpu_user_regs *regs) switch ( modrm >> 6 ) { case 0: - if ( pseg == NULL ) - pseg = ®s->ds; disp32 = 0; if ( rm == 5 ) /* disp32 rather than (EBP) */ { @@ -410,8 +405,6 @@ int gpf_emulate_4gb(struct cpu_user_regs *regs) break; case 1: - if ( pseg == NULL ) /* NB. EBP defaults to SS */ - pseg = (rm == 5) ? ®s->ss : ®s->ds; if ( get_user(disp8, pb) ) { DPRINTK("Fault while extracting <disp8>.\n"); @@ -422,8 +415,6 @@ int gpf_emulate_4gb(struct cpu_user_regs *regs) break; case 2: - if ( pseg == NULL ) /* NB. EBP defaults to SS */ - pseg = (rm == 5) ? ®s->ss : ®s->ds; if ( get_user(disp32, (u32 *)pb) ) { DPRINTK("Fault while extracting <disp8>.\n"); @@ -442,7 +433,7 @@ int gpf_emulate_4gb(struct cpu_user_regs *regs) offset += *(u32 *)memreg; skip_modrm: - if ( !fixup_seg((u16)(*pseg), offset) ) + if ( !fixup_seg((u16)regs->gs, offset) ) goto fail; /* Success! */ diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S index e213a70661..b0f3ffb0fb 100644 --- a/xen/arch/x86/x86_64/entry.S +++ b/xen/arch/x86/x86_64/entry.S @@ -320,8 +320,6 @@ FLT4: movq %rax,16(%rsi) # RFLAGS movw UREGS_cs+8(%rsp),%ax # Bits 0-15: CS FLT5: movq %rax,8(%rsi) # CS/saved_upcall_mask movq UREGS_rip+8(%rsp),%rax - testq %rax,%rax - jz domain_crash_synchronous FLT6: movq %rax,(%rsi) # RIP testb $TBF_EXCEPTION_ERRCODE,%cl jz 1f @@ -357,6 +355,8 @@ FLT14: movq %rax,(%rsi) # RCX movq %rsi,UREGS_rsp+8(%rsp) movq $__GUEST_CS,UREGS_cs+8(%rsp) movq TRAPBOUNCE_eip(%rdx),%rax + testq %rax,%rax + jz domain_crash_synchronous movq %rax,UREGS_rip+8(%rsp) movb $0,TRAPBOUNCE_flags(%rdx) ret diff --git a/xen/drivers/char/serial.c b/xen/drivers/char/serial.c index bec789e084..ad5ad5cde0 100644 --- a/xen/drivers/char/serial.c +++ b/xen/drivers/char/serial.c @@ -176,11 +176,15 @@ char serial_getc(int handle) if ( port->rxbufp != port->rxbufc ) { c = port->rxbuf[MASK_SERIAL_RXBUF_IDX(port->rxbufc++)]; + spin_unlock_irqrestore(&port->lock, flags); break; } if ( port->driver->getc(port, &c) ) + { + spin_unlock_irqrestore(&port->lock, flags); break; + } spin_unlock_irqrestore(&port->lock, flags); diff --git a/xen/include/asm-x86/page.h b/xen/include/asm-x86/page.h index dd777263c1..87a47f8667 100644 --- a/xen/include/asm-x86/page.h +++ b/xen/include/asm-x86/page.h @@ -12,6 +12,7 @@ #ifndef __ASSEMBLY__ # include <asm/types.h> +# include <xen/lib.h> #endif #if defined(__i386__) |