[PATCH 04 of 36] x86: remove open-coded save/load segment operations

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Ingo Molnar <mingo@...>
Cc: LKML <linux-kernel@...>, <x86@...>, xen-devel <xen-devel@...>, Stephen Tweedie <sct@...>, Eduardo Habkost <ehabkost@...>, Mark McLoughlin <markmc@...>
Date: Wednesday, June 25, 2008 - 12:19 am

This removes a pile of buggy open-coded implementations of savesegment
and loadsegment.

(They are buggy because they don't have memory barriers to prevent
them from being reordered with respect to memory accesses.)

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/kernel/cpu/common_64.c |    3 ++-
 arch/x86/kernel/process_64.c    |   28 +++++++++++++++-------------
 2 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/arch/x86/kernel/cpu/common_64.c b/arch/x86/kernel/cpu/common_64.c
--- a/arch/x86/kernel/cpu/common_64.c
+++ b/arch/x86/kernel/cpu/common_64.c
@@ -480,7 +480,8 @@
 	struct x8664_pda *pda = cpu_pda(cpu);
 
 	/* Setup up data that may be needed in __get_free_pages early */
-	asm volatile("movl %0,%%fs ; movl %0,%%gs" :: "r" (0));
+	loadsegment(fs, 0);
+	loadsegment(gs, 0);
 	/* Memory clobbers used to order PDA accessed */
 	mb();
 	wrmsrl(MSR_GS_BASE, pda);
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -362,10 +362,10 @@
 	p->thread.fs = me->thread.fs;
 	p->thread.gs = me->thread.gs;
 
