diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-02-17 11:44:38 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-02-17 11:44:38 -0500 |
commit | 8d33316d520501f24fef180ea5b860ecb9e64506 (patch) | |
tree | 4bbdca0d0a5022a65abc3af73745c930482073dd | |
parent | dd6f29da695dbfe5a8ff84ebfdd2110d68e8f511 (diff) | |
parent | f331e766c4be33f4338574f3c9f7f77e98ab4571 (diff) |
Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 fixes from Ingo Molnar:
"Three changes:
- An UV fix/quirk to pull UV BIOS calls into the efi_runtime_lock
locking regime. (This done by aliasing __efi_uv_runtime_lock to
efi_runtime_lock, which should make the quirk nature obvious and
maintain the general policy that the EFI lock (name...) isn't
exposed to drivers.)
- Our version of MAGA: Make a.out Great Again.
- Add a new Intel model name enumerator to an upstream header to help
reduce dependencies going forward"
* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
x86/platform/UV: Use efi_runtime_lock to serialise BIOS calls
x86/CPU: Add Icelake model number
x86/a.out: Clear the dump structure initially
-rw-r--r-- | arch/x86/ia32/ia32_aout.c | 6 | ||||
-rw-r--r-- | arch/x86/include/asm/intel-family.h | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/uv/bios.h | 8 | ||||
-rw-r--r-- | arch/x86/platform/uv/bios_uv.c | 23 | ||||
-rw-r--r-- | drivers/firmware/efi/runtime-wrappers.c | 7 |
5 files changed, 41 insertions, 5 deletions
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index f65b78d32f5e..7dbbe9ffda17 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c | |||
@@ -51,7 +51,7 @@ static unsigned long get_dr(int n) | |||
51 | /* | 51 | /* |
52 | * fill in the user structure for a core dump.. | 52 | * fill in the user structure for a core dump.. |
53 | */ | 53 | */ |
54 | static void dump_thread32(struct pt_regs *regs, struct user32 *dump) | 54 | static void fill_dump(struct pt_regs *regs, struct user32 *dump) |
55 | { | 55 | { |
56 | u32 fs, gs; | 56 | u32 fs, gs; |
57 | memset(dump, 0, sizeof(*dump)); | 57 | memset(dump, 0, sizeof(*dump)); |
@@ -157,10 +157,12 @@ static int aout_core_dump(struct coredump_params *cprm) | |||
157 | fs = get_fs(); | 157 | fs = get_fs(); |
158 | set_fs(KERNEL_DS); | 158 | set_fs(KERNEL_DS); |
159 | has_dumped = 1; | 159 | has_dumped = 1; |
160 | |||
161 | fill_dump(cprm->regs, &dump); | ||
162 | |||
160 | strncpy(dump.u_comm, current->comm, sizeof(current->comm)); | 163 | strncpy(dump.u_comm, current->comm, sizeof(current->comm)); |
161 | dump.u_ar0 = offsetof(struct user32, regs); | 164 | dump.u_ar0 = offsetof(struct user32, regs); |
162 | dump.signal = cprm->siginfo->si_signo; | 165 | dump.signal = cprm->siginfo->si_signo; |
163 | dump_thread32(cprm->regs, &dump); | ||
164 | 166 | ||
165 | /* | 167 | /* |
166 | * If the size of the dump file exceeds the rlimit, then see | 168 | * If the size of the dump file exceeds the rlimit, then see |
diff --git a/arch/x86/include/asm/intel-family.h b/arch/x86/include/asm/intel-family.h index d9a9993af882..9f15384c504a 100644 --- a/arch/x86/include/asm/intel-family.h +++ b/arch/x86/include/asm/intel-family.h | |||
@@ -52,6 +52,8 @@ | |||
52 | 52 | ||
53 | #define INTEL_FAM6_CANNONLAKE_MOBILE 0x66 | 53 | #define INTEL_FAM6_CANNONLAKE_MOBILE 0x66 |
54 | 54 | ||
55 | #define INTEL_FAM6_ICELAKE_MOBILE 0x7E | ||
56 | |||
55 | /* "Small Core" Processors (Atom) */ | 57 | /* "Small Core" Processors (Atom) */ |
56 | 58 | ||
57 | #define INTEL_FAM6_ATOM_BONNELL 0x1C /* Diamondville, Pineview */ | 59 | #define INTEL_FAM6_ATOM_BONNELL 0x1C /* Diamondville, Pineview */ |
diff --git a/arch/x86/include/asm/uv/bios.h b/arch/x86/include/asm/uv/bios.h index e652a7cc6186..3f697a9e3f59 100644 --- a/arch/x86/include/asm/uv/bios.h +++ b/arch/x86/include/asm/uv/bios.h | |||
@@ -48,7 +48,8 @@ enum { | |||
48 | BIOS_STATUS_SUCCESS = 0, | 48 | BIOS_STATUS_SUCCESS = 0, |
49 | BIOS_STATUS_UNIMPLEMENTED = -ENOSYS, | 49 | BIOS_STATUS_UNIMPLEMENTED = -ENOSYS, |
50 | BIOS_STATUS_EINVAL = -EINVAL, | 50 | BIOS_STATUS_EINVAL = -EINVAL, |
51 | BIOS_STATUS_UNAVAIL = -EBUSY | 51 | BIOS_STATUS_UNAVAIL = -EBUSY, |
52 | BIOS_STATUS_ABORT = -EINTR, | ||
52 | }; | 53 | }; |
53 | 54 | ||
54 | /* Address map parameters */ | 55 | /* Address map parameters */ |
@@ -167,4 +168,9 @@ extern long system_serial_number; | |||
167 | 168 | ||
168 | extern struct kobject *sgi_uv_kobj; /* /sys/firmware/sgi_uv */ | 169 | extern struct kobject *sgi_uv_kobj; /* /sys/firmware/sgi_uv */ |
169 | 170 | ||
171 | /* | ||
172 | * EFI runtime lock; cf. firmware/efi/runtime-wrappers.c for details | ||
173 | */ | ||
174 | extern struct semaphore __efi_uv_runtime_lock; | ||
175 | |||
170 | #endif /* _ASM_X86_UV_BIOS_H */ | 176 | #endif /* _ASM_X86_UV_BIOS_H */ |
diff --git a/arch/x86/platform/uv/bios_uv.c b/arch/x86/platform/uv/bios_uv.c index 4a6a5a26c582..eb33432f2f24 100644 --- a/arch/x86/platform/uv/bios_uv.c +++ b/arch/x86/platform/uv/bios_uv.c | |||
@@ -29,7 +29,8 @@ | |||
29 | 29 | ||
30 | struct uv_systab *uv_systab; | 30 | struct uv_systab *uv_systab; |
31 | 31 | ||
32 | s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5) | 32 | static s64 __uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, |
33 | u64 a4, u64 a5) | ||
33 | { | 34 | { |
34 | struct uv_systab *tab = uv_systab; | 35 | struct uv_systab *tab = uv_systab; |
35 | s64 ret; | 36 | s64 ret; |
@@ -51,6 +52,19 @@ s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5) | |||
51 | 52 | ||
52 | return ret; | 53 | return ret; |
53 | } | 54 | } |
55 | |||
56 | s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5) | ||
57 | { | ||
58 | s64 ret; | ||
59 | |||
60 | if (down_interruptible(&__efi_uv_runtime_lock)) | ||
61 | return BIOS_STATUS_ABORT; | ||
62 | |||
63 | ret = __uv_bios_call(which, a1, a2, a3, a4, a5); | ||
64 | up(&__efi_uv_runtime_lock); | ||
65 | |||
66 | return ret; | ||
67 | } | ||
54 | EXPORT_SYMBOL_GPL(uv_bios_call); | 68 | EXPORT_SYMBOL_GPL(uv_bios_call); |
55 | 69 | ||
56 | s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, | 70 | s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, |
@@ -59,10 +73,15 @@ s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, | |||
59 | unsigned long bios_flags; | 73 | unsigned long bios_flags; |
60 | s64 ret; | 74 | s64 ret; |
61 | 75 | ||
76 | if (down_interruptible(&__efi_uv_runtime_lock)) | ||
77 | return BIOS_STATUS_ABORT; | ||
78 | |||
62 | local_irq_save(bios_flags); | 79 | local_irq_save(bios_flags); |
63 | ret = uv_bios_call(which, a1, a2, a3, a4, a5); | 80 | ret = __uv_bios_call(which, a1, a2, a3, a4, a5); |
64 | local_irq_restore(bios_flags); | 81 | local_irq_restore(bios_flags); |
65 | 82 | ||
83 | up(&__efi_uv_runtime_lock); | ||
84 | |||
66 | return ret; | 85 | return ret; |
67 | } | 86 | } |
68 | 87 | ||
diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c index 8903b9ccfc2b..e2abfdb5cee6 100644 --- a/drivers/firmware/efi/runtime-wrappers.c +++ b/drivers/firmware/efi/runtime-wrappers.c | |||
@@ -147,6 +147,13 @@ void efi_call_virt_check_flags(unsigned long flags, const char *call) | |||
147 | static DEFINE_SEMAPHORE(efi_runtime_lock); | 147 | static DEFINE_SEMAPHORE(efi_runtime_lock); |
148 | 148 | ||
149 | /* | 149 | /* |
150 | * Expose the EFI runtime lock to the UV platform | ||
151 | */ | ||
152 | #ifdef CONFIG_X86_UV | ||
153 | extern struct semaphore __efi_uv_runtime_lock __alias(efi_runtime_lock); | ||
154 | #endif | ||
155 | |||
156 | /* | ||
150 | * Calls the appropriate efi_runtime_service() with the appropriate | 157 | * Calls the appropriate efi_runtime_service() with the appropriate |
151 | * arguments. | 158 | * arguments. |
152 | * | 159 | * |