Skip to content

Commit d92da1f

Browse files
committed
Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pull arm64 fixes from Catalin Marinas: "Mostly fixes apart from the kprobe blacklist checking which was deferred because of conflicting with a fix merged after I pinned the arm64 for-next/core branch (f2b3d85 "arm64: kprobe: Always blacklist the KVM world-switch code"). Summary: - Update the kprobe blacklist checking for arm64. This was supposed to be queued during the merging window but, due to conflicts, it was deferred post -rc1 - Extend the Fujitsu erratum 010001 workaround to A64FX v1r0 - Whitelist HiSilicon Taishan v110 CPUs as not susceptible to Meltdown - Export save_stack_trace_regs() - Remove obsolete selection of MULTI_IRQ_HANDLER" * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: arm64: remove obsolete selection of MULTI_IRQ_HANDLER arm64: kpti: Whitelist HiSilicon Taishan v110 CPUs arm64: Add MIDR encoding for HiSilicon Taishan CPUs arm64/stacktrace: Export save_stack_trace_regs() arm64: apply workaround on A64FX v1r0 arm64: kprobes: Use arch_populate_kprobe_blacklist() arm64: kprobes: Move exception_text check in blacklist arm64: kprobes: Remove unneeded RODATA check arm64: kprobes: Move extable address check into arch_prepare_kprobe()
2 parents fb549c5 + e5a5af7 commit d92da1f

File tree

5 files changed

+38
-27
lines changed

5 files changed

+38
-27
lines changed

arch/arm64/Kconfig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,6 @@ config ARM64
159159
select IRQ_DOMAIN
160160
select IRQ_FORCED_THREADING
161161
select MODULES_USE_ELF_RELA
162-
select MULTI_IRQ_HANDLER
163162
select NEED_DMA_MAP_STATE
164163
select NEED_SG_DMA_LENGTH
165164
select OF

arch/arm64/include/asm/cputype.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
#define ARM_CPU_IMP_QCOM 0x51
7878
#define ARM_CPU_IMP_NVIDIA 0x4E
7979
#define ARM_CPU_IMP_FUJITSU 0x46
80+
#define ARM_CPU_IMP_HISI 0x48
8081

8182
#define ARM_CPU_PART_AEM_V8 0xD0F
8283
#define ARM_CPU_PART_FOUNDATION 0xD00
@@ -107,6 +108,8 @@
107108

108109
#define FUJITSU_CPU_PART_A64FX 0x001
109110

111+
#define HISI_CPU_PART_TSV110 0xD01
112+
110113
#define MIDR_CORTEX_A53 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A53)
111114
#define MIDR_CORTEX_A57 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A57)
112115
#define MIDR_CORTEX_A72 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A72)
@@ -126,10 +129,11 @@
126129
#define MIDR_NVIDIA_DENVER MIDR_CPU_MODEL(ARM_CPU_IMP_NVIDIA, NVIDIA_CPU_PART_DENVER)
127130
#define MIDR_NVIDIA_CARMEL MIDR_CPU_MODEL(ARM_CPU_IMP_NVIDIA, NVIDIA_CPU_PART_CARMEL)
128131
#define MIDR_FUJITSU_A64FX MIDR_CPU_MODEL(ARM_CPU_IMP_FUJITSU, FUJITSU_CPU_PART_A64FX)
132+
#define MIDR_HISI_TSV110 MIDR_CPU_MODEL(ARM_CPU_IMP_HISI, HISI_CPU_PART_TSV110)
129133

130134
/* Fujitsu Erratum 010001 affects A64FX 1.0 and 1.1, (v0r0 and v1r0) */
131135
#define MIDR_FUJITSU_ERRATUM_010001 MIDR_FUJITSU_A64FX
132-
#define MIDR_FUJITSU_ERRATUM_010001_MASK (~MIDR_VARIANT(1))
136+
#define MIDR_FUJITSU_ERRATUM_010001_MASK (~MIDR_CPU_VAR_REV(1, 0))
133137
#define TCR_CLEAR_FUJITSU_ERRATUM_010001 (TCR_NFD1 | TCR_NFD0)
134138

135139
#ifndef __ASSEMBLY__

