forked from Minki/linux
A collection of MIPS fixes:
- Fill the struct cacheinfo shared_cpu_map field with sensible values, notably avoiding issues with perf which was unhappy in the absence of these values. - A boot fix for Loongson 2E & 2F machines which was fallout from some refactoring performed this cycle. - A Kconfig dependency fix for the Loongson CPU HWMon driver. - A couple of VDSO fixes, ensuring gettimeofday() behaves appropriately for kernel configurations that don't include support for a clocksource the VDSO can use & fixing the calling convention for the n32 & n64 VDSOs which would previously clobber the $gp/$28 register. - A build fix for vmlinuz compressed images which were inappropriately building with -fsanitize-coverage despite not being part of the kernel proper, then failing to link due to the missing __sanitizer_cov_trace_pc() function. - A couple of eBPF JIT fixes, including disabling it for MIPS32 due to a large number of issues with the code generated there & reflecting ISA dependencies in Kconfig to enforce that systems which don't support the JIT must include the interpreter. -----BEGIN PGP SIGNATURE----- iIwEABYIADQWIQRgLjeFAZEXQzy86/s+p5+stXUA3QUCXhDvJxYccGF1bGJ1cnRv bkBrZXJuZWwub3JnAAoJED6nn6y1dQDdULcBAJCyB5cBMSvl14q7jEICUKIZacaW OGYrhvpr6g9Dtg+fAP0WpYbIdY/JsydXlJC97CTm6saI5Oh2TDe6Cnl+kfloBw== =dadp -----END PGP SIGNATURE----- Merge tag 'mips_fixes_5.5_1' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux Pull MIPS fixes from Paul Burton: "A collection of MIPS fixes: - Fill the struct cacheinfo shared_cpu_map field with sensible values, notably avoiding issues with perf which was unhappy in the absence of these values. - A boot fix for Loongson 2E & 2F machines which was fallout from some refactoring performed this cycle. - A Kconfig dependency fix for the Loongson CPU HWMon driver. - A couple of VDSO fixes, ensuring gettimeofday() behaves appropriately for kernel configurations that don't include support for a clocksource the VDSO can use & fixing the calling convention for the n32 & n64 VDSOs which would previously clobber the $gp/$28 register. - A build fix for vmlinuz compressed images which were inappropriately building with -fsanitize-coverage despite not being part of the kernel proper, then failing to link due to the missing __sanitizer_cov_trace_pc() function. - A couple of eBPF JIT fixes, including disabling it for MIPS32 due to a large number of issues with the code generated there & reflecting ISA dependencies in Kconfig to enforce that systems which don't support the JIT must include the interpreter" * tag 'mips_fixes_5.5_1' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux: MIPS: Avoid VDSO ABI breakage due to global register variable MIPS: BPF: eBPF JIT: check for MIPS ISA compliance in Kconfig MIPS: BPF: Disable MIPS32 eBPF JIT MIPS: Prevent link failure with kcov instrumentation MIPS: Kconfig: Use correct form for 'depends on' mips: Fix gettimeofday() in the vdso library MIPS: Fix boot on Fuloong2 systems mips: cacheinfo: report shared CPU map
This commit is contained in:
commit
c420ddda50
@ -47,7 +47,7 @@ config MIPS
|
|||||||
select HAVE_ARCH_TRACEHOOK
|
select HAVE_ARCH_TRACEHOOK
|
||||||
select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES
|
select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES
|
||||||
select HAVE_ASM_MODVERSIONS
|
select HAVE_ASM_MODVERSIONS
|
||||||
select HAVE_EBPF_JIT if (!CPU_MICROMIPS)
|
select HAVE_EBPF_JIT if 64BIT && !CPU_MICROMIPS && TARGET_ISA_REV >= 2
|
||||||
select HAVE_CONTEXT_TRACKING
|
select HAVE_CONTEXT_TRACKING
|
||||||
select HAVE_COPY_THREAD_TLS
|
select HAVE_COPY_THREAD_TLS
|
||||||
select HAVE_C_RECORDMCOUNT
|
select HAVE_C_RECORDMCOUNT
|
||||||
|
@ -29,6 +29,9 @@ KBUILD_AFLAGS := $(KBUILD_AFLAGS) -D__ASSEMBLY__ \
|
|||||||
-DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) \
|
-DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) \
|
||||||
-DKERNEL_ENTRY=$(VMLINUX_ENTRY_ADDRESS)
|
-DKERNEL_ENTRY=$(VMLINUX_ENTRY_ADDRESS)
|
||||||
|
|
||||||
|
# Prevents link failures: __sanitizer_cov_trace_pc() is not linked in.
|
||||||
|
KCOV_INSTRUMENT := n
|
||||||
|
|
||||||
# decompressor objects (linked with vmlinuz)
|
# decompressor objects (linked with vmlinuz)
|
||||||
vmlinuzobjs-y := $(obj)/head.o $(obj)/decompress.o $(obj)/string.o
|
vmlinuzobjs-y := $(obj)/head.o $(obj)/decompress.o $(obj)/string.o
|
||||||
|
|
||||||
|
@ -15,7 +15,8 @@
|
|||||||
static inline int __pure __get_cpu_type(const int cpu_type)
|
static inline int __pure __get_cpu_type(const int cpu_type)
|
||||||
{
|
{
|
||||||
switch (cpu_type) {
|
switch (cpu_type) {
|
||||||
#if defined(CONFIG_SYS_HAS_CPU_LOONGSON2EF)
|
#if defined(CONFIG_SYS_HAS_CPU_LOONGSON2E) || \
|
||||||
|
defined(CONFIG_SYS_HAS_CPU_LOONGSON2F)
|
||||||
case CPU_LOONGSON2EF:
|
case CPU_LOONGSON2EF:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -49,8 +49,26 @@ struct thread_info {
|
|||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
}
|
}
|
||||||
|
|
||||||
/* How to get the thread information struct from C. */
|
/*
|
||||||
|
* A pointer to the struct thread_info for the currently executing thread is
|
||||||
|
* held in register $28/$gp.
|
||||||
|
*
|
||||||
|
* We declare __current_thread_info as a global register variable rather than a
|
||||||
|
* local register variable within current_thread_info() because clang doesn't
|
||||||
|
* support explicit local register variables.
|
||||||
|
*
|
||||||
|
* When building the VDSO we take care not to declare the global register
|
||||||
|
* variable because this causes GCC to not preserve the value of $28/$gp in
|
||||||
|
* functions that change its value (which is common in the PIC VDSO when
|
||||||
|
* accessing the GOT). Since the VDSO shouldn't be accessing
|
||||||
|
* __current_thread_info anyway we declare it extern in order to cause a link
|
||||||
|
* failure if it's referenced.
|
||||||
|
*/
|
||||||
|
#ifdef __VDSO__
|
||||||
|
extern struct thread_info *__current_thread_info;
|
||||||
|
#else
|
||||||
register struct thread_info *__current_thread_info __asm__("$28");
|
register struct thread_info *__current_thread_info __asm__("$28");
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline struct thread_info *current_thread_info(void)
|
static inline struct thread_info *current_thread_info(void)
|
||||||
{
|
{
|
||||||
|
@ -26,8 +26,6 @@
|
|||||||
|
|
||||||
#define __VDSO_USE_SYSCALL ULLONG_MAX
|
#define __VDSO_USE_SYSCALL ULLONG_MAX
|
||||||
|
|
||||||
#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
|
|
||||||
|
|
||||||
static __always_inline long gettimeofday_fallback(
|
static __always_inline long gettimeofday_fallback(
|
||||||
struct __kernel_old_timeval *_tv,
|
struct __kernel_old_timeval *_tv,
|
||||||
struct timezone *_tz)
|
struct timezone *_tz)
|
||||||
@ -48,17 +46,6 @@ static __always_inline long gettimeofday_fallback(
|
|||||||
return error ? -ret : ret;
|
return error ? -ret : ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static __always_inline long gettimeofday_fallback(
|
|
||||||
struct __kernel_old_timeval *_tv,
|
|
||||||
struct timezone *_tz)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static __always_inline long clock_gettime_fallback(
|
static __always_inline long clock_gettime_fallback(
|
||||||
clockid_t _clkid,
|
clockid_t _clkid,
|
||||||
struct __kernel_timespec *_ts)
|
struct __kernel_timespec *_ts)
|
||||||
|
@ -50,6 +50,25 @@ static int __init_cache_level(unsigned int cpu)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void fill_cpumask_siblings(int cpu, cpumask_t *cpu_map)
|
||||||
|
{
|
||||||
|
int cpu1;
|
||||||
|
|
||||||
|
for_each_possible_cpu(cpu1)
|
||||||
|
if (cpus_are_siblings(cpu, cpu1))
|
||||||
|
cpumask_set_cpu(cpu1, cpu_map);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fill_cpumask_cluster(int cpu, cpumask_t *cpu_map)
|
||||||
|
{
|
||||||
|
int cpu1;
|
||||||
|
int cluster = cpu_cluster(&cpu_data[cpu]);
|
||||||
|
|
||||||
|
for_each_possible_cpu(cpu1)
|
||||||
|
if (cpu_cluster(&cpu_data[cpu1]) == cluster)
|
||||||
|
cpumask_set_cpu(cpu1, cpu_map);
|
||||||
|
}
|
||||||
|
|
||||||
static int __populate_cache_leaves(unsigned int cpu)
|
static int __populate_cache_leaves(unsigned int cpu)
|
||||||
{
|
{
|
||||||
struct cpuinfo_mips *c = ¤t_cpu_data;
|
struct cpuinfo_mips *c = ¤t_cpu_data;
|
||||||
@ -57,14 +76,20 @@ static int __populate_cache_leaves(unsigned int cpu)
|
|||||||
struct cacheinfo *this_leaf = this_cpu_ci->info_list;
|
struct cacheinfo *this_leaf = this_cpu_ci->info_list;
|
||||||
|
|
||||||
if (c->icache.waysize) {
|
if (c->icache.waysize) {
|
||||||
|
/* L1 caches are per core */
|
||||||
|
fill_cpumask_siblings(cpu, &this_leaf->shared_cpu_map);
|
||||||
populate_cache(dcache, this_leaf, 1, CACHE_TYPE_DATA);
|
populate_cache(dcache, this_leaf, 1, CACHE_TYPE_DATA);
|
||||||
|
fill_cpumask_siblings(cpu, &this_leaf->shared_cpu_map);
|
||||||
populate_cache(icache, this_leaf, 1, CACHE_TYPE_INST);
|
populate_cache(icache, this_leaf, 1, CACHE_TYPE_INST);
|
||||||
} else {
|
} else {
|
||||||
populate_cache(dcache, this_leaf, 1, CACHE_TYPE_UNIFIED);
|
populate_cache(dcache, this_leaf, 1, CACHE_TYPE_UNIFIED);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->scache.waysize)
|
if (c->scache.waysize) {
|
||||||
|
/* L2 cache is per cluster */
|
||||||
|
fill_cpumask_cluster(cpu, &this_leaf->shared_cpu_map);
|
||||||
populate_cache(scache, this_leaf, 2, CACHE_TYPE_UNIFIED);
|
populate_cache(scache, this_leaf, 2, CACHE_TYPE_UNIFIED);
|
||||||
|
}
|
||||||
|
|
||||||
if (c->tcache.waysize)
|
if (c->tcache.waysize)
|
||||||
populate_cache(tcache, this_leaf, 3, CACHE_TYPE_UNIFIED);
|
populate_cache(tcache, this_leaf, 3, CACHE_TYPE_UNIFIED);
|
||||||
|
@ -1804,7 +1804,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
|
|||||||
unsigned int image_size;
|
unsigned int image_size;
|
||||||
u8 *image_ptr;
|
u8 *image_ptr;
|
||||||
|
|
||||||
if (!prog->jit_requested || MIPS_ISA_REV < 2)
|
if (!prog->jit_requested)
|
||||||
return prog;
|
return prog;
|
||||||
|
|
||||||
tmp = bpf_jit_blind_constants(prog);
|
tmp = bpf_jit_blind_constants(prog);
|
||||||
|
@ -17,12 +17,22 @@ int __vdso_clock_gettime(clockid_t clock,
|
|||||||
return __cvdso_clock_gettime32(clock, ts);
|
return __cvdso_clock_gettime32(clock, ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is behind the ifdef so that we don't provide the symbol when there's no
|
||||||
|
* possibility of there being a usable clocksource, because there's nothing we
|
||||||
|
* can do without it. When libc fails the symbol lookup it should fall back on
|
||||||
|
* the standard syscall path.
|
||||||
|
*/
|
||||||
int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
|
int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
|
||||||
struct timezone *tz)
|
struct timezone *tz)
|
||||||
{
|
{
|
||||||
return __cvdso_gettimeofday(tv, tz);
|
return __cvdso_gettimeofday(tv, tz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_MIPS_CLOCK_VSYSCALL */
|
||||||
|
|
||||||
int __vdso_clock_getres(clockid_t clock_id,
|
int __vdso_clock_getres(clockid_t clock_id,
|
||||||
struct old_timespec32 *res)
|
struct old_timespec32 *res)
|
||||||
{
|
{
|
||||||
@ -43,12 +53,22 @@ int __vdso_clock_gettime(clockid_t clock,
|
|||||||
return __cvdso_clock_gettime(clock, ts);
|
return __cvdso_clock_gettime(clock, ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is behind the ifdef so that we don't provide the symbol when there's no
|
||||||
|
* possibility of there being a usable clocksource, because there's nothing we
|
||||||
|
* can do without it. When libc fails the symbol lookup it should fall back on
|
||||||
|
* the standard syscall path.
|
||||||
|
*/
|
||||||
int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
|
int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
|
||||||
struct timezone *tz)
|
struct timezone *tz)
|
||||||
{
|
{
|
||||||
return __cvdso_gettimeofday(tv, tz);
|
return __cvdso_gettimeofday(tv, tz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_MIPS_CLOCK_VSYSCALL */
|
||||||
|
|
||||||
int __vdso_clock_getres(clockid_t clock_id,
|
int __vdso_clock_getres(clockid_t clock_id,
|
||||||
struct __kernel_timespec *res)
|
struct __kernel_timespec *res)
|
||||||
{
|
{
|
||||||
|
@ -18,7 +18,7 @@ if MIPS_PLATFORM_DEVICES
|
|||||||
|
|
||||||
config CPU_HWMON
|
config CPU_HWMON
|
||||||
tristate "Loongson-3 CPU HWMon Driver"
|
tristate "Loongson-3 CPU HWMon Driver"
|
||||||
depends on CONFIG_MACH_LOONGSON64
|
depends on MACH_LOONGSON64
|
||||||
select HWMON
|
select HWMON
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
|
Loading…
Reference in New Issue
Block a user