mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
Merge branches 'fixes', 'misc' and 'spectre' into for-linus
This commit is contained in:
@@ -447,6 +447,14 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
|
||||
.size \name , . - \name
|
||||
.endm
|
||||
|
||||
.macro csdb
|
||||
#ifdef CONFIG_THUMB2_KERNEL
|
||||
.inst.w 0xf3af8014
|
||||
#else
|
||||
.inst 0xe320f014
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro check_uaccess, addr:req, size:req, limit:req, tmp:req, bad:req
|
||||
#ifndef CONFIG_CPU_USE_DOMAINS
|
||||
adds \tmp, \addr, #\size - 1
|
||||
|
||||
@@ -17,6 +17,12 @@
|
||||
#define isb(option) __asm__ __volatile__ ("isb " #option : : : "memory")
|
||||
#define dsb(option) __asm__ __volatile__ ("dsb " #option : : : "memory")
|
||||
#define dmb(option) __asm__ __volatile__ ("dmb " #option : : : "memory")
|
||||
#ifdef CONFIG_THUMB2_KERNEL
|
||||
#define CSDB ".inst.w 0xf3af8014"
|
||||
#else
|
||||
#define CSDB ".inst 0xe320f014"
|
||||
#endif
|
||||
#define csdb() __asm__ __volatile__(CSDB : : : "memory")
|
||||
#elif defined(CONFIG_CPU_XSC3) || __LINUX_ARM_ARCH__ == 6
|
||||
#define isb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \
|
||||
: : "r" (0) : "memory")
|
||||
@@ -37,6 +43,13 @@
|
||||
#define dmb(x) __asm__ __volatile__ ("" : : : "memory")
|
||||
#endif
|
||||
|
||||
#ifndef CSDB
|
||||
#define CSDB
|
||||
#endif
|
||||
#ifndef csdb
|
||||
#define csdb()
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARM_HEAVY_MB
|
||||
extern void (*soc_mb)(void);
|
||||
extern void arm_heavy_mb(void);
|
||||
@@ -63,6 +76,25 @@ extern void arm_heavy_mb(void);
|
||||
#define __smp_rmb() __smp_mb()
|
||||
#define __smp_wmb() dmb(ishst)
|
||||
|
||||
#ifdef CONFIG_CPU_SPECTRE
|
||||
static inline unsigned long array_index_mask_nospec(unsigned long idx,
|
||||
unsigned long sz)
|
||||
{
|
||||
unsigned long mask;
|
||||
|
||||
asm volatile(
|
||||
"cmp %1, %2\n"
|
||||
" sbc %0, %1, %1\n"
|
||||
CSDB
|
||||
: "=r" (mask)
|
||||
: "r" (idx), "Ir" (sz)
|
||||
: "cc");
|
||||
|
||||
return mask;
|
||||
}
|
||||
#define array_index_mask_nospec array_index_mask_nospec
|
||||
#endif
|
||||
|
||||
#include <asm-generic/barrier.h>
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
@@ -10,12 +10,14 @@
|
||||
#ifndef __ASM_BUGS_H
|
||||
#define __ASM_BUGS_H
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
extern void check_writebuffer_bugs(void);
|
||||
|
||||
#define check_bugs() check_writebuffer_bugs()
|
||||
#ifdef CONFIG_MMU
|
||||
extern void check_bugs(void);
|
||||
extern void check_other_bugs(void);
|
||||
#else
|
||||
#define check_bugs() do { } while (0)
|
||||
#define check_other_bugs() do { } while (0)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -65,6 +65,9 @@
|
||||
#define __write_sysreg(v, r, w, c, t) asm volatile(w " " c : : "r" ((t)(v)))
|
||||
#define write_sysreg(v, ...) __write_sysreg(v, __VA_ARGS__)
|
||||
|
||||
#define BPIALL __ACCESS_CP15(c7, 0, c5, 6)
|
||||
#define ICIALLU __ACCESS_CP15(c7, 0, c5, 0)
|
||||
|
||||
extern unsigned long cr_alignment; /* defined in entry-armv.S */
|
||||
|
||||
static inline unsigned long get_cr(void)
|
||||
|
||||
@@ -77,8 +77,16 @@
|
||||
#define ARM_CPU_PART_CORTEX_A12 0x4100c0d0
|
||||
#define ARM_CPU_PART_CORTEX_A17 0x4100c0e0
|
||||
#define ARM_CPU_PART_CORTEX_A15 0x4100c0f0
|
||||
#define ARM_CPU_PART_CORTEX_A53 0x4100d030
|
||||
#define ARM_CPU_PART_CORTEX_A57 0x4100d070
|
||||
#define ARM_CPU_PART_CORTEX_A72 0x4100d080
|
||||
#define ARM_CPU_PART_CORTEX_A73 0x4100d090
|
||||
#define ARM_CPU_PART_CORTEX_A75 0x4100d0a0
|
||||
#define ARM_CPU_PART_MASK 0xff00fff0
|
||||
|
||||
/* Broadcom cores */
|
||||
#define ARM_CPU_PART_BRAHMA_B15 0x420000f0
|
||||
|
||||
/* DEC implemented cores */
|
||||
#define ARM_CPU_PART_SA1100 0x4400a110
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@ extern int kgdb_fault_expected;
|
||||
|
||||
#define KGDB_MAX_NO_CPUS 1
|
||||
#define BUFMAX 400
|
||||
#define NUMREGBYTES (DBG_MAX_REG_NUM << 2)
|
||||
#define NUMREGBYTES (GDB_MAX_REGS << 2)
|
||||
#define NUMCRITREGBYTES (32 << 2)
|
||||
|
||||
#define _R0 0
|
||||
|
||||
@@ -61,8 +61,6 @@ struct kvm_vcpu;
|
||||
extern char __kvm_hyp_init[];
|
||||
extern char __kvm_hyp_init_end[];
|
||||
|
||||
extern char __kvm_hyp_vector[];
|
||||
|
||||
extern void __kvm_flush_vm_context(void);
|
||||
extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
|
||||
extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/kvm_types.h>
|
||||
#include <asm/cputype.h>
|
||||
#include <asm/kvm.h>
|
||||
#include <asm/kvm_asm.h>
|
||||
#include <asm/kvm_mmio.h>
|
||||
@@ -308,8 +309,17 @@ static inline void kvm_arm_vhe_guest_exit(void) {}
|
||||
|
||||
static inline bool kvm_arm_harden_branch_predictor(void)
|
||||
{
|
||||
/* No way to detect it yet, pretend it is not there. */
|
||||
return false;
|
||||
switch(read_cpuid_part()) {
|
||||
#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
|
||||
case ARM_CPU_PART_BRAHMA_B15:
|
||||
case ARM_CPU_PART_CORTEX_A12:
|
||||
case ARM_CPU_PART_CORTEX_A15:
|
||||
case ARM_CPU_PART_CORTEX_A17:
|
||||
return true;
|
||||
#endif
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void kvm_vcpu_load_sysregs(struct kvm_vcpu *vcpu) {}
|
||||
|
||||
@@ -311,7 +311,28 @@ static inline unsigned int kvm_get_vmid_bits(void)
|
||||
|
||||
static inline void *kvm_get_hyp_vector(void)
|
||||
{
|
||||
return kvm_ksym_ref(__kvm_hyp_vector);
|
||||
switch(read_cpuid_part()) {
|
||||
#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
|
||||
case ARM_CPU_PART_CORTEX_A12:
|
||||
case ARM_CPU_PART_CORTEX_A17:
|
||||
{
|
||||
extern char __kvm_hyp_vector_bp_inv[];
|
||||
return kvm_ksym_ref(__kvm_hyp_vector_bp_inv);
|
||||
}
|
||||
|
||||
case ARM_CPU_PART_BRAHMA_B15:
|
||||
case ARM_CPU_PART_CORTEX_A15:
|
||||
{
|
||||
extern char __kvm_hyp_vector_ic_inv[];
|
||||
return kvm_ksym_ref(__kvm_hyp_vector_ic_inv);
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
{
|
||||
extern char __kvm_hyp_vector[];
|
||||
return kvm_ksym_ref(__kvm_hyp_vector);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline int kvm_map_vectors(void)
|
||||
|
||||
+77
-35
@@ -12,60 +12,101 @@
|
||||
/* ID_MMFR0 data relevant to MPU */
|
||||
#define MMFR0_PMSA (0xF << 4)
|
||||
#define MMFR0_PMSAv7 (3 << 4)
|
||||
#define MMFR0_PMSAv8 (4 << 4)
|
||||
|
||||
/* MPU D/I Size Register fields */
|
||||
#define MPU_RSR_SZ 1
|
||||
#define MPU_RSR_EN 0
|
||||
#define MPU_RSR_SD 8
|
||||
#define PMSAv7_RSR_SZ 1
|
||||
#define PMSAv7_RSR_EN 0
|
||||
#define PMSAv7_RSR_SD 8
|
||||
|
||||
/* Number of subregions (SD) */
|
||||
#define MPU_NR_SUBREGS 8
|
||||
#define MPU_MIN_SUBREG_SIZE 256
|
||||
#define PMSAv7_NR_SUBREGS 8
|
||||
#define PMSAv7_MIN_SUBREG_SIZE 256
|
||||
|
||||
/* The D/I RSR value for an enabled region spanning the whole of memory */
|
||||
#define MPU_RSR_ALL_MEM 63
|
||||
#define PMSAv7_RSR_ALL_MEM 63
|
||||
|
||||
/* Individual bits in the DR/IR ACR */
|
||||
#define MPU_ACR_XN (1 << 12)
|
||||
#define MPU_ACR_SHARED (1 << 2)
|
||||
#define PMSAv7_ACR_XN (1 << 12)
|
||||
#define PMSAv7_ACR_SHARED (1 << 2)
|
||||
|
||||
/* C, B and TEX[2:0] bits only have semantic meanings when grouped */
|
||||
#define MPU_RGN_CACHEABLE 0xB
|
||||
#define MPU_RGN_SHARED_CACHEABLE (MPU_RGN_CACHEABLE | MPU_ACR_SHARED)
|
||||
#define MPU_RGN_STRONGLY_ORDERED 0
|
||||
#define PMSAv7_RGN_CACHEABLE 0xB
|
||||
#define PMSAv7_RGN_SHARED_CACHEABLE (PMSAv7_RGN_CACHEABLE | PMSAv7_ACR_SHARED)
|
||||
#define PMSAv7_RGN_STRONGLY_ORDERED 0
|
||||
|
||||
/* Main region should only be shared for SMP */
|
||||
#ifdef CONFIG_SMP
|
||||
#define MPU_RGN_NORMAL (MPU_RGN_CACHEABLE | MPU_ACR_SHARED)
|
||||
#define PMSAv7_RGN_NORMAL (PMSAv7_RGN_CACHEABLE | PMSAv7_ACR_SHARED)
|
||||
#else
|
||||
#define MPU_RGN_NORMAL MPU_RGN_CACHEABLE
|
||||
#define PMSAv7_RGN_NORMAL PMSAv7_RGN_CACHEABLE
|
||||
#endif
|
||||
|
||||
/* Access permission bits of ACR (only define those that we use)*/
|
||||
#define MPU_AP_PL1RO_PL0NA (0x5 << 8)
|
||||
#define MPU_AP_PL1RW_PL0RW (0x3 << 8)
|
||||
#define MPU_AP_PL1RW_PL0R0 (0x2 << 8)
|
||||
#define MPU_AP_PL1RW_PL0NA (0x1 << 8)
|
||||
#define PMSAv7_AP_PL1RO_PL0NA (0x5 << 8)
|
||||
#define PMSAv7_AP_PL1RW_PL0RW (0x3 << 8)
|
||||
#define PMSAv7_AP_PL1RW_PL0R0 (0x2 << 8)
|
||||
#define PMSAv7_AP_PL1RW_PL0NA (0x1 << 8)
|
||||
|
||||
#define PMSAv8_BAR_XN 1
|
||||
|
||||
#define PMSAv8_LAR_EN 1
|
||||
#define PMSAv8_LAR_IDX(n) (((n) & 0x7) << 1)
|
||||
|
||||
|
||||
#define PMSAv8_AP_PL1RW_PL0NA (0 << 1)
|
||||
#define PMSAv8_AP_PL1RW_PL0RW (1 << 1)
|
||||
#define PMSAv8_AP_PL1RO_PL0RO (3 << 1)
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define PMSAv8_RGN_SHARED (3 << 3) // inner sharable
|
||||
#else
|
||||
#define PMSAv8_RGN_SHARED (0 << 3)
|
||||
#endif
|
||||
|
||||
#define PMSAv8_RGN_DEVICE_nGnRnE 0
|
||||
#define PMSAv8_RGN_NORMAL 1
|
||||
|
||||
#define PMSAv8_MAIR(attr, mt) ((attr) << ((mt) * 8))
|
||||
|
||||
#ifdef CONFIG_CPU_V7M
|
||||
#define PMSAv8_MINALIGN 32
|
||||
#else
|
||||
#define PMSAv8_MINALIGN 64
|
||||
#endif
|
||||
|
||||
/* For minimal static MPU region configurations */
|
||||
#define MPU_PROBE_REGION 0
|
||||
#define MPU_BG_REGION 1
|
||||
#define MPU_RAM_REGION 2
|
||||
#define MPU_ROM_REGION 3
|
||||
#define PMSAv7_PROBE_REGION 0
|
||||
#define PMSAv7_BG_REGION 1
|
||||
#define PMSAv7_RAM_REGION 2
|
||||
#define PMSAv7_ROM_REGION 3
|
||||
|
||||
/* Fixed for PMSAv8 only */
|
||||
#define PMSAv8_XIP_REGION 0
|
||||
#define PMSAv8_KERNEL_REGION 1
|
||||
|
||||
/* Maximum number of regions Linux is interested in */
|
||||
#define MPU_MAX_REGIONS 16
|
||||
#define MPU_MAX_REGIONS 16
|
||||
|
||||
#define MPU_DATA_SIDE 0
|
||||
#define MPU_INSTR_SIDE 1
|
||||
#define PMSAv7_DATA_SIDE 0
|
||||
#define PMSAv7_INSTR_SIDE 1
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
struct mpu_rgn {
|
||||
/* Assume same attributes for d/i-side */
|
||||
u32 drbar;
|
||||
u32 drsr;
|
||||
u32 dracr;
|
||||
union {
|
||||
u32 drbar; /* PMSAv7 */
|
||||
u32 prbar; /* PMSAv8 */
|
||||
};
|
||||
union {
|
||||
u32 drsr; /* PMSAv7 */
|
||||
u32 prlar; /* PMSAv8 */
|
||||
};
|
||||
union {
|
||||
u32 dracr; /* PMSAv7 */
|
||||
u32 unused; /* not used in PMSAv8 */
|
||||
};
|
||||
};
|
||||
|
||||
struct mpu_rgn_info {
|
||||
@@ -75,16 +116,17 @@ struct mpu_rgn_info {
|
||||
extern struct mpu_rgn_info mpu_rgn_info;
|
||||
|
||||
#ifdef CONFIG_ARM_MPU
|
||||
extern void __init pmsav7_adjust_lowmem_bounds(void);
|
||||
extern void __init pmsav8_adjust_lowmem_bounds(void);
|
||||
|
||||
extern void __init adjust_lowmem_bounds_mpu(void);
|
||||
extern void __init mpu_setup(void);
|
||||
|
||||
extern void __init pmsav7_setup(void);
|
||||
extern void __init pmsav8_setup(void);
|
||||
#else
|
||||
|
||||
static inline void adjust_lowmem_bounds_mpu(void) {}
|
||||
static inline void mpu_setup(void) {}
|
||||
|
||||
#endif /* !CONFIG_ARM_MPU */
|
||||
static inline void pmsav7_adjust_lowmem_bounds(void) {};
|
||||
static inline void pmsav8_adjust_lowmem_bounds(void) {};
|
||||
static inline void pmsav7_setup(void) {};
|
||||
static inline void pmsav8_setup(void) {};
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
|
||||
@@ -36,6 +36,10 @@ extern struct processor {
|
||||
* Set up any processor specifics
|
||||
*/
|
||||
void (*_proc_init)(void);
|
||||
/*
|
||||
* Check for processor bugs
|
||||
*/
|
||||
void (*check_bugs)(void);
|
||||
/*
|
||||
* Disable any processor specifics
|
||||
*/
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/irqflags.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/percpu.h>
|
||||
|
||||
extern void cpu_init(void);
|
||||
|
||||
@@ -15,6 +16,20 @@ void soft_restart(unsigned long);
|
||||
extern void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd);
|
||||
extern void (*arm_pm_idle)(void);
|
||||
|
||||
#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
|
||||
typedef void (*harden_branch_predictor_fn_t)(void);
|
||||
DECLARE_PER_CPU(harden_branch_predictor_fn_t, harden_branch_predictor_fn);
|
||||
static inline void harden_branch_predictor(void)
|
||||
{
|
||||
harden_branch_predictor_fn_t fn = per_cpu(harden_branch_predictor_fn,
|
||||
smp_processor_id());
|
||||
if (fn)
|
||||
fn();
|
||||
}
|
||||
#else
|
||||
#define harden_branch_predictor() do { } while (0)
|
||||
#endif
|
||||
|
||||
#define UDBG_UNDEFINED (1 << 0)
|
||||
#define UDBG_SYSCALL (1 << 1)
|
||||
#define UDBG_BADABORT (1 << 2)
|
||||
|
||||
@@ -152,7 +152,7 @@ extern int __get_user_64t_4(void *);
|
||||
#define __get_user_check(x, p) \
|
||||
({ \
|
||||
unsigned long __limit = current_thread_info()->addr_limit - 1; \
|
||||
register const typeof(*(p)) __user *__p asm("r0") = (p);\
|
||||
register typeof(*(p)) __user *__p asm("r0") = (p); \
|
||||
register typeof(x) __r2 asm("r2"); \
|
||||
register unsigned long __l asm("r1") = __limit; \
|
||||
register int __e asm("r0"); \
|
||||
|
||||
@@ -64,9 +64,17 @@
|
||||
#define MPU_CTRL_ENABLE 1
|
||||
#define MPU_CTRL_PRIVDEFENA (1 << 2)
|
||||
|
||||
#define MPU_RNR 0x98
|
||||
#define MPU_RBAR 0x9c
|
||||
#define MPU_RASR 0xa0
|
||||
#define PMSAv7_RNR 0x98
|
||||
#define PMSAv7_RBAR 0x9c
|
||||
#define PMSAv7_RASR 0xa0
|
||||
|
||||
#define PMSAv8_RNR 0x98
|
||||
#define PMSAv8_RBAR 0x9c
|
||||
#define PMSAv8_RLAR 0xa0
|
||||
#define PMSAv8_RBAR_A(n) (PMSAv8_RBAR + 8*(n))
|
||||
#define PMSAv8_RLAR_A(n) (PMSAv8_RLAR + 8*(n))
|
||||
#define PMSAv8_MAIR0 0xc0
|
||||
#define PMSAv8_MAIR1 0xc4
|
||||
|
||||
/* Cache opeartions */
|
||||
#define V7M_SCB_ICIALLU 0x250 /* I-cache invalidate all to PoU */
|
||||
|
||||
Reference in New Issue
Block a user