arch/arm64/kernel/cpufeature.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -963,6 +963,7 @@ static bool unmap_kernel_at_el0(const struct arm64_cpu_capabilities *entry,
963963
MIDR_ALL_VERSIONS(MIDR_CORTEX_A57),
964964
MIDR_ALL_VERSIONS(MIDR_CORTEX_A72),
965965
MIDR_ALL_VERSIONS(MIDR_CORTEX_A73),
966+
MIDR_ALL_VERSIONS(MIDR_HISI_TSV110),
966967
{ /* sentinel */ }
967968
};
968969
char const *str = "command line option";

arch/arm64/kernel/probes/kprobes.c

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -91,19 +91,14 @@ static void __kprobes arch_simulate_insn(struct kprobe *p, struct pt_regs *regs)
9191
int __kprobes arch_prepare_kprobe(struct kprobe *p)
9292
{
9393
unsigned long probe_addr = (unsigned long)p->addr;
94-
extern char __start_rodata[];
95-
extern char __end_rodata[];
9694

9795
if (probe_addr & 0x3)
9896
return -EINVAL;
9997

10098
/* copy instruction */
10199
p->opcode = le32_to_cpu(*p->addr);
102100

103-
if (in_exception_text(probe_addr))
104-
return -EINVAL;
105-
if (probe_addr >= (unsigned long) __start_rodata &&
106-
probe_addr <= (unsigned long) __end_rodata)
101+
if (search_exception_tables(probe_addr))
107102
return -EINVAL;
108103

109104
/* decode instruction */
@@ -476,26 +471,37 @@ kprobe_breakpoint_handler(struct pt_regs *regs, unsigned int esr)
476471
return DBG_HOOK_HANDLED;
477472
}
478473

479-
bool arch_within_kprobe_blacklist(unsigned long addr)
474+
/*
475+
* Provide a blacklist of symbols identifying ranges which cannot be kprobed.
476+
* This blacklist is exposed to userspace via debugfs (kprobes/blacklist).
477+
*/
478+
int __init arch_populate_kprobe_blacklist(void)
480479
{
481-
if ((addr >= (unsigned long)__kprobes_text_start &&
482-
addr < (unsigned long)__kprobes_text_end) ||
483-
(addr >= (unsigned long)__entry_text_start &&
484-
addr < (unsigned long)__entry_text_end) ||
485-
(addr >= (unsigned long)__idmap_text_start &&
486-
addr < (unsigned long)__idmap_text_end) ||
487-
(addr >= (unsigned long)__hyp_text_start &&
488-
addr < (unsigned long)__hyp_text_end) ||
489-
!!search_exception_tables(addr))
490-
return true;
491-
492-
if (!is_kernel_in_hyp_mode()) {
493-
if ((addr >= (unsigned long)__hyp_idmap_text_start &&
494-
addr < (unsigned long)__hyp_idmap_text_end))
495-
return true;
496-
}
497-
498-
return false;
480+
int ret;
481+
482+
ret = kprobe_add_area_blacklist((unsigned long)__entry_text_start,
483+
(unsigned long)__entry_text_end);
484+
if (ret)
485+
return ret;
486+
ret = kprobe_add_area_blacklist((unsigned long)__irqentry_text_start,
487+
(unsigned long)__irqentry_text_end);
488+
if (ret)
489+
return ret;
490+
ret = kprobe_add_area_blacklist((unsigned long)__exception_text_start,
491+
(unsigned long)__exception_text_end);
492+
if (ret)
493+
return ret;
494+
ret = kprobe_add_area_blacklist((unsigned long)__idmap_text_start,
495+
(unsigned long)__idmap_text_end);
496+
if (ret)
497+
return ret;
498+
ret = kprobe_add_area_blacklist((unsigned long)__hyp_text_start,
499+
(unsigned long)__hyp_text_end);
500+
if (ret || is_kernel_in_hyp_mode())
501+
return ret;
502+
ret = kprobe_add_area_blacklist((unsigned long)__hyp_idmap_text_start,
503+
(unsigned long)__hyp_idmap_text_end);
504+
return ret;
499505
}
500506

501507
void __kprobes __used *trampoline_probe_handler(struct pt_regs *regs)

arch/arm64/kernel/stacktrace.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ void save_stack_trace_regs(struct pt_regs *regs, struct stack_trace *trace)
143143
if (trace->nr_entries < trace->max_entries)
144144
trace->entries[trace->nr_entries++] = ULONG_MAX;
145145
}
146+
EXPORT_SYMBOL_GPL(save_stack_trace_regs);
146147

147148
static noinline void __save_stack_trace(struct task_struct *tsk,
148149
struct stack_trace *trace, unsigned int nosched)

0 commit comments

Comments
 (0)