-	asm("mov %%gs,%0" : "=m" (p->thread.gsindex));
-	asm("mov %%fs,%0" : "=m" (p->thread.fsindex));
-	asm("mov %%es,%0" : "=m" (p->thread.es));
-	asm("mov %%ds,%0" : "=m" (p->thread.ds));
+	savesegment(gs, p->thread.gsindex);
+	savesegment(fs, p->thread.fsindex);
+	savesegment(es, p->thread.es);
+	savesegment(ds, p->thread.ds);
 
 	if (unlikely(test_tsk_thread_flag(me, TIF_IO_BITMAP))) {
 		p->thread.io_bitmap_ptr = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
@@ -404,7 +404,9 @@
 void
 start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
 {
-	asm volatile("movl %0, %%fs; movl %0, %%es; movl %0, %%ds" :: "r"(0));
+	loadsegment(fs, 0);
+	loadsegment(es, 0);
+	loadsegment(ds, 0);
 	load_gs_index(0);
 	regs->ip		= new_ip;
 	regs->sp		= new_sp;
@@ -591,11 +593,11 @@
 	 * Switch DS and ES.
 	 * This won't pick up thread selector changes, but I guess that is ok.
 	 */
-	asm volatile("mov %%es,%0" : "=m" (prev->es));
+	savesegment(es, prev->es);
 	if (unlikely(next->es | prev->es))
 		loadsegment(es, next->es); 
-	
-	asm volatile ("mov %%ds,%0" : "=m" (prev->ds));
+
+	savesegment(ds, prev->ds);
 	if (unlikely(next->ds | prev->ds))
 		loadsegment(ds, next->ds);
 
@@ -606,7 +608,7 @@
 	 */
 	{ 
 		unsigned fsindex;
-		asm volatile("movl %%fs,%0" : "=r" (fsindex)); 
+		savesegment(fs, fsindex);
 		/* segment register != 0 always requires a reload. 
 		   also reload when it has changed. 
 		   when prev process used 64bit base always reload
@@ -627,7 +629,7 @@
 	}
 	{ 
 		unsigned gsindex;
-		asm volatile("movl %%gs,%0" : "=r" (gsindex)); 
+		savesegment(gs, gsindex);
 		if (unlikely(gsindex | next->gsindex | prev->gs)) {
 			load_gs_index(next->gsindex);
 			if (gsindex)
@@ -807,7 +809,7 @@
 			set_32bit_tls(task, FS_TLS, addr);
 			if (doit) {
 				load_TLS(&task->thread, cpu);
-				asm volatile("movl %0,%%fs" :: "r"(FS_TLS_SEL));
+				loadsegment(fs, FS_TLS_SEL);
 			}
 			task->thread.fsindex = FS_TLS_SEL;
 			task->thread.fs = 0;
@@ -817,7 +819,7 @@
 			if (doit) {
 				/* set the selector to 0 to not confuse
 				   __switch_to */
-				asm volatile("movl %0,%%fs" :: "r" (0));
+				loadsegment(fs, 0);
 				ret = checking_wrmsrl(MSR_FS_BASE, addr);
 			}
 		}
@@ -840,7 +842,7 @@
 		if (task->thread.gsindex == GS_TLS_SEL)
 			base = read_32bit_tls(task, GS_TLS);
 		else if (doit) {
-			asm("movl %%gs,%0" : "=r" (gsindex));
+			savesegment(gs, gsindex);
 			if (gsindex)
 				rdmsrl(MSR_KERNEL_GS_BASE, base);
 			else


--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 00 of 36] x86/paravirt: groundwork for 64-bit Xen sup..., Jeremy Fitzhardinge, (Wed Jun 25, 12:18 am)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit Xen..., Jeremy Fitzhardinge, (Wed Jun 25, 4:03 pm)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit Xen..., Jeremy Fitzhardinge, (Wed Jun 25, 4:12 pm)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit Xen..., Jeremy Fitzhardinge, (Thu Jun 26, 3:02 pm)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit Xen..., Jeremy Fitzhardinge, (Thu Jun 26, 2:25 pm)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit Xen..., Jeremy Fitzhardinge, (Thu Jun 26, 10:28 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Thu Jun 26, 10:34 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Fri Jun 27, 3:04 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Sun Jun 29, 11:02 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Mon Jun 30, 7:04 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Tue Jul 1, 12:14 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Thu Jul 3, 2:25 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Thu Jul 3, 2:41 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Thu Jul 3, 11:47 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Tue Jul 1, 12:10 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Mon Jun 30, 1:57 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Mon Jun 30, 1:17 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Mon Jun 30, 2:36 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Mon Jun 30, 1:32 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Fri Jun 27, 12:02 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundwor..., Jeremy Fitzhardinge, (Fri Jun 27, 12:25 pm)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit Xen..., Jeremy Fitzhardinge, (Wed Jun 25, 7:46 am)
[PATCH 36 of 36] x86_64/paravirt: Make load_gs_index() a par..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
Re: [PATCH 36 of 36] x86_64/paravirt: Make load_gs_index() a..., Jeremy Fitzhardinge, (Wed Jun 25, 7:48 am)
[PATCH 26 of 36] x86_64: Split set_pte_vaddr(), Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 35 of 36] x86_64/paravirt: add adjust_exception_frame, Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 04 of 36] x86: remove open-coded save/load segment op..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 25 of 36] x86_64: PSE no longer a hard requirement, Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 18 of 36] x86/paravirt: add debugging for missing ope..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 01 of 36] x86: asm-x86/pgtable.h: fix compiler warning, Jeremy Fitzhardinge, (Wed Jun 25, 12:18 am)
[PATCH 32 of 36] Add sysret/sysexit pvops for returning to 3..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 31 of 36] x86_64 pvops: don't restore user rsp within..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 06 of 36] x86_64: use p??_populate() to attach pages ..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 07 of 36] x86_64: unify early_ioremap, Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 19 of 36] paravirt_ops: define PARA_INDIRECT for indi..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 28 of 36] Save %fs and %gs before load_TLS() and arch..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 30 of 36] x86/paravirt_ops: split sysret and sysexit, Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 21 of 36] x86-64: add FIX_PARAVIRT_BOOTMAP fixmap slot, Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 20 of 36] paravirt/x86_64: move __PAGE_OFFSET to leav..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 34 of 36] x86_64: swapgs pvop with a user-stack can n..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 05 of 36] x86_64: use write_gdt_entry in vsyscall_set..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 33 of 36] x86_64: ia32entry: replace privileged instr..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 27 of 36] x86_64: __switch_to(): Move arch_leave_lazy..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 29 of 36] Use __KERNEL_DS as SS when returning to a k..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 24 of 36] x86_64: create small vmemmap mappings if PS..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 10 of 36] x86: unify pgd_index, Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 11 of 36] x86: unify mmu_context.h, Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 08 of 36] x86_64: Add gate_offset() and gate_segment(..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 09 of 36] x86_64: Use __pgd() on mk_kernel_pgd(), Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 23 of 36] x86_64: adjust mapping of physical pagetabl..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 14 of 36] x86_64: add sync_cmpxchg, Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 03 of 36] x86: add memory barriers to wrmsr, Jeremy Fitzhardinge, (Wed Jun 25, 12:18 am)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Arjan van de Ven, (Wed Jun 25, 12:44 am)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Jeremy Fitzhardinge, (Wed Jun 25, 5:08 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Arjan van de Ven, (Wed Jun 25, 6:31 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, H. Peter Anvin, (Wed Jun 25, 7:18 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Jeremy Fitzhardinge, (Wed Jun 25, 7:37 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, H. Peter Anvin, (Wed Jun 25, 7:42 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Jeremy Fitzhardinge, (Wed Jun 25, 7:05 pm)
[PATCH 13 of 36] x86_64: add prototype for x86_64_start_kern..., Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 12 of 36] x86_64: replace end_pfn with num_physpages, Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 17 of 36] x86: preallocate and prepopulate separately, Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 15 of 36] x86: simplify vmalloc_sync_all, Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 22 of 36] x86_64: split x86_64_start_kernel, Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 16 of 36] x86/paravirt: add a pgd_alloc/free hooks, Jeremy Fitzhardinge, (Wed Jun 25, 12:19 am)
[PATCH 02 of 36] x86: add memory clobber to save/loadsegment, Jeremy Fitzhardinge, (Wed Jun 25, 12:18 am)