1 1.19 msaitoh /* $NetBSD: machdep.h,v 1.19 2024/02/07 04:20:26 msaitoh Exp $ */ 2 1.1 ryo 3 1.1 ryo /* 4 1.19 msaitoh * Copyright (c) 2017 Ryo Shimizu 5 1.1 ryo * All rights reserved. 6 1.1 ryo * 7 1.1 ryo * Redistribution and use in source and binary forms, with or without 8 1.1 ryo * modification, are permitted provided that the following conditions 9 1.1 ryo * are met: 10 1.1 ryo * 1. Redistributions of source code must retain the above copyright 11 1.1 ryo * notice, this list of conditions and the following disclaimer. 12 1.1 ryo * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 ryo * notice, this list of conditions and the following disclaimer in the 14 1.1 ryo * documentation and/or other materials provided with the distribution. 15 1.1 ryo * 16 1.1 ryo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 ryo * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 1.1 ryo * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 1.1 ryo * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 20 1.1 ryo * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 1.1 ryo * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 1.1 ryo * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 1.1 ryo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 24 1.1 ryo * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 25 1.1 ryo * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.1 ryo * POSSIBILITY OF SUCH DAMAGE. 27 1.1 ryo */ 28 1.1 ryo 29 1.1 ryo #ifndef _AARCH64_MACHDEP_H_ 30 1.1 ryo #define _AARCH64_MACHDEP_H_ 31 1.1 ryo 32 1.1 ryo #include <sys/proc.h> 33 1.1 ryo #include <sys/lwp.h> 34 1.1 ryo #include <sys/siginfo.h> 35 1.1 ryo 36 1.1 ryo // initarm_common 37 1.1 ryo #include <machine/bootconfig.h> 38 1.1 ryo 39 1.5 jakllsch struct boot_physmem; 40 1.1 ryo 41 1.1 ryo static inline paddr_t 42 1.1 ryo aarch64_kern_vtophys(vaddr_t va) 43 1.1 ryo { 44 1.1 ryo extern u_long kern_vtopdiff; 45 1.1 ryo 46 1.1 ryo return va - kern_vtopdiff; 47 1.1 ryo } 48 1.1 ryo 49 1.1 ryo static inline vaddr_t 50 1.1 ryo aarch64_kern_phystov(paddr_t pa) 51 1.1 ryo { 52 1.1 ryo extern u_long kern_vtopdiff; 53 1.1 ryo 54 1.1 ryo return pa + kern_vtopdiff; 55 1.1 ryo } 56 1.1 ryo 57 1.1 ryo #define KERN_VTOPHYS(va) aarch64_kern_vtophys(va) 58 1.1 ryo #define KERN_PHYSTOV(pa) aarch64_kern_phystov(pa) 59 1.1 ryo 60 1.1 ryo extern paddr_t physical_start; 61 1.1 ryo extern paddr_t physical_end; 62 1.17 ryo extern vaddr_t module_start; 63 1.17 ryo extern vaddr_t module_end; 64 1.1 ryo 65 1.1 ryo extern void (*cpu_reset_address0)(void); 66 1.1 ryo extern void (*cpu_reset_address)(void); 67 1.1 ryo extern void (*cpu_powerdown_address)(void); 68 1.1 ryo 69 1.1 ryo extern char *booted_kernel; 70 1.1 ryo 71 1.8 skrll /* 72 1.8 skrll * note that we use void * as all the platforms have different ideas on what 73 1.8 skrll * the structure is 74 1.8 skrll */ 75 1.8 skrll vaddr_t initarm(void *); 76 1.8 skrll 77 1.1 ryo vaddr_t initarm_common(vaddr_t, vsize_t, const struct boot_physmem *, size_t); 78 1.4 skrll void cpu_kernel_vm_init(paddr_t, psize_t); 79 1.6 skrll void uartputc(int); 80 1.1 ryo 81 1.1 ryo void parse_mi_bootargs(char *); 82 1.1 ryo void dumpsys(void); 83 1.1 ryo 84 1.9 riastrad void cpu_startup_hook(void); 85 1.9 riastrad void cpu_startup_default(void); 86 1.9 riastrad 87 1.1 ryo struct trapframe; 88 1.1 ryo 89 1.1 ryo /* fault.c */ 90 1.3 christos void data_abort_handler(struct trapframe *, uint32_t); 91 1.1 ryo 92 1.1 ryo /* trap.c */ 93 1.1 ryo void lwp_trampoline(void); 94 1.13 ryo void configure_cpu_traps(void); 95 1.1 ryo void cpu_dosoftints(void); 96 1.1 ryo void cpu_switchto_softint(struct lwp *, int); 97 1.1 ryo void dosoftints(void); 98 1.14 ryo int fetch_arm_insn(uint64_t, uint64_t, uint32_t *); 99 1.1 ryo void trap_doast(struct trapframe *); 100 1.1 ryo 101 1.1 ryo void trap_el1t_sync(struct trapframe *); 102 1.1 ryo void trap_el1t_irq(struct trapframe *); 103 1.1 ryo void trap_el1t_fiq(struct trapframe *); 104 1.1 ryo void trap_el1t_error(struct trapframe *); 105 1.1 ryo void trap_el1h_sync(struct trapframe *); 106 1.1 ryo void trap_el1h_fiq(struct trapframe *); 107 1.1 ryo void trap_el1h_error(struct trapframe *); 108 1.1 ryo void trap_el0_sync(struct trapframe *); 109 1.1 ryo void trap_el0_fiq(struct trapframe *); 110 1.1 ryo void trap_el0_error(struct trapframe *); 111 1.1 ryo void trap_el0_32sync(struct trapframe *); 112 1.1 ryo void trap_el0_32fiq(struct trapframe *); 113 1.1 ryo void trap_el0_32error(struct trapframe *); 114 1.18 jmcneill void cpu_irq(struct trapframe *); 115 1.18 jmcneill void cpu_fiq(struct trapframe *); 116 1.1 ryo 117 1.1 ryo /* cpu_onfault */ 118 1.1 ryo int cpu_set_onfault(struct faultbuf *) __returns_twice; 119 1.1 ryo void cpu_jump_onfault(struct trapframe *, const struct faultbuf *, int); 120 1.1 ryo 121 1.5 jakllsch #if defined(_KERNEL) 122 1.1 ryo static inline void 123 1.16 ryo cpu_unset_onfault(void) 124 1.16 ryo { 125 1.16 ryo curlwp->l_md.md_onfault = NULL; 126 1.16 ryo } 127 1.16 ryo 128 1.16 ryo static inline void 129 1.1 ryo cpu_enable_onfault(struct faultbuf *fb) 130 1.1 ryo { 131 1.1 ryo curlwp->l_md.md_onfault = fb; 132 1.1 ryo } 133 1.1 ryo 134 1.1 ryo static inline struct faultbuf * 135 1.1 ryo cpu_disable_onfault(void) 136 1.1 ryo { 137 1.1 ryo struct faultbuf * const fb = curlwp->l_md.md_onfault; 138 1.1 ryo if (fb != NULL) 139 1.1 ryo curlwp->l_md.md_onfault = NULL; 140 1.1 ryo return fb; 141 1.1 ryo } 142 1.5 jakllsch #endif 143 1.1 ryo 144 1.11 ryo /* exec_machdep.c */ 145 1.11 ryo void aarch64_setregs_ptrauth(struct lwp *, bool); 146 1.11 ryo 147 1.1 ryo /* fpu.c */ 148 1.1 ryo void fpu_attach(struct cpu_info *); 149 1.1 ryo struct fpreg; 150 1.12 riastrad void load_fpregs(const struct fpreg *); 151 1.1 ryo void save_fpregs(struct fpreg *); 152 1.1 ryo 153 1.3 christos #ifdef TRAP_SIGDEBUG 154 1.3 christos #define do_trapsignal(l, signo, code, addr, trap) \ 155 1.3 christos do_trapsignal1(__func__, __LINE__, tf, l, signo, code, addr, trap) 156 1.3 christos #else 157 1.3 christos #define do_trapsignal(l, signo, code, addr, trap) \ 158 1.3 christos do_trapsignal1(l, signo, code, addr, trap) 159 1.3 christos #endif 160 1.3 christos 161 1.3 christos void do_trapsignal1( 162 1.3 christos #ifdef TRAP_SIGDEBUG 163 1.3 christos const char *func, size_t line, struct trapframe *tf, 164 1.3 christos #endif 165 1.3 christos struct lwp *l, int signo, int code, void *addr, int trap); 166 1.1 ryo 167 1.3 christos const char *eclass_trapname(uint32_t); 168 1.1 ryo 169 1.1 ryo #include <sys/pcu.h> 170 1.1 ryo 171 1.1 ryo extern const pcu_ops_t pcu_fpu_ops; 172 1.1 ryo 173 1.1 ryo static inline bool 174 1.1 ryo fpu_used_p(lwp_t *l) 175 1.1 ryo { 176 1.1 ryo return pcu_valid_p(&pcu_fpu_ops, l); 177 1.1 ryo } 178 1.1 ryo 179 1.1 ryo static inline void 180 1.1 ryo fpu_save(lwp_t *l) 181 1.1 ryo { 182 1.1 ryo pcu_save(&pcu_fpu_ops, l); 183 1.1 ryo } 184 1.1 ryo 185 1.1 ryo static inline void 186 1.1 ryo fpu_load(lwp_t *l) 187 1.1 ryo { 188 1.1 ryo pcu_load(&pcu_fpu_ops); 189 1.1 ryo } 190 1.1 ryo 191 1.1 ryo static inline void 192 1.1 ryo fpu_discard(lwp_t *l, bool usesw) 193 1.1 ryo { 194 1.1 ryo pcu_discard(&pcu_fpu_ops, l, usesw); 195 1.1 ryo } 196 1.1 ryo 197 1.1 ryo #endif /* _AARCH64_MACHDEP_H_ */ 198