Lines Matching refs:regs
58 static inline int decode_access_size(struct pt_regs *regs, unsigned int insn) in decode_access_size() argument
74 die_if_kernel("Byte sized unaligned access?!?!", regs); in decode_access_size()
86 static inline int decode_asi(unsigned int insn, struct pt_regs *regs) in decode_asi() argument
90 return (unsigned char)(regs->tstate >> 24); /* %asi */ in decode_asi()
119 static unsigned long fetch_reg(unsigned int reg, struct pt_regs *regs) in fetch_reg() argument
124 return (!reg ? 0 : regs->u_regs[reg]); in fetch_reg()
126 fp = regs->u_regs[UREG_FP]; in fetch_reg()
128 if (regs->tstate & TSTATE_PRIV) { in fetch_reg()
144 static unsigned long *fetch_reg_addr(unsigned int reg, struct pt_regs *regs) in fetch_reg_addr() argument
149 return ®s->u_regs[reg]; in fetch_reg_addr()
151 fp = regs->u_regs[UREG_FP]; in fetch_reg_addr()
153 if (regs->tstate & TSTATE_PRIV) { in fetch_reg_addr()
168 unsigned long compute_effective_address(struct pt_regs *regs, in compute_effective_address() argument
171 int from_kernel = (regs->tstate & TSTATE_PRIV) != 0; in compute_effective_address()
178 addr = (fetch_reg(rs1, regs) + sign_extend_imm13(insn)); in compute_effective_address()
181 addr = (fetch_reg(rs1, regs) + fetch_reg(rs2, regs)); in compute_effective_address()
191 static void __used unaligned_panic(char *str, struct pt_regs *regs) in unaligned_panic() argument
193 die_if_kernel(str, regs); in unaligned_panic()
203 struct pt_regs *regs, int asi, int orig_asi) in do_int_store() argument
212 (unsigned)fetch_reg(reg_num, regs) : 0)) << 32) | in do_int_store()
213 (unsigned)fetch_reg(reg_num + 1, regs); in do_int_store()
215 src_val_p = fetch_reg_addr(reg_num, regs); in do_int_store()
238 static inline void advance(struct pt_regs *regs) in advance() argument
240 regs->tpc = regs->tnpc; in advance()
241 regs->tnpc += 4; in advance()
243 regs->tpc &= 0xffffffff; in advance()
244 regs->tnpc &= 0xffffffff; in advance()
260 struct pt_regs *regs = current_thread_info()->kern_una_regs; in kernel_mna_trap_fault() local
264 entry = search_exception_tables(regs->tpc); in kernel_mna_trap_fault()
268 address = compute_effective_address(regs, insn, in kernel_mna_trap_fault()
283 die_if_kernel("Oops", regs); in kernel_mna_trap_fault()
286 regs->tpc = entry->fixup; in kernel_mna_trap_fault()
287 regs->tnpc = regs->tpc + 4; in kernel_mna_trap_fault()
290 regs->tstate &= ~TSTATE_ASI; in kernel_mna_trap_fault()
291 regs->tstate |= (ASI_AIUS << 24UL); in kernel_mna_trap_fault()
295 static void log_unaligned(struct pt_regs *regs) in log_unaligned() argument
301 regs->tpc, (void *) regs->tpc); in log_unaligned()
305 asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) in kernel_unaligned_trap() argument
308 int size = decode_access_size(regs, insn); in kernel_unaligned_trap()
311 current_thread_info()->kern_una_regs = regs; in kernel_unaligned_trap()
314 orig_asi = asi = decode_asi(insn, regs); in kernel_unaligned_trap()
324 log_unaligned(regs); in kernel_unaligned_trap()
328 "at <%016lx>.\n", regs->tpc); in kernel_unaligned_trap()
330 "unaligned load/store.", regs); in kernel_unaligned_trap()
337 addr = compute_effective_address(regs, insn, in kernel_unaligned_trap()
339 perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS, 1, regs, addr); in kernel_unaligned_trap()
353 reg_addr = fetch_reg_addr(((insn>>25)&0x1f), regs); in kernel_unaligned_trap()
380 (unsigned long *) addr, regs, in kernel_unaligned_trap()
391 advance(regs); in kernel_unaligned_trap()
395 int handle_popc(u32 insn, struct pt_regs *regs) in handle_popc() argument
397 int from_kernel = (regs->tstate & TSTATE_PRIV) != 0; in handle_popc()
401 perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, 0); in handle_popc()
407 value = fetch_reg(insn & 0x1f, regs); in handle_popc()
412 regs->u_regs[rd] = ret; in handle_popc()
414 unsigned long fp = regs->u_regs[UREG_FP]; in handle_popc()
426 advance(regs); in handle_popc()
430 extern void do_fpother(struct pt_regs *regs);
431 extern void do_privact(struct pt_regs *regs);
432 extern void sun4v_data_access_exception(struct pt_regs *regs,
436 int handle_ldf_stq(u32 insn, struct pt_regs *regs) in handle_ldf_stq() argument
438 unsigned long addr = compute_effective_address(regs, insn, 0); in handle_ldf_stq()
441 int asi = decode_asi(insn, regs); in handle_ldf_stq()
444 perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, 0); in handle_ldf_stq()
450 do_fpother(regs); in handle_ldf_stq()
458 first = *(u64 *)&f->regs[freg]; in handle_ldf_stq()
459 second = *(u64 *)&f->regs[freg+2]; in handle_ldf_stq()
462 do_privact(regs); in handle_ldf_stq()
480 sun4v_data_access_exception(regs, addr, 0); in handle_ldf_stq()
482 spitfire_data_access_exception(regs, 0, addr); in handle_ldf_stq()
490 sun4v_data_access_exception(regs, addr, 0); in handle_ldf_stq()
492 spitfire_data_access_exception(regs, 0, addr); in handle_ldf_stq()
502 do_privact(regs); in handle_ldf_stq()
506 sun4v_data_access_exception(regs, addr, 0); in handle_ldf_stq()
508 spitfire_data_access_exception(regs, 0, addr); in handle_ldf_stq()
526 sun4v_data_access_exception(regs, addr, 0); in handle_ldf_stq()
528 spitfire_data_access_exception(regs, 0, addr); in handle_ldf_stq()
550 memset(f->regs, 0, 32*sizeof(u32)); in handle_ldf_stq()
552 memset(f->regs+32, 0, 32*sizeof(u32)); in handle_ldf_stq()
554 memcpy(f->regs + freg, data, size * 4); in handle_ldf_stq()
557 advance(regs); in handle_ldf_stq()
561 void handle_ld_nf(u32 insn, struct pt_regs *regs) in handle_ld_nf() argument
564 int from_kernel = (regs->tstate & TSTATE_PRIV) != 0; in handle_ld_nf()
567 perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, 0); in handle_ld_nf()
570 reg = fetch_reg_addr(rd, regs); in handle_ld_nf()
575 } else if (!test_thread_64bit_stack(regs->u_regs[UREG_FP])) { in handle_ld_nf()
584 advance(regs); in handle_ld_nf()
587 void handle_lddfmna(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr) in handle_lddfmna() argument
590 unsigned long pc = regs->tpc; in handle_lddfmna()
591 unsigned long tstate = regs->tstate; in handle_lddfmna()
599 die_if_kernel("lddfmna from kernel", regs); in handle_lddfmna()
600 perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS, 1, regs, sfar); in handle_lddfmna()
604 int asi = decode_asi(insn, regs); in handle_lddfmna()
632 memset(f->regs, 0, 32*sizeof(u32)); in handle_lddfmna()
634 memset(f->regs+32, 0, 32*sizeof(u32)); in handle_lddfmna()
636 *(u64 *)(f->regs + freg) = value; in handle_lddfmna()
641 sun4v_data_access_exception(regs, sfar, sfsr); in handle_lddfmna()
643 spitfire_data_access_exception(regs, sfsr, sfar); in handle_lddfmna()
646 advance(regs); in handle_lddfmna()
651 void handle_stdfmna(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr) in handle_stdfmna() argument
654 unsigned long pc = regs->tpc; in handle_stdfmna()
655 unsigned long tstate = regs->tstate; in handle_stdfmna()
663 die_if_kernel("stdfmna from kernel", regs); in handle_stdfmna()
664 perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS, 1, regs, sfar); in handle_stdfmna()
668 int asi = decode_asi(insn, regs); in handle_stdfmna()
677 value = *(u64 *)&f->regs[freg]; in handle_stdfmna()
692 sun4v_data_access_exception(regs, sfar, sfsr); in handle_stdfmna()
694 spitfire_data_access_exception(regs, sfsr, sfar); in handle_stdfmna()
697 advance(regs); in handle_stdfmna()