mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Rusty Russell <rusty@rustcorp.com.au>
To: Chris Wright <chrisw@sous-sol.org>
Cc: linux-kernel@vger.kernel.org, virtualization@lists.osdl.org,
	xen-devel@lists.xensource.com,
	Jeremy Fitzhardinge <jeremy@goop.org>, Andi Kleen <ak@suse.de>,
	Andrew Morton <akpm@osdl.org>, Zachary Amsden <zach@vmware.com>,
	Ian Pratt <ian.pratt@xensource.com>,
	Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
Subject: Re: [RFC PATCH 15/33] move segment checks to subarch
Date: Wed, 19 Jul 2006 05:06:41 +1000	[thread overview]
Message-ID: <1153249601.5467.31.camel@localhost.localdomain> (raw)
In-Reply-To: <20060718091952.263186000@sous-sol.org>

On Tue, 2006-07-18 at 00:00 -0700, Chris Wright wrote:
> plain text document attachment (i386-segments)
> We allow for the fact that the guest kernel may not run in ring 0.
> This requires some abstraction in a few places when setting %cs or
> checking privilege level (user vs kernel).

Zach had an alternate patch for this, which didn't assume the kernel ran
in a compile-time known ring, but is otherwise very similar.  I've put
it below for discussion (but Zach now tells me the asm parts are not
required: Zach, can you mod this patch and comment?).

Your patch #16 finishes the job you started here, by doing the mods to
entry.S.  I think it's cleaner to have all this in one patch (and it can
go in almost immediately AFAICT).

Comments?
Rusty.

Name: Kernel Ring Cleanups
Status: Booted on 2.6.18-rc1
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

This is Zach's patch to clean up assumptions about the kernel running
in ring 0 (which it doesn't when running paravirtualized).

1) Remove the hardcoded 3 and introduce #define SEGMENT_RPL_MASK 3
2) Add a get_kernel_rpl() function
3) Create COMPARE_SEGMENT_STACK and COMPARE_SEGMENT_REG macros which
   can mask out the bottom two bits (RPL) when comparing for
   paravirtualization.

diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .27795-linux-2.6.18-rc1/arch/i386/kernel/entry.S .27795-linux-2.6.18-rc1.updated/arch/i386/kernel/entry.S
--- .27795-linux-2.6.18-rc1/arch/i386/kernel/entry.S	2006-07-07 10:46:38.000000000 +1000
+++ .27795-linux-2.6.18-rc1.updated/arch/i386/kernel/entry.S	2006-07-07 12:11:01.000000000 +1000
@@ -228,9 +228,11 @@ ret_from_intr:
 	GET_THREAD_INFO(%ebp)
 check_userspace:
 	movl EFLAGS(%esp), %eax		# mix EFLAGS and CS
+	andl $VM_MASK, %eax
 	movb CS(%esp), %al
-	testl $(VM_MASK | 3), %eax
-	jz resume_kernel
+	andb $SEGMENT_RPL_MASK, %al
+	cmpl $SEGMENT_RPL_MASK, %eax
+	jb resume_kernel		# returning to kernel or vm86-space
 ENTRY(resume_userspace)
  	cli				# make sure we don't miss an interrupt
 					# setting need_resched or sigpending
@@ -517,22 +519,16 @@ syscall_badsys:
 	/* put ESP to the proper location */ \
 	movl %eax, %esp;
 #define UNWIND_ESPFIX_STACK \
-	pushl %eax; \
-	CFI_ADJUST_CFA_OFFSET 4; \
-	movl %ss, %eax; \
-	/* see if on 16bit stack */ \
-	cmpw $__ESPFIX_SS, %ax; \
-	je 28f; \
-27:	popl %eax; \
-	CFI_ADJUST_CFA_OFFSET -4; \
+	COMPARE_SEGMENT_REG(__ESPFIX_SS, %ss); \
+	jne 28f; \
 .section .fixup,"ax"; \
