aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.hgtags2
-rw-r--r--.rootkeys4
-rw-r--r--docs/misc/XenDebugger-HOWTO304
-rw-r--r--linux-2.6.11-xen-sparse/arch/xen/kernel/evtchn.c2
-rw-r--r--linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/entry.S77
-rw-r--r--linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup.c31
-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/readme84
-rw-r--r--tools/examples/xmexample.vmx4
-rw-r--r--tools/firmware/vmxassist/Makefile14
-rw-r--r--tools/firmware/vmxassist/head.S3
-rw-r--r--tools/firmware/vmxassist/trap.S3
-rw-r--r--tools/python/xen/lowlevel/xs/xs.c6
-rw-r--r--tools/python/xen/lowlevel/xu/xu.c2
-rw-r--r--tools/xcs/xcs_proto.h2
-rw-r--r--xen/arch/x86/mm.c2
-rw-r--r--xen/arch/x86/x86_32/entry.S20
-rw-r--r--xen/arch/x86/x86_32/seg_fixup.c45
-rw-r--r--xen/arch/x86/x86_64/entry.S4
-rw-r--r--xen/drivers/char/serial.c4
-rw-r--r--xen/include/asm-x86/page.h1
21 files changed, 459 insertions, 434 deletions
diff --git a/.hgtags b/.hgtags
index 0df167c413..a094a94287 100644
--- a/.hgtags
+++ b/.hgtags
@@ -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
diff --git a/.rootkeys b/.rootkeys
index c50bc50a0d..510c4c6ca6 100644
--- a/.rootkeys
+++ b/.rootkeys
@@ -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 = &regs->cs;
- break;
case 0x3e: /* DS override */
- pseg = &regs->ds;
- break;
case 0x26: /* ES override */
- pseg = &regs->es;
- break;
case 0x64: /* FS override */
- pseg = &regs->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 = &regs->gs;
- break;
- case 0x36: /* SS override */
- pseg = &regs->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 = &regs->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) ? &regs->ss : &regs->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) ? &regs->ss : &regs->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__)