diff options
Diffstat (limited to 'arch/x86/include/asm/system.h')
| -rw-r--r-- | arch/x86/include/asm/system.h | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/arch/x86/include/asm/system.h b/arch/x86/include/asm/system.h index f08f97374892..022a84386de8 100644 --- a/arch/x86/include/asm/system.h +++ b/arch/x86/include/asm/system.h | |||
| @@ -128,8 +128,6 @@ do { \ | |||
| 128 | "movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */ \ | 128 | "movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */ \ |
| 129 | "movq %P[threadrsp](%[next]),%%rsp\n\t" /* restore RSP */ \ | 129 | "movq %P[threadrsp](%[next]),%%rsp\n\t" /* restore RSP */ \ |
| 130 | "call __switch_to\n\t" \ | 130 | "call __switch_to\n\t" \ |
| 131 | ".globl thread_return\n" \ | ||
| 132 | "thread_return:\n\t" \ | ||
| 133 | "movq "__percpu_arg([current_task])",%%rsi\n\t" \ | 131 | "movq "__percpu_arg([current_task])",%%rsi\n\t" \ |
| 134 | __switch_canary \ | 132 | __switch_canary \ |
| 135 | "movq %P[thread_info](%%rsi),%%r8\n\t" \ | 133 | "movq %P[thread_info](%%rsi),%%r8\n\t" \ |
| @@ -157,19 +155,22 @@ extern void native_load_gs_index(unsigned); | |||
| 157 | * Load a segment. Fall back on loading the zero | 155 | * Load a segment. Fall back on loading the zero |
| 158 | * segment if something goes wrong.. | 156 | * segment if something goes wrong.. |
| 159 | */ | 157 | */ |
| 160 | #define loadsegment(seg, value) \ | 158 | #define loadsegment(seg, value) \ |
| 161 | asm volatile("\n" \ | 159 | do { \ |
| 162 | "1:\t" \ | 160 | unsigned short __val = (value); \ |
| 163 | "movl %k0,%%" #seg "\n" \ | 161 | \ |
| 164 | "2:\n" \ | 162 | asm volatile(" \n" \ |
| 165 | ".section .fixup,\"ax\"\n" \ | 163 | "1: movl %k0,%%" #seg " \n" \ |
| 166 | "3:\t" \ | 164 | \ |
| 167 | "movl %k1, %%" #seg "\n\t" \ | 165 | ".section .fixup,\"ax\" \n" \ |
| 168 | "jmp 2b\n" \ | 166 | "2: xorl %k0,%k0 \n" \ |
| 169 | ".previous\n" \ | 167 | " jmp 1b \n" \ |
| 170 | _ASM_EXTABLE(1b,3b) \ | 168 | ".previous \n" \ |
| 171 | : :"r" (value), "r" (0) : "memory") | 169 | \ |
| 172 | 170 | _ASM_EXTABLE(1b, 2b) \ | |
| 171 | \ | ||
| 172 | : "+r" (__val) : : "memory"); \ | ||
| 173 | } while (0) | ||
| 173 | 174 | ||
| 174 | /* | 175 | /* |
| 175 | * Save a segment register away | 176 | * Save a segment register away |
