hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/arch/x86/kernel/process_32.c
....@@ -39,53 +39,43 @@
3939 #include <linux/kdebug.h>
4040 #include <linux/syscalls.h>
4141
42
-#include <asm/pgtable.h>
4342 #include <asm/ldt.h>
4443 #include <asm/processor.h>
4544 #include <asm/fpu/internal.h>
4645 #include <asm/desc.h>
47
-#ifdef CONFIG_MATH_EMULATION
48
-#include <asm/math_emu.h>
49
-#endif
5046
5147 #include <linux/err.h>
5248
5349 #include <asm/tlbflush.h>
5450 #include <asm/cpu.h>
55
-#include <asm/syscalls.h>
5651 #include <asm/debugreg.h>
5752 #include <asm/switch_to.h>
5853 #include <asm/vm86.h>
59
-#include <asm/intel_rdt_sched.h>
54
+#include <asm/resctrl.h>
6055 #include <asm/proto.h>
6156
6257 #include "process.h"
6358
64
-void __show_regs(struct pt_regs *regs, enum show_regs_mode mode)
59
+void __show_regs(struct pt_regs *regs, enum show_regs_mode mode,
60
+ const char *log_lvl)
6561 {
6662 unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L;
6763 unsigned long d0, d1, d2, d3, d6, d7;
68
- unsigned long sp;
69
- unsigned short ss, gs;
64
+ unsigned short gs;
7065
71
- if (user_mode(regs)) {
72
- sp = regs->sp;
73
- ss = regs->ss;
66
+ if (user_mode(regs))
7467 gs = get_user_gs(regs);
75
- } else {
76
- sp = kernel_stack_pointer(regs);
77
- savesegment(ss, ss);
68
+ else
7869 savesegment(gs, gs);
79
- }
8070
81
- show_ip(regs, KERN_DEFAULT);
71
+ show_ip(regs, log_lvl);
8272
83
- printk(KERN_DEFAULT "EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n",
84
- regs->ax, regs->bx, regs->cx, regs->dx);
85
- printk(KERN_DEFAULT "ESI: %08lx EDI: %08lx EBP: %08lx ESP: %08lx\n",
86
- regs->si, regs->di, regs->bp, sp);
87
- printk(KERN_DEFAULT "DS: %04x ES: %04x FS: %04x GS: %04x SS: %04x EFLAGS: %08lx\n",
88
- (u16)regs->ds, (u16)regs->es, (u16)regs->fs, gs, ss, regs->flags);
73
+ printk("%sEAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n",
74
+ log_lvl, regs->ax, regs->bx, regs->cx, regs->dx);
75
+ printk("%sESI: %08lx EDI: %08lx EBP: %08lx ESP: %08lx\n",
76
+ log_lvl, regs->si, regs->di, regs->bp, regs->sp);
77
+ printk("%sDS: %04x ES: %04x FS: %04x GS: %04x SS: %04x EFLAGS: %08lx\n",
78
+ log_lvl, (u16)regs->ds, (u16)regs->es, (u16)regs->fs, gs, regs->ss, regs->flags);
8979
9080 if (mode != SHOW_REGS_ALL)
9181 return;
....@@ -94,8 +84,8 @@
9484 cr2 = read_cr2();
9585 cr3 = __read_cr3();
9686 cr4 = __read_cr4();
97
- printk(KERN_DEFAULT "CR0: %08lx CR2: %08lx CR3: %08lx CR4: %08lx\n",
98
- cr0, cr2, cr3, cr4);
87
+ printk("%sCR0: %08lx CR2: %08lx CR3: %08lx CR4: %08lx\n",
88
+ log_lvl, cr0, cr2, cr3, cr4);
9989
10090 get_debugreg(d0, 0);
10191 get_debugreg(d1, 1);
....@@ -109,84 +99,16 @@
10999 (d6 == DR6_RESERVED) && (d7 == 0x400))
110100 return;
111101
112
- printk(KERN_DEFAULT "DR0: %08lx DR1: %08lx DR2: %08lx DR3: %08lx\n",
113
- d0, d1, d2, d3);
114
- printk(KERN_DEFAULT "DR6: %08lx DR7: %08lx\n",
115
- d6, d7);
102
+ printk("%sDR0: %08lx DR1: %08lx DR2: %08lx DR3: %08lx\n",
103
+ log_lvl, d0, d1, d2, d3);
104
+ printk("%sDR6: %08lx DR7: %08lx\n",
105
+ log_lvl, d6, d7);
116106 }
117107
118108 void release_thread(struct task_struct *dead_task)
119109 {
120110 BUG_ON(dead_task->mm);
121111 release_vm86_irqs(dead_task);
122
-}
123
-
124
-int copy_thread_tls(unsigned long clone_flags, unsigned long sp,
125
- unsigned long arg, struct task_struct *p, unsigned long tls)
126
-{
127
- struct pt_regs *childregs = task_pt_regs(p);
128
- struct fork_frame *fork_frame = container_of(childregs, struct fork_frame, regs);
129
- struct inactive_task_frame *frame = &fork_frame->frame;
130
- struct task_struct *tsk;
131
- int err;
132
-
133
- /*
134
- * For a new task use the RESET flags value since there is no before.
135
- * All the status flags are zero; DF and all the system flags must also
136
- * be 0, specifically IF must be 0 because we context switch to the new
137
- * task with interrupts disabled.
138
- */
139
- frame->flags = X86_EFLAGS_FIXED;
140
- frame->bp = 0;
141
- frame->ret_addr = (unsigned long) ret_from_fork;
142
- p->thread.sp = (unsigned long) fork_frame;
143
- p->thread.sp0 = (unsigned long) (childregs+1);
144
- memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps));
145
-
146
- if (unlikely(p->flags & PF_KTHREAD)) {
147
- /* kernel thread */
148
- memset(childregs, 0, sizeof(struct pt_regs));
149
- frame->bx = sp; /* function */
150
- frame->di = arg;
151
- p->thread.io_bitmap_ptr = NULL;
152
- return 0;
153
- }
154
- frame->bx = 0;
155
- *childregs = *current_pt_regs();
156
- childregs->ax = 0;
157
- if (sp)
158
- childregs->sp = sp;
159
-
160
- task_user_gs(p) = get_user_gs(current_pt_regs());
161
-
162
- p->thread.io_bitmap_ptr = NULL;
163
- tsk = current;
164
- err = -ENOMEM;
165
-
166
- if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) {
167
- p->thread.io_bitmap_ptr = kmemdup(tsk->thread.io_bitmap_ptr,
168
- IO_BITMAP_BYTES, GFP_KERNEL);
169
- if (!p->thread.io_bitmap_ptr) {
170
- p->thread.io_bitmap_max = 0;
171
- return -ENOMEM;
172
- }
173
- set_tsk_thread_flag(p, TIF_IO_BITMAP);
174
- }
175
-
176
- err = 0;
177
-
178
- /*
179
- * Set a new TLS for the child thread?
180
- */
181
- if (clone_flags & CLONE_SETTLS)
182
- err = do_set_thread_area(p, -1,
183
- (struct user_desc __user *)tls, 0);
184
-
185
- if (err && p->thread.io_bitmap_ptr) {
186
- kfree(p->thread.io_bitmap_ptr);
187
- p->thread.io_bitmap_max = 0;
188
- }
189
- return err;
190112 }
191113
192114 void
....@@ -201,7 +123,6 @@
201123 regs->ip = new_ip;
202124 regs->sp = new_sp;
203125 regs->flags = X86_EFLAGS_IF;
204
- force_iret();
205126 }
206127 EXPORT_SYMBOL_GPL(start_thread);
207128
....@@ -238,13 +159,12 @@
238159 {
239160 struct thread_struct *prev = &prev_p->thread,
240161 *next = &next_p->thread;
241
- struct fpu *prev_fpu = &prev->fpu;
242
- struct fpu *next_fpu = &next->fpu;
243162 int cpu = smp_processor_id();
244163
245164 /* never put a printk in __switch_to... printk() calls wake_up*() indirectly */
246165
247
- switch_fpu_prepare(prev_fpu, cpu);
166
+ if (!test_thread_flag(TIF_NEED_FPU_LOAD))
167
+ switch_fpu_prepare(prev_p, cpu);
248168
249169 /*
250170 * Save away %gs. No need to save %fs, as it was saved on the
....@@ -263,23 +183,12 @@
263183 */
264184 load_TLS(next, cpu);
265185
266
- /*
267
- * Restore IOPL if needed. In normal use, the flags restore
268
- * in the switch assembly will handle this. But if the kernel
269
- * is running virtualized at a non-zero CPL, the popf will
270
- * not restore flags, so it must be done in a separate step.
271
- */
272
- if (get_kernel_rpl() && unlikely(prev->iopl != next->iopl))
273
- set_iopl_mask(next->iopl);
274
-
275186 switch_to_extra(prev_p, next_p);
276187
277188 /*
278189 * Leave lazy mode, flushing any hypercalls made here.
279190 * This must be done before restoring TLS segments so
280
- * the GDT and LDT are properly updated, and must be
281
- * done before fpu__restore(), so the TS bit is up
282
- * to date.
191
+ * the GDT and LDT are properly updated.
283192 */
284193 arch_end_context_switch(next_p);
285194
....@@ -300,12 +209,12 @@
300209 if (prev->gs | next->gs)
301210 lazy_load_gs(next->gs);
302211
303
- switch_fpu_finish(next_fpu, cpu);
304
-
305212 this_cpu_write(current_task, next_p);
306213
214
+ switch_fpu_finish(next_p);
215
+
307216 /* Load the Intel cache allocation PQR MSR. */
308
- intel_rdt_sched_in();
217
+ resctrl_sched_in(next_p);
309218
310219 return prev_p;
311220 }