Lines Matching full:regs

21 static noinstr void fred_bad_type(struct pt_regs *regs, unsigned long error_code)  in fred_bad_type()  argument
23 irqentry_state_t irq_state = irqentry_nmi_enter(regs); in fred_bad_type()
28 if (regs->fred_cs.sl > 0) { in fred_bad_type()
31 regs->fred_ss.type, regs->fred_ss.vector, error_code, in fred_bad_type()
32 fred_event_data(regs), regs->cs, regs->ip); in fred_bad_type()
33 die("invalid or fatal FRED event", regs, error_code); in fred_bad_type()
41 regs->fred_ss.type, regs->fred_ss.vector, error_code, in fred_bad_type()
42 fred_event_data(regs), regs->cs, regs->ip); in fred_bad_type()
44 if (__die("Invalid or fatal FRED event", regs, error_code)) in fred_bad_type()
47 oops_end(flags, regs, sig); in fred_bad_type()
51 irqentry_nmi_exit(regs, irq_state); in fred_bad_type()
54 static noinstr void fred_intx(struct pt_regs *regs) in fred_intx() argument
56 switch (regs->fred_ss.vector) { in fred_intx()
59 return exc_int3(regs); in fred_intx()
63 return exc_overflow(regs); in fred_intx()
69 return fred_int80_emulation(regs); in fred_intx()
74 return exc_general_protection(regs, 0); in fred_intx()
78 static __always_inline void fred_other(struct pt_regs *regs) in fred_other() argument
81 if (likely(regs->fred_ss.vector == FRED_SYSCALL && regs->fred_ss.lm)) { in fred_other()
82 regs->orig_ax = regs->ax; in fred_other()
83 regs->ax = -ENOSYS; in fred_other()
84 do_syscall_64(regs, regs->orig_ax); in fred_other()
87 likely(regs->fred_ss.vector == FRED_SYSENTER && !regs->fred_ss.lm)) { in fred_other()
88 regs->orig_ax = regs->ax; in fred_other()
89 regs->ax = -ENOSYS; in fred_other()
90 do_fast_syscall_32(regs); in fred_other()
93 exc_invalid_op(regs); in fred_other()
138 static noinstr void fred_handle_spurious_interrupt(struct pt_regs *regs) in fred_handle_spurious_interrupt() argument
140 spurious_interrupt(regs, regs->fred_ss.vector); in fred_handle_spurious_interrupt()
159 static noinstr void fred_extint(struct pt_regs *regs) in fred_extint() argument
161 unsigned int vector = regs->fred_ss.vector; in fred_extint()
169 irqentry_state_t state = irqentry_enter(regs); in fred_extint()
172 sysvec_table[index](regs); in fred_extint()
174 irqentry_exit(regs, state); in fred_extint()
176 common_interrupt(regs, vector); in fred_extint()
180 static noinstr void fred_hwexc(struct pt_regs *regs, unsigned long error_code) in fred_hwexc() argument
183 if (likely(regs->fred_ss.vector == X86_TRAP_PF)) in fred_hwexc()
184 return exc_page_fault(regs, error_code); in fred_hwexc()
186 switch (regs->fred_ss.vector) { in fred_hwexc()
187 case X86_TRAP_DE: return exc_divide_error(regs); in fred_hwexc()
188 case X86_TRAP_DB: return fred_exc_debug(regs); in fred_hwexc()
189 case X86_TRAP_BR: return exc_bounds(regs); in fred_hwexc()
190 case X86_TRAP_UD: return exc_invalid_op(regs); in fred_hwexc()
191 case X86_TRAP_NM: return exc_device_not_available(regs); in fred_hwexc()
192 case X86_TRAP_DF: return exc_double_fault(regs, error_code); in fred_hwexc()
193 case X86_TRAP_TS: return exc_invalid_tss(regs, error_code); in fred_hwexc()
194 case X86_TRAP_NP: return exc_segment_not_present(regs, error_code); in fred_hwexc()
195 case X86_TRAP_SS: return exc_stack_segment(regs, error_code); in fred_hwexc()
196 case X86_TRAP_GP: return exc_general_protection(regs, error_code); in fred_hwexc()
197 case X86_TRAP_MF: return exc_coprocessor_error(regs); in fred_hwexc()
198 case X86_TRAP_AC: return exc_alignment_check(regs, error_code); in fred_hwexc()
199 case X86_TRAP_XF: return exc_simd_coprocessor_error(regs); in fred_hwexc()
202 case X86_TRAP_MC: return fred_exc_machine_check(regs); in fred_hwexc()
205 case X86_TRAP_VE: return exc_virtualization_exception(regs); in fred_hwexc()
208 case X86_TRAP_CP: return exc_control_protection(regs, error_code); in fred_hwexc()
210 default: return fred_bad_type(regs, error_code); in fred_hwexc()
215 static noinstr void fred_swexc(struct pt_regs *regs, unsigned long error_code) in fred_swexc() argument
217 switch (regs->fred_ss.vector) { in fred_swexc()
218 case X86_TRAP_BP: return exc_int3(regs); in fred_swexc()
219 case X86_TRAP_OF: return exc_overflow(regs); in fred_swexc()
220 default: return fred_bad_type(regs, error_code); in fred_swexc()
224 __visible noinstr void fred_entry_from_user(struct pt_regs *regs) in fred_entry_from_user() argument
226 unsigned long error_code = regs->orig_ax; in fred_entry_from_user()
229 regs->orig_ax = -1; in fred_entry_from_user()
231 switch (regs->fred_ss.type) { in fred_entry_from_user()
233 return fred_extint(regs); in fred_entry_from_user()
235 if (likely(regs->fred_ss.vector == X86_TRAP_NMI)) in fred_entry_from_user()
236 return fred_exc_nmi(regs); in fred_entry_from_user()
239 return fred_hwexc(regs, error_code); in fred_entry_from_user()
241 return fred_intx(regs); in fred_entry_from_user()
243 if (likely(regs->fred_ss.vector == X86_TRAP_DB)) in fred_entry_from_user()
244 return fred_exc_debug(regs); in fred_entry_from_user()
247 return fred_swexc(regs, error_code); in fred_entry_from_user()
249 return fred_other(regs); in fred_entry_from_user()
253 return fred_bad_type(regs, error_code); in fred_entry_from_user()
256 __visible noinstr void fred_entry_from_kernel(struct pt_regs *regs) in fred_entry_from_kernel() argument
258 unsigned long error_code = regs->orig_ax; in fred_entry_from_kernel()
261 regs->orig_ax = -1; in fred_entry_from_kernel()
263 switch (regs->fred_ss.type) { in fred_entry_from_kernel()
265 return fred_extint(regs); in fred_entry_from_kernel()
267 if (likely(regs->fred_ss.vector == X86_TRAP_NMI)) in fred_entry_from_kernel()
268 return fred_exc_nmi(regs); in fred_entry_from_kernel()
271 return fred_hwexc(regs, error_code); in fred_entry_from_kernel()
273 if (likely(regs->fred_ss.vector == X86_TRAP_DB)) in fred_entry_from_kernel()
274 return fred_exc_debug(regs); in fred_entry_from_kernel()
277 return fred_swexc(regs, error_code); in fred_entry_from_kernel()
281 return fred_bad_type(regs, error_code); in fred_entry_from_kernel()
285 __visible noinstr void __fred_entry_from_kvm(struct pt_regs *regs) in __fred_entry_from_kvm() argument
287 switch (regs->fred_ss.type) { in __fred_entry_from_kvm()
289 return fred_extint(regs); in __fred_entry_from_kvm()
291 return fred_exc_nmi(regs); in __fred_entry_from_kvm()