| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-or-later */ |
|---|
| 1 | 2 | #ifndef _ASM_POWERPC_ASM_PROTOTYPES_H |
|---|
| 2 | 3 | #define _ASM_POWERPC_ASM_PROTOTYPES_H |
|---|
| 3 | 4 | /* |
|---|
| .. | .. |
|---|
| 5 | 6 | * from asm, and any associated variables. |
|---|
| 6 | 7 | * |
|---|
| 7 | 8 | * Copyright 2016, Daniel Axtens, IBM Corporation. |
|---|
| 8 | | - * |
|---|
| 9 | | - * This program is free software; you can redistribute it and/or |
|---|
| 10 | | - * modify it under the terms of the GNU General Public License |
|---|
| 11 | | - * as published by the Free Software Foundation; either version 2 |
|---|
| 12 | | - * of the License, or (at your option) any later version. |
|---|
| 13 | 9 | */ |
|---|
| 14 | 10 | |
|---|
| 15 | 11 | #include <linux/threads.h> |
|---|
| .. | .. |
|---|
| 19 | 15 | #include <asm/epapr_hcalls.h> |
|---|
| 20 | 16 | #include <asm/dcr.h> |
|---|
| 21 | 17 | #include <asm/mmu_context.h> |
|---|
| 18 | +#include <asm/ultravisor-api.h> |
|---|
| 22 | 19 | |
|---|
| 23 | 20 | #include <uapi/asm/ucontext.h> |
|---|
| 24 | 21 | |
|---|
| 25 | 22 | /* SMP */ |
|---|
| 26 | | -extern struct thread_info *current_set[NR_CPUS]; |
|---|
| 27 | | -extern struct thread_info *secondary_ti; |
|---|
| 23 | +extern struct task_struct *current_set[NR_CPUS]; |
|---|
| 24 | +extern struct task_struct *secondary_current; |
|---|
| 28 | 25 | void start_secondary(void *unused); |
|---|
| 29 | 26 | |
|---|
| 30 | 27 | /* kexec */ |
|---|
| .. | .. |
|---|
| 37 | 34 | extern struct static_key hcall_tracepoint_key; |
|---|
| 38 | 35 | void __trace_hcall_entry(unsigned long opcode, unsigned long *args); |
|---|
| 39 | 36 | void __trace_hcall_exit(long opcode, long retval, unsigned long *retbuf); |
|---|
| 40 | | -/* OPAL tracing */ |
|---|
| 41 | | -#ifdef CONFIG_JUMP_LABEL |
|---|
| 42 | | -extern struct static_key opal_tracepoint_key; |
|---|
| 37 | + |
|---|
| 38 | +/* Ultravisor */ |
|---|
| 39 | +#if defined(CONFIG_PPC_POWERNV) || defined(CONFIG_PPC_SVM) |
|---|
| 40 | +long ucall_norets(unsigned long opcode, ...); |
|---|
| 41 | +#else |
|---|
| 42 | +static inline long ucall_norets(unsigned long opcode, ...) |
|---|
| 43 | +{ |
|---|
| 44 | + return U_NOT_AVAILABLE; |
|---|
| 45 | +} |
|---|
| 43 | 46 | #endif |
|---|
| 44 | 47 | |
|---|
| 45 | | -void __trace_opal_entry(unsigned long opcode, unsigned long *args); |
|---|
| 46 | | -void __trace_opal_exit(long opcode, unsigned long retval); |
|---|
| 48 | +/* OPAL */ |
|---|
| 49 | +int64_t __opal_call(int64_t a0, int64_t a1, int64_t a2, int64_t a3, |
|---|
| 50 | + int64_t a4, int64_t a5, int64_t a6, int64_t a7, |
|---|
| 51 | + int64_t opcode, uint64_t msr); |
|---|
| 47 | 52 | |
|---|
| 48 | 53 | /* VMX copying */ |
|---|
| 49 | 54 | int enter_vmx_usercopy(void); |
|---|
| .. | .. |
|---|
| 61 | 66 | void single_step_exception(struct pt_regs *regs); |
|---|
| 62 | 67 | void program_check_exception(struct pt_regs *regs); |
|---|
| 63 | 68 | void alignment_exception(struct pt_regs *regs); |
|---|
| 64 | | -void slb_miss_bad_addr(struct pt_regs *regs); |
|---|
| 65 | 69 | void StackOverflow(struct pt_regs *regs); |
|---|
| 66 | | -void nonrecoverable_exception(struct pt_regs *regs); |
|---|
| 70 | +void stack_overflow_exception(struct pt_regs *regs); |
|---|
| 67 | 71 | void kernel_fp_unavailable_exception(struct pt_regs *regs); |
|---|
| 68 | 72 | void altivec_unavailable_exception(struct pt_regs *regs); |
|---|
| 69 | 73 | void vsx_unavailable_exception(struct pt_regs *regs); |
|---|
| .. | .. |
|---|
| 78 | 82 | void system_reset_exception(struct pt_regs *regs); |
|---|
| 79 | 83 | void machine_check_exception(struct pt_regs *regs); |
|---|
| 80 | 84 | void emulation_assist_interrupt(struct pt_regs *regs); |
|---|
| 85 | +long do_slb_fault(struct pt_regs *regs, unsigned long ea); |
|---|
| 86 | +void do_bad_slb_fault(struct pt_regs *regs, unsigned long ea, long err); |
|---|
| 81 | 87 | |
|---|
| 82 | 88 | /* signals, syscalls and interrupts */ |
|---|
| 83 | 89 | long sys_swapcontext(struct ucontext __user *old_ctx, |
|---|
| .. | .. |
|---|
| 87 | 93 | long sys_debug_setcontext(struct ucontext __user *ctx, |
|---|
| 88 | 94 | int ndbg, struct sig_dbg_op __user *dbg); |
|---|
| 89 | 95 | int |
|---|
| 90 | | -ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct timeval __user *tvp); |
|---|
| 96 | +ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, |
|---|
| 97 | + struct __kernel_old_timeval __user *tvp); |
|---|
| 91 | 98 | unsigned long __init early_init(unsigned long dt_ptr); |
|---|
| 92 | 99 | void __init machine_init(u64 dt_ptr); |
|---|
| 93 | 100 | #endif |
|---|
| 101 | +long system_call_exception(long r3, long r4, long r5, long r6, long r7, long r8, unsigned long r0, struct pt_regs *regs); |
|---|
| 102 | +notrace unsigned long syscall_exit_prepare(unsigned long r3, struct pt_regs *regs, long scv); |
|---|
| 103 | +notrace unsigned long interrupt_exit_user_prepare(struct pt_regs *regs, unsigned long msr); |
|---|
| 104 | +notrace unsigned long interrupt_exit_kernel_prepare(struct pt_regs *regs, unsigned long msr); |
|---|
| 94 | 105 | |
|---|
| 95 | 106 | long ppc_fadvise64_64(int fd, int advice, u32 offset_high, u32 offset_low, |
|---|
| 96 | 107 | u32 len_high, u32 len_low); |
|---|
| 97 | 108 | long sys_switch_endian(void); |
|---|
| 98 | 109 | notrace unsigned int __check_irq_replay(void); |
|---|
| 99 | 110 | void notrace restore_interrupts(void); |
|---|
| 100 | | - |
|---|
| 101 | | -/* ptrace */ |
|---|
| 102 | | -long do_syscall_trace_enter(struct pt_regs *regs); |
|---|
| 103 | | -void do_syscall_trace_leave(struct pt_regs *regs); |
|---|
| 104 | | - |
|---|
| 105 | | -/* process */ |
|---|
| 106 | | -void restore_math(struct pt_regs *regs); |
|---|
| 107 | | -void restore_tm_state(struct pt_regs *regs); |
|---|
| 108 | 111 | |
|---|
| 109 | 112 | /* prom_init (OpenFirmware) */ |
|---|
| 110 | 113 | unsigned long __init prom_init(unsigned long r3, unsigned long r4, |
|---|
| .. | .. |
|---|
| 116 | 119 | void __init early_setup(unsigned long dt_ptr); |
|---|
| 117 | 120 | void early_setup_secondary(void); |
|---|
| 118 | 121 | |
|---|
| 119 | | -/* time */ |
|---|
| 120 | | -void accumulate_stolen_time(void); |
|---|
| 121 | | - |
|---|
| 122 | 122 | /* misc runtime */ |
|---|
| 123 | 123 | extern u64 __bswapdi2(u64); |
|---|
| 124 | 124 | extern s64 __lshrdi3(s64, int); |
|---|
| .. | .. |
|---|
| 129 | 129 | |
|---|
| 130 | 130 | /* tracing */ |
|---|
| 131 | 131 | void _mcount(void); |
|---|
| 132 | | -unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip); |
|---|
| 132 | +unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip, |
|---|
| 133 | + unsigned long sp); |
|---|
| 133 | 134 | |
|---|
| 134 | 135 | void pnv_power9_force_smt4_catch(void); |
|---|
| 135 | 136 | void pnv_power9_force_smt4_release(void); |
|---|
| .. | .. |
|---|
| 144 | 145 | void _kvmppc_save_tm_pr(struct kvm_vcpu *vcpu, u64 guest_msr); |
|---|
| 145 | 146 | |
|---|
| 146 | 147 | /* Patch sites */ |
|---|
| 147 | | -extern s32 patch__call_flush_count_cache; |
|---|
| 148 | +extern s32 patch__call_flush_branch_caches1; |
|---|
| 149 | +extern s32 patch__call_flush_branch_caches2; |
|---|
| 150 | +extern s32 patch__call_flush_branch_caches3; |
|---|
| 148 | 151 | extern s32 patch__flush_count_cache_return; |
|---|
| 149 | 152 | extern s32 patch__flush_link_stack_return; |
|---|
| 150 | 153 | extern s32 patch__call_kvm_flush_link_stack; |
|---|
| 151 | 154 | extern s32 patch__memset_nocache, patch__memcpy_nocache; |
|---|
| 152 | 155 | |
|---|
| 153 | | -extern long flush_count_cache; |
|---|
| 156 | +extern long flush_branch_caches; |
|---|
| 154 | 157 | extern long kvm_flush_link_stack; |
|---|
| 155 | 158 | |
|---|
| 159 | +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
|---|
| 160 | +void kvmppc_save_tm_hv(struct kvm_vcpu *vcpu, u64 msr, bool preserve_nv); |
|---|
| 161 | +void kvmppc_restore_tm_hv(struct kvm_vcpu *vcpu, u64 msr, bool preserve_nv); |
|---|
| 162 | +#else |
|---|
| 163 | +static inline void kvmppc_save_tm_hv(struct kvm_vcpu *vcpu, u64 msr, |
|---|
| 164 | + bool preserve_nv) { } |
|---|
| 165 | +static inline void kvmppc_restore_tm_hv(struct kvm_vcpu *vcpu, u64 msr, |
|---|
| 166 | + bool preserve_nv) { } |
|---|
| 167 | +#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */ |
|---|
| 168 | + |
|---|
| 169 | +void kvmhv_save_host_pmu(void); |
|---|
| 170 | +void kvmhv_load_host_pmu(void); |
|---|
| 171 | +void kvmhv_save_guest_pmu(struct kvm_vcpu *vcpu, bool pmu_in_use); |
|---|
| 172 | +void kvmhv_load_guest_pmu(struct kvm_vcpu *vcpu); |
|---|
| 173 | + |
|---|
| 174 | +int __kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu); |
|---|
| 175 | + |
|---|
| 176 | +long kvmppc_h_set_dabr(struct kvm_vcpu *vcpu, unsigned long dabr); |
|---|
| 177 | +long kvmppc_h_set_xdabr(struct kvm_vcpu *vcpu, unsigned long dabr, |
|---|
| 178 | + unsigned long dabrx); |
|---|
| 179 | + |
|---|
| 156 | 180 | #endif /* _ASM_POWERPC_ASM_PROTOTYPES_H */ |
|---|