Skip to content

Commit 2221773

Browse files
committed
Merge tag 'x86_urgent_for_v5.17_rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 fixes from Borislav Petkov: - Fix the ptrace regset xfpregs_set() callback to behave according to the ABI - Handle poisoned pages properly in the SGX reclaimer code * tag 'x86_urgent_for_v5.17_rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/ptrace: Fix xfpregs_set()'s incorrect xmm clearing x86/sgx: Fix missing poison handling in reclaimer
2 parents 0b0894f + 44cad52 commit 2221773

File tree

3 files changed

+7
-16
lines changed

3 files changed

+7
-16
lines changed

arch/x86/kernel/cpu/sgx/main.c

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -344,10 +344,8 @@ static void sgx_reclaim_pages(void)
344344
{
345345
struct sgx_epc_page *chunk[SGX_NR_TO_SCAN];
346346
struct sgx_backing backing[SGX_NR_TO_SCAN];
347-
struct sgx_epc_section *section;
348347
struct sgx_encl_page *encl_page;
349348
struct sgx_epc_page *epc_page;
350-
struct sgx_numa_node *node;
351349
pgoff_t page_index;
352350
int cnt = 0;
353351
int ret;
@@ -418,13 +416,7 @@ static void sgx_reclaim_pages(void)
418416
kref_put(&encl_page->encl->refcount, sgx_encl_release);
419417
epc_page->flags &= ~SGX_EPC_PAGE_RECLAIMER_TRACKED;
420418

421-
section = &sgx_epc_sections[epc_page->section];
422-
node = section->node;
423-
424-
spin_lock(&node->lock);
425-
list_add_tail(&epc_page->list, &node->free_page_list);
426-
spin_unlock(&node->lock);
427-
atomic_long_inc(&sgx_nr_free_pages);
419+
sgx_free_epc_page(epc_page);
428420
}
429421
}
430422

arch/x86/kernel/fpu/regset.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,9 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset,
9191
const void *kbuf, const void __user *ubuf)
9292
{
9393
struct fpu *fpu = &target->thread.fpu;
94-
struct user32_fxsr_struct newstate;
94+
struct fxregs_state newstate;
9595
int ret;
9696

97-
BUILD_BUG_ON(sizeof(newstate) != sizeof(struct fxregs_state));
98-
9997
if (!cpu_feature_enabled(X86_FEATURE_FXSR))
10098
return -ENODEV;
10199

@@ -116,9 +114,10 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset,
116114
/* Copy the state */
117115
memcpy(&fpu->fpstate->regs.fxsave, &newstate, sizeof(newstate));
118116

119-
/* Clear xmm8..15 */
117+
/* Clear xmm8..15 for 32-bit callers */
120118
BUILD_BUG_ON(sizeof(fpu->__fpstate.regs.fxsave.xmm_space) != 16 * 16);
121-
memset(&fpu->fpstate->regs.fxsave.xmm_space[8], 0, 8 * 16);
119+
if (in_ia32_syscall())
120+
memset(&fpu->fpstate->regs.fxsave.xmm_space[8*4], 0, 8 * 16);
122121

123122
/* Mark FP and SSE as in use when XSAVE is enabled */
124123
if (use_xsave())

arch/x86/kernel/ptrace.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,7 +1224,7 @@ static struct user_regset x86_64_regsets[] __ro_after_init = {
12241224
},
12251225
[REGSET_FP] = {
12261226
.core_note_type = NT_PRFPREG,
1227-
.n = sizeof(struct user_i387_struct) / sizeof(long),
1227+
.n = sizeof(struct fxregs_state) / sizeof(long),
12281228
.size = sizeof(long), .align = sizeof(long),
12291229
.active = regset_xregset_fpregs_active, .regset_get = xfpregs_get, .set = xfpregs_set
12301230
},
@@ -1271,7 +1271,7 @@ static struct user_regset x86_32_regsets[] __ro_after_init = {
12711271
},
12721272
[REGSET_XFP] = {
12731273
.core_note_type = NT_PRXFPREG,
1274-
.n = sizeof(struct user32_fxsr_struct) / sizeof(u32),
1274+
.n = sizeof(struct fxregs_state) / sizeof(u32),
12751275
.size = sizeof(u32), .align = sizeof(u32),
12761276
.active = regset_xregset_fpregs_active, .regset_get = xfpregs_get, .set = xfpregs_set
12771277
},

0 commit comments

Comments
 (0)