Loading arch/arm64/Kconfig +1 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ config ARM64 select SPARSE_IRQ select SYSCTL_EXCEPTION_TRACE select HAVE_CONTEXT_TRACKING select THREAD_INFO_IN_TASK select MSM_JTAGV8 if CORESIGHT_ETMV4 help ARM 64-bit (AArch64) Linux support. Loading arch/arm64/include/asm/current.h 0 → 100644 +27 −0 Original line number Diff line number Diff line #ifndef __ASM_CURRENT_H #define __ASM_CURRENT_H #include <linux/compiler.h> #include <asm/sysreg.h> #ifndef __ASSEMBLY__ #ifdef CONFIG_THREAD_INFO_IN_TASK struct task_struct; static __always_inline struct task_struct *get_current(void) { return (struct task_struct *)read_sysreg(sp_el0); } #define current get_current() #else #include <linux/thread_info.h> #define get_current() (current_thread_info()->task) #define current get_current() #endif #endif /* __ASSEMBLY__ */ #endif /* __ASM_CURRENT_H */ arch/arm64/include/asm/smp.h +3 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,9 @@ asmlinkage void secondary_start_kernel(void); */ struct secondary_data { void *stack; #ifdef CONFIG_THREAD_INFO_IN_TASK struct task_struct *task; #endif }; extern struct secondary_data secondary_data; extern void secondary_entry(void); Loading arch/arm64/include/asm/thread_info.h +14 −1 Original line number Diff line number Diff line Loading @@ -46,15 +46,26 @@ typedef unsigned long mm_segment_t; struct thread_info { unsigned long flags; /* low level flags */ mm_segment_t addr_limit; /* address limit */ #ifndef CONFIG_THREAD_INFO_IN_TASK struct task_struct *task; /* main task structure */ #endif struct exec_domain *exec_domain; /* execution domain */ #ifdef CONFIG_ARM64_SW_TTBR0_PAN u64 ttbr0; /* saved TTBR0_EL1 */ #endif int preempt_count; /* 0 => preemptable, <0 => bug */ #ifndef CONFIG_THREAD_INFO_IN_TASK int cpu; /* cpu */ #endif }; #ifdef CONFIG_THREAD_INFO_IN_TASK #define INIT_THREAD_INFO(tsk) \ { \ .preempt_count = INIT_PREEMPT_COUNT, \ .addr_limit = KERNEL_DS, \ } #else #define INIT_THREAD_INFO(tsk) \ { \ .task = &tsk, \ Loading @@ -65,7 +76,6 @@ struct thread_info { } #define init_thread_info (init_thread_union.thread_info) #define init_stack (init_thread_union.stack) /* * how to get the current stack pointer from C Loading @@ -88,6 +98,9 @@ static inline struct thread_info *current_thread_info(void) return (struct thread_info *)sp_el0; } #endif #define init_stack (init_thread_union.stack) #define thread_saved_pc(tsk) \ ((unsigned long)(tsk->thread.cpu_context.pc)) Loading arch/arm64/kernel/asm-offsets.c +12 −2 Original line number Diff line number Diff line Loading @@ -34,12 +34,17 @@ int main(void) { DEFINE(TSK_ACTIVE_MM, offsetof(struct task_struct, active_mm)); BLANK(); #ifdef CONFIG_THREAD_INFO_IN_TASK DEFINE(TSK_TI_FLAGS, offsetof(struct task_struct, thread_info.flags)); DEFINE(TSK_TI_PREEMPT, offsetof(struct task_struct, thread_info.preempt_count)); DEFINE(TSK_TI_ADDR_LIMIT, offsetof(struct task_struct, thread_info.addr_limit)); DEFINE(TSK_STACK, offsetof(struct task_struct, stack)); #else DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit)); DEFINE(TI_TASK, offsetof(struct thread_info, task)); DEFINE(TI_EXEC_DOMAIN, offsetof(struct thread_info, exec_domain)); DEFINE(TI_CPU, offsetof(struct thread_info, cpu)); #endif #ifdef CONFIG_ARM64_SW_TTBR0_PAN DEFINE(TSK_TI_TTBR0, offsetof(struct thread_info, ttbr0)); #endif Loading Loading @@ -113,6 +118,11 @@ int main(void) DEFINE(TZ_MINWEST, offsetof(struct timezone, tz_minuteswest)); DEFINE(TZ_DSTTIME, offsetof(struct timezone, tz_dsttime)); BLANK(); #ifdef CONFIG_THREAD_INFO_IN_TASK DEFINE(CPU_BOOT_STACK, offsetof(struct secondary_data, stack)); DEFINE(CPU_BOOT_TASK, offsetof(struct secondary_data, task)); BLANK(); #endif #ifdef CONFIG_KVM_ARM_HOST DEFINE(VCPU_CONTEXT, offsetof(struct kvm_vcpu, arch.ctxt)); DEFINE(CPU_GP_REGS, offsetof(struct kvm_cpu_context, gp_regs)); Loading Loading
arch/arm64/Kconfig +1 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ config ARM64 select SPARSE_IRQ select SYSCTL_EXCEPTION_TRACE select HAVE_CONTEXT_TRACKING select THREAD_INFO_IN_TASK select MSM_JTAGV8 if CORESIGHT_ETMV4 help ARM 64-bit (AArch64) Linux support. Loading
arch/arm64/include/asm/current.h 0 → 100644 +27 −0 Original line number Diff line number Diff line #ifndef __ASM_CURRENT_H #define __ASM_CURRENT_H #include <linux/compiler.h> #include <asm/sysreg.h> #ifndef __ASSEMBLY__ #ifdef CONFIG_THREAD_INFO_IN_TASK struct task_struct; static __always_inline struct task_struct *get_current(void) { return (struct task_struct *)read_sysreg(sp_el0); } #define current get_current() #else #include <linux/thread_info.h> #define get_current() (current_thread_info()->task) #define current get_current() #endif #endif /* __ASSEMBLY__ */ #endif /* __ASM_CURRENT_H */
arch/arm64/include/asm/smp.h +3 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,9 @@ asmlinkage void secondary_start_kernel(void); */ struct secondary_data { void *stack; #ifdef CONFIG_THREAD_INFO_IN_TASK struct task_struct *task; #endif }; extern struct secondary_data secondary_data; extern void secondary_entry(void); Loading
arch/arm64/include/asm/thread_info.h +14 −1 Original line number Diff line number Diff line Loading @@ -46,15 +46,26 @@ typedef unsigned long mm_segment_t; struct thread_info { unsigned long flags; /* low level flags */ mm_segment_t addr_limit; /* address limit */ #ifndef CONFIG_THREAD_INFO_IN_TASK struct task_struct *task; /* main task structure */ #endif struct exec_domain *exec_domain; /* execution domain */ #ifdef CONFIG_ARM64_SW_TTBR0_PAN u64 ttbr0; /* saved TTBR0_EL1 */ #endif int preempt_count; /* 0 => preemptable, <0 => bug */ #ifndef CONFIG_THREAD_INFO_IN_TASK int cpu; /* cpu */ #endif }; #ifdef CONFIG_THREAD_INFO_IN_TASK #define INIT_THREAD_INFO(tsk) \ { \ .preempt_count = INIT_PREEMPT_COUNT, \ .addr_limit = KERNEL_DS, \ } #else #define INIT_THREAD_INFO(tsk) \ { \ .task = &tsk, \ Loading @@ -65,7 +76,6 @@ struct thread_info { } #define init_thread_info (init_thread_union.thread_info) #define init_stack (init_thread_union.stack) /* * how to get the current stack pointer from C Loading @@ -88,6 +98,9 @@ static inline struct thread_info *current_thread_info(void) return (struct thread_info *)sp_el0; } #endif #define init_stack (init_thread_union.stack) #define thread_saved_pc(tsk) \ ((unsigned long)(tsk->thread.cpu_context.pc)) Loading
arch/arm64/kernel/asm-offsets.c +12 −2 Original line number Diff line number Diff line Loading @@ -34,12 +34,17 @@ int main(void) { DEFINE(TSK_ACTIVE_MM, offsetof(struct task_struct, active_mm)); BLANK(); #ifdef CONFIG_THREAD_INFO_IN_TASK DEFINE(TSK_TI_FLAGS, offsetof(struct task_struct, thread_info.flags)); DEFINE(TSK_TI_PREEMPT, offsetof(struct task_struct, thread_info.preempt_count)); DEFINE(TSK_TI_ADDR_LIMIT, offsetof(struct task_struct, thread_info.addr_limit)); DEFINE(TSK_STACK, offsetof(struct task_struct, stack)); #else DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit)); DEFINE(TI_TASK, offsetof(struct thread_info, task)); DEFINE(TI_EXEC_DOMAIN, offsetof(struct thread_info, exec_domain)); DEFINE(TI_CPU, offsetof(struct thread_info, cpu)); #endif #ifdef CONFIG_ARM64_SW_TTBR0_PAN DEFINE(TSK_TI_TTBR0, offsetof(struct thread_info, ttbr0)); #endif Loading Loading @@ -113,6 +118,11 @@ int main(void) DEFINE(TZ_MINWEST, offsetof(struct timezone, tz_minuteswest)); DEFINE(TZ_DSTTIME, offsetof(struct timezone, tz_dsttime)); BLANK(); #ifdef CONFIG_THREAD_INFO_IN_TASK DEFINE(CPU_BOOT_STACK, offsetof(struct secondary_data, stack)); DEFINE(CPU_BOOT_TASK, offsetof(struct secondary_data, task)); BLANK(); #endif #ifdef CONFIG_KVM_ARM_HOST DEFINE(VCPU_CONTEXT, offsetof(struct kvm_vcpu, arch.ctxt)); DEFINE(CPU_GP_REGS, offsetof(struct kvm_cpu_context, gp_regs)); Loading