18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * arch/arm/include/asm/processor.h 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 1995-1999 Russell King 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef __ASM_ARM_PROCESSOR_H 98c2ecf20Sopenharmony_ci#define __ASM_ARM_PROCESSOR_H 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifdef __KERNEL__ 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <asm/hw_breakpoint.h> 148c2ecf20Sopenharmony_ci#include <asm/ptrace.h> 158c2ecf20Sopenharmony_ci#include <asm/types.h> 168c2ecf20Sopenharmony_ci#include <asm/unified.h> 178c2ecf20Sopenharmony_ci#include <asm/vdso/processor.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#ifdef __KERNEL__ 208c2ecf20Sopenharmony_ci#define STACK_TOP ((current->personality & ADDR_LIMIT_32BIT) ? \ 218c2ecf20Sopenharmony_ci TASK_SIZE : TASK_SIZE_26) 228c2ecf20Sopenharmony_ci#define STACK_TOP_MAX TASK_SIZE 238c2ecf20Sopenharmony_ci#endif 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistruct debug_info { 268c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_HW_BREAKPOINT 278c2ecf20Sopenharmony_ci struct perf_event *hbp[ARM_MAX_HBP_SLOTS]; 288c2ecf20Sopenharmony_ci#endif 298c2ecf20Sopenharmony_ci}; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistruct thread_struct { 328c2ecf20Sopenharmony_ci /* fault info */ 338c2ecf20Sopenharmony_ci unsigned long address; 348c2ecf20Sopenharmony_ci unsigned long trap_no; 358c2ecf20Sopenharmony_ci unsigned long error_code; 368c2ecf20Sopenharmony_ci /* debugging */ 378c2ecf20Sopenharmony_ci struct debug_info debug; 388c2ecf20Sopenharmony_ci}; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci/* 418c2ecf20Sopenharmony_ci * Everything usercopied to/from thread_struct is statically-sized, so 428c2ecf20Sopenharmony_ci * no hardened usercopy whitelist is needed. 438c2ecf20Sopenharmony_ci */ 448c2ecf20Sopenharmony_cistatic inline void arch_thread_struct_whitelist(unsigned long *offset, 458c2ecf20Sopenharmony_ci unsigned long *size) 468c2ecf20Sopenharmony_ci{ 478c2ecf20Sopenharmony_ci *offset = *size = 0; 488c2ecf20Sopenharmony_ci} 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci#define INIT_THREAD { } 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci#define start_thread(regs,pc,sp) \ 538c2ecf20Sopenharmony_ci({ \ 548c2ecf20Sopenharmony_ci unsigned long r7, r8, r9; \ 558c2ecf20Sopenharmony_ci \ 568c2ecf20Sopenharmony_ci if (IS_ENABLED(CONFIG_BINFMT_ELF_FDPIC)) { \ 578c2ecf20Sopenharmony_ci r7 = regs->ARM_r7; \ 588c2ecf20Sopenharmony_ci r8 = regs->ARM_r8; \ 598c2ecf20Sopenharmony_ci r9 = regs->ARM_r9; \ 608c2ecf20Sopenharmony_ci } \ 618c2ecf20Sopenharmony_ci memset(regs->uregs, 0, sizeof(regs->uregs)); \ 628c2ecf20Sopenharmony_ci if (IS_ENABLED(CONFIG_BINFMT_ELF_FDPIC) && \ 638c2ecf20Sopenharmony_ci current->personality & FDPIC_FUNCPTRS) { \ 648c2ecf20Sopenharmony_ci regs->ARM_r7 = r7; \ 658c2ecf20Sopenharmony_ci regs->ARM_r8 = r8; \ 668c2ecf20Sopenharmony_ci regs->ARM_r9 = r9; \ 678c2ecf20Sopenharmony_ci regs->ARM_r10 = current->mm->start_data; \ 688c2ecf20Sopenharmony_ci } else if (!IS_ENABLED(CONFIG_MMU)) \ 698c2ecf20Sopenharmony_ci regs->ARM_r10 = current->mm->start_data; \ 708c2ecf20Sopenharmony_ci if (current->personality & ADDR_LIMIT_32BIT) \ 718c2ecf20Sopenharmony_ci regs->ARM_cpsr = USR_MODE; \ 728c2ecf20Sopenharmony_ci else \ 738c2ecf20Sopenharmony_ci regs->ARM_cpsr = USR26_MODE; \ 748c2ecf20Sopenharmony_ci if (elf_hwcap & HWCAP_THUMB && pc & 1) \ 758c2ecf20Sopenharmony_ci regs->ARM_cpsr |= PSR_T_BIT; \ 768c2ecf20Sopenharmony_ci regs->ARM_cpsr |= PSR_ENDSTATE; \ 778c2ecf20Sopenharmony_ci regs->ARM_pc = pc & ~1; /* pc */ \ 788c2ecf20Sopenharmony_ci regs->ARM_sp = sp; /* sp */ \ 798c2ecf20Sopenharmony_ci}) 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci/* Forward declaration, a strange C thing */ 828c2ecf20Sopenharmony_cistruct task_struct; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci/* Free all resources held by a thread. */ 858c2ecf20Sopenharmony_ciextern void release_thread(struct task_struct *); 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ciunsigned long get_wchan(struct task_struct *p); 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci#define task_pt_regs(p) \ 908c2ecf20Sopenharmony_ci ((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1) 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci#define KSTK_EIP(tsk) task_pt_regs(tsk)->ARM_pc 938c2ecf20Sopenharmony_ci#define KSTK_ESP(tsk) task_pt_regs(tsk)->ARM_sp 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP 968c2ecf20Sopenharmony_ci#define __ALT_SMP_ASM(smp, up) \ 978c2ecf20Sopenharmony_ci "9998: " smp "\n" \ 988c2ecf20Sopenharmony_ci " .pushsection \".alt.smp.init\", \"a\"\n" \ 998c2ecf20Sopenharmony_ci " .long 9998b - .\n" \ 1008c2ecf20Sopenharmony_ci " " up "\n" \ 1018c2ecf20Sopenharmony_ci " .popsection\n" 1028c2ecf20Sopenharmony_ci#else 1038c2ecf20Sopenharmony_ci#define __ALT_SMP_ASM(smp, up) up 1048c2ecf20Sopenharmony_ci#endif 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci/* 1078c2ecf20Sopenharmony_ci * Prefetching support - only ARMv5. 1088c2ecf20Sopenharmony_ci */ 1098c2ecf20Sopenharmony_ci#if __LINUX_ARM_ARCH__ >= 5 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci#define ARCH_HAS_PREFETCH 1128c2ecf20Sopenharmony_cistatic inline void prefetch(const void *ptr) 1138c2ecf20Sopenharmony_ci{ 1148c2ecf20Sopenharmony_ci __asm__ __volatile__( 1158c2ecf20Sopenharmony_ci "pld\t%a0" 1168c2ecf20Sopenharmony_ci :: "p" (ptr)); 1178c2ecf20Sopenharmony_ci} 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci#if __LINUX_ARM_ARCH__ >= 7 && defined(CONFIG_SMP) 1208c2ecf20Sopenharmony_ci#define ARCH_HAS_PREFETCHW 1218c2ecf20Sopenharmony_cistatic inline void prefetchw(const void *ptr) 1228c2ecf20Sopenharmony_ci{ 1238c2ecf20Sopenharmony_ci __asm__ __volatile__( 1248c2ecf20Sopenharmony_ci ".arch_extension mp\n" 1258c2ecf20Sopenharmony_ci __ALT_SMP_ASM( 1268c2ecf20Sopenharmony_ci "pldw\t%a0", 1278c2ecf20Sopenharmony_ci "pld\t%a0" 1288c2ecf20Sopenharmony_ci ) 1298c2ecf20Sopenharmony_ci :: "p" (ptr)); 1308c2ecf20Sopenharmony_ci} 1318c2ecf20Sopenharmony_ci#endif 1328c2ecf20Sopenharmony_ci#endif 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci#endif 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci#endif /* __ASM_ARM_PROCESSOR_H */ 137