-28:	movl $__KERNEL_DS, %eax; \
+	movl $__KERNEL_DS, %eax; \
 	movl %eax, %ds; \
 	movl %eax, %es; \
 	/* switch to 32bit stack */ \
 	FIXUP_ESPFIX_STACK; \
-	jmp 27b; \
-.previous
+.previous \
+28: ; 
 
 /*
  * Build the entry stubs and pointer table with
@@ -629,6 +625,7 @@ error_code:
 	popl %ecx
 	CFI_ADJUST_CFA_OFFSET -4
 	/*CFI_REGISTER es, ecx*/
+	movl EAX(%esp), %eax
 	movl ES(%esp), %edi		# get the function address
 	movl ORIG_EAX(%esp), %edx	# get the error code
 	movl %eax, ORIG_EAX(%esp)
@@ -694,12 +691,12 @@ device_not_available_emulate:
  * the instruction that would have done it for sysenter.
  */
 #define FIX_STACK(offset, ok, label)		\
-	cmpw $__KERNEL_CS,4(%esp);		\
+	COMPARE_SEGMENT_STACK(__KERNEL_CS, 4);	\
 	jne ok;					\
 label:						\
 	movl TSS_sysenter_esp0+offset(%esp),%esp;	\
 	pushfl;					\
-	pushl $__KERNEL_CS;			\
+	push  %cs;				\
 	pushl $sysenter_past_esp
 
 KPROBE_ENTRY(debug)
@@ -727,12 +724,7 @@ debug_stack_correct:
  */
 ENTRY(nmi)
 	RING0_INT_FRAME
-	pushl %eax
-	CFI_ADJUST_CFA_OFFSET 4
-	movl %ss, %eax
-	cmpw $__ESPFIX_SS, %ax
-	popl %eax
-	CFI_ADJUST_CFA_OFFSET -4
+	COMPARE_SEGMENT_REG(__ESPFIX_SS, %ss)
 	je nmi_16bit_stack
 	cmpl $sysenter_entry,(%esp)
 	je nmi_stack_fixup
@@ -763,7 +755,7 @@ nmi_stack_fixup:
 	FIX_STACK(12,nmi_stack_correct, 1)
 	jmp nmi_stack_correct
 nmi_debug_stack_check:
-	cmpw $__KERNEL_CS,16(%esp)
+	COMPARE_SEGMENT_STACK(__KERNEL_CS, 16)
 	jne nmi_stack_correct
 	cmpl $debug,(%esp)
 	jb nmi_stack_correct
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .27795-linux-2.6.18-rc1/arch/i386/kernel/process.c .27795-linux-2.6.18-rc1.updated/arch/i386/kernel/process.c
--- .27795-linux-2.6.18-rc1/arch/i386/kernel/process.c	2006-07-07 10:46:38.000000000 +1000
+++ .27795-linux-2.6.18-rc1.updated/arch/i386/kernel/process.c	2006-07-07 11:10:30.000000000 +1000
@@ -346,7 +346,7 @@ int kernel_thread(int (*fn)(void *), voi
 	regs.xes = __USER_DS;
 	regs.orig_eax = -1;
 	regs.eip = (unsigned long) kernel_thread_helper;
-	regs.xcs = __KERNEL_CS;
+	regs.xcs = __KERNEL_CS | get_kernel_rpl();
 	regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2;
 
 	/* Ok, create the new process.. */
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .27795-linux-2.6.18-rc1/arch/i386/kernel/traps.c .27795-linux-2.6.18-rc1.updated/arch/i386/kernel/traps.c
--- .27795-linux-2.6.18-rc1/arch/i386/kernel/traps.c	2006-07-07 10:46:38.000000000 +1000
+++ .27795-linux-2.6.18-rc1.updated/arch/i386/kernel/traps.c	2006-07-07 11:10:30.000000000 +1000
@@ -1034,10 +1034,10 @@ fastcall void setup_x86_bogus_stack(unsi
 	memcpy((void *)(stack_bot + iret_frame16_off), &regs->eip, 20);
 	/* fill in the switch pointers */
 	switch16_ptr[0] = (regs->esp & 0xffff0000) | iret_frame16_off;
-	switch16_ptr[1] = __ESPFIX_SS;
+	switch16_ptr[1] = __ESPFIX_SS | get_kernel_rpl();
 	switch32_ptr[0] = (unsigned long)stk + sizeof(struct pt_regs) +
 		8 - CPU_16BIT_STACK_SIZE;
-	switch32_ptr[1] = __KERNEL_DS;
+	switch32_ptr[1] = __KERNEL_DS | get_kernel_rpl();
 }
 
 fastcall unsigned char * fixup_x86_bogus_stack(unsigned short sp)
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .27795-linux-2.6.18-rc1/include/asm-i386/ptrace.h .27795-linux-2.6.18-rc1.updated/include/asm-i386/ptrace.h
--- .27795-linux-2.6.18-rc1/include/asm-i386/ptrace.h	2006-03-23 12:44:59.000000000 +1100
+++ .27795-linux-2.6.18-rc1.updated/include/asm-i386/ptrace.h	2006-07-07 11:10:30.000000000 +1000
@@ -60,6 +60,7 @@ struct pt_regs {
 #ifdef __KERNEL__
 
 #include <asm/vm86.h>
+#include <asm/segment.h>
 
 struct task_struct;
 extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code);
@@ -73,11 +74,11 @@ extern void send_sigtrap(struct task_str
  */
 static inline int user_mode(struct pt_regs *regs)
 {
-	return (regs->xcs & 3) != 0;
+	return (regs->xcs & SEGMENT_RPL_MASK) == 3;
 }
 static inline int user_mode_vm(struct pt_regs *regs)
 {
-	return ((regs->xcs & 3) | (regs->eflags & VM_MASK)) != 0;
+	return (((regs->xcs & SEGMENT_RPL_MASK) | (regs->eflags & VM_MASK)) >= 3);
 }
 #define instruction_pointer(regs) ((regs)->eip)
 #if defined(CONFIG_SMP) && defined(CONFIG_FRAME_POINTER)
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .27795-linux-2.6.18-rc1/include/asm-i386/segment.h .27795-linux-2.6.18-rc1.updated/include/asm-i386/segment.h
--- .27795-linux-2.6.18-rc1/include/asm-i386/segment.h	2006-03-23 12:44:59.000000000 +1100
+++ .27795-linux-2.6.18-rc1.updated/include/asm-i386/segment.h	2006-07-07 11:49:39.000000000 +1000
@@ -112,4 +112,20 @@
  */
 #define IDT_ENTRIES 256
 
+/* Bottom three bits of xcs give the ring privilege level */
+#define SEGMENT_RPL_MASK 0x3
+
+#define get_kernel_rpl()  0
+
+#define COMPARE_SEGMENT_STACK(segment, offset)	\
+	cmpw $segment, offset(%esp);
+
+#define COMPARE_SEGMENT_REG(segment, reg)	\
+	pushl %eax;				\
+	CFI_ADJUST_CFA_OFFSET 4;		\
+	mov   reg, %eax;			\
+	cmpw  $segment,%ax;			\
+	popl  %eax;				\
+	CFI_ADJUST_CFA_OFFSET -4
+
 #endif

-- 
Help! Save Australia from the worst of the DMCA: http://linux.org.au/law


  parent reply	other threads:[~2006-07-18 19:07 UTC|newest]

Thread overview: 101+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-07-18  9:18 [RFC PATCH 00/33] Xen i386 paravirtualization support Chris Wright
2006-07-18  7:00 ` [RFC PATCH 01/33] Add apply_to_page_range() function Chris Wright
2006-07-18 10:38   ` Adrian Bunk
2006-07-18 19:29     ` Chris Wright
2006-07-20  6:17       ` Adrian Bunk
2006-07-18  7:00 ` [RFC PATCH 02/33] Add sync bitops Chris Wright
2006-07-18  9:56   ` Arjan van de Ven
2006-07-18 10:18     ` Keir Fraser
2006-07-19 12:54     ` Andi Kleen
2006-07-18 10:34   ` Adrian Bunk
2006-07-18  7:00 ` [RFC PATCH 03/33] Add nosegneg capability to the vsyscall page notes Chris Wright
2006-07-18  7:00 ` [RFC PATCH 04/33] Add XEN config options and disable unsupported config options Chris Wright
2006-07-18  9:59   ` Arjan van de Ven
2006-07-18 10:21     ` Keir Fraser
2006-07-18  7:00 ` [RFC PATCH 05/33] Makefile support to build Xen subarch Chris Wright
2006-07-18 10:00   ` Arjan van de Ven
2006-07-18 11:40     ` Andrew Morton
2006-07-18 20:41       ` Jeremy Fitzhardinge
2006-07-18 20:15     ` Jeremy Fitzhardinge
2006-07-18  7:00 ` [RFC PATCH 06/33] Add Xen interface header files Chris Wright
2006-07-18  7:00 ` [RFC PATCH 07/33] Hypervisor " Chris Wright
2006-07-18  7:00 ` [RFC PATCH 08/33] Add vmlinuz build target Chris Wright
2006-07-18  7:00 ` [RFC PATCH 09/33] Add start-of-day setup hooks to subarch Chris Wright
2006-07-18 10:03   ` Arjan van de Ven
2006-07-18 20:49     ` Jeremy Fitzhardinge
2006-07-20  6:07   ` Adrian Bunk
2006-07-20 12:10     ` Keir Fraser
2006-07-20 13:27       ` Jeremy Fitzhardinge
2006-07-18  7:00 ` [RFC PATCH 10/33] add support for Xen feature queries Chris Wright
2006-07-18  7:00 ` [RFC PATCH 11/33] Add Xen-specific memory management definitions Chris Wright
2006-07-18  7:00 ` [RFC PATCH 12/33] Change __FIXADDR_TOP to leave room for the hypervisor Chris Wright
2006-07-18  7:00 ` [RFC PATCH 13/33] Add a new head.S start-of-day file for booting on Xen Chris Wright
2006-07-18 10:06   ` Arjan van de Ven
2006-07-18 20:13     ` Jeremy Fitzhardinge
2006-07-18  7:00 ` [RFC PATCH 14/33] subarch support for controlling interrupt delivery Chris Wright
2006-07-18  7:00 ` [RFC PATCH 15/33] move segment checks to subarch Chris Wright
2006-07-18 10:09   ` Arjan van de Ven
2006-07-18 11:28     ` Zachary Amsden
2006-07-18 19:06   ` Rusty Russell [this message]
2006-07-18 19:25     ` Chris Wright
2006-07-18 20:00       ` [Xen-devel] " Rusty Russell
2006-07-18  7:00 ` [RFC PATCH 16/33] Add support for Xen to entry.S Chris Wright
2006-07-18 10:11   ` Arjan van de Ven
2006-07-18 20:04     ` Jeremy Fitzhardinge
2006-07-18 19:17   ` Rusty Russell
2006-07-18 20:43     ` Chris Wright
2006-07-18 23:03       ` Jeremy Fitzhardinge
2006-07-19  5:30         ` Chris Wright
2006-07-18  7:00 ` [RFC PATCH 17/33] Support loading an initrd when running on Xen Chris Wright
2006-07-18  7:00 ` [RFC PATCH 18/33] Subarch support for CPUID instruction Chris Wright
2006-07-18 10:14   ` Arjan van de Ven
2006-07-18 10:26     ` Keir Fraser
2006-07-18 10:38       ` Arjan van de Ven
2006-07-18 11:33     ` Zachary Amsden
2006-07-18 20:46       ` David Miller
2006-07-18 21:00         ` Chris Wright
2006-07-18  7:00 ` [RFC PATCH 19/33] Support gdt/idt/ldt handling on Xen Chris Wright
2006-07-18  7:00 ` [RFC PATCH 20/33] subarch support for interrupt and exception gates Chris Wright
2006-07-18  7:00 ` [RFC PATCH 21/33] subarch support for control register accesses Chris Wright
2006-07-18  7:00 ` [RFC PATCH 22/33] subarch stack pointer update Chris Wright
2006-07-18  7:00 ` [RFC PATCH 23/33] subarch TLB support Chris Wright
2006-07-18 20:39   ` David Miller
2006-07-18 21:00     ` Chris Wright
2006-07-18  7:00 ` [RFC PATCH 24/33] Add support for Xen event channels Chris Wright
2006-07-18  7:00 ` [RFC PATCH 25/33] Implement timekeeping for Xen Chris Wright
2006-07-25  2:49   ` john stultz
2006-07-25 20:05     ` Jeremy Fitzhardinge
2006-07-18  7:00 ` [RFC PATCH 26/33] subarch suport for idle loop (NO_IDLE_HZ for Xen) Chris Wright
2006-07-18  7:00 ` [RFC PATCH 27/33] Add the Xen virtual console driver Chris Wright
2006-07-18 10:24   ` Arjan van de Ven
2006-07-18 10:31     ` Keir Fraser
2006-07-27 15:05   ` Hollis Blanchard
2006-07-18  7:00 ` [RFC PATCH 28/33] Add Xen grant table support Chris Wright
2006-07-19 10:04   ` [Xen-devel] " Harry Butterworth
2006-07-25 18:30   ` Hollis Blanchard
2006-07-25 18:45     ` Keir Fraser
2006-07-25 19:06     ` Segher Boessenkool
2006-07-18  7:00 ` [RFC PATCH 29/33] Add Xen driver utility functions Chris Wright
2006-07-18  7:00 ` [RFC PATCH 30/33] Add the Xenbus sysfs and virtual device hotplug driver Chris Wright
2006-07-18  7:00 ` [RFC PATCH 31/33] Add Xen subarch reboot support Chris Wright
2006-07-20  6:16   ` Adrian Bunk
2006-07-18  7:00 ` [RFC PATCH 32/33] Add the Xen virtual network device driver Chris Wright
2006-07-18 10:27   ` Arjan van de Ven
2006-07-18 10:35     ` Keir Fraser
2006-07-18 10:42       ` Arjan van de Ven
2006-07-18 12:18         ` Dave Boutcher
2006-07-18 12:39     ` jamal
2006-07-18 13:08       ` Herbert Xu
2006-07-18 13:25         ` John Haller
2006-07-18 15:22           ` Herbert Xu
2006-07-18 15:44   ` Stephen Hemminger
2006-07-19  3:55     ` Herbert Xu
2006-07-18 20:42   ` David Miller
2006-07-18 21:09     ` Chris Wright
2006-07-18  7:00 ` [RFC PATCH 33/33] Add Xen virtual block " Chris Wright
2006-07-18 10:34   ` Arjan van de Ven
2006-07-18 20:57     ` Jeremy Fitzhardinge
2006-07-18 13:01   ` Dave Boutcher
2006-07-18 16:25     ` Jeff Garzik
2006-07-18 19:28     ` Chris Wright
2006-07-18 21:22     ` Jeremy Fitzhardinge

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1153249601.5467.31.camel@localhost.localdomain \
    --to=rusty@rustcorp.com.au \
    --cc=Christian.Limpach@cl.cam.ac.uk \
    --cc=ak@suse.de \
    --cc=akpm@osdl.org \
    --cc=chrisw@sous-sol.org \
    --cc=ian.pratt@xensource.com \
    --cc=jeremy@goop.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=virtualization@lists.osdl.org \
    --cc=xen-devel@lists.xensource.com \
    --cc=zach@vmware.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome