Lines Matching refs:insn

32 static inline enum direction decode_direction(unsigned int insn)  in decode_direction()  argument
34 unsigned long tmp = (insn >> 21) & 1; in decode_direction()
39 if(((insn>>19)&0x3f) == 15) in decode_direction()
47 static inline int decode_access_size(unsigned int insn) in decode_access_size() argument
49 insn = (insn >> 19) & 3; in decode_access_size()
51 if(!insn) in decode_access_size()
53 else if(insn == 3) in decode_access_size()
55 else if(insn == 2) in decode_access_size()
58 printk("Impossible unaligned trap. insn=%08x\n", insn); in decode_access_size()
65 static inline int decode_signedness(unsigned int insn) in decode_signedness() argument
67 return (insn & 0x400000); in decode_signedness()
135 unsigned int insn) in compute_effective_address() argument
137 unsigned int rs1 = (insn >> 14) & 0x1f; in compute_effective_address()
138 unsigned int rs2 = insn & 0x1f; in compute_effective_address()
139 unsigned int rd = (insn >> 25) & 0x1f; in compute_effective_address()
141 if(insn & 0x2000) { in compute_effective_address()
143 return (fetch_reg(rs1, regs) + sign_extend_imm13(insn)); in compute_effective_address()
151 unsigned int insn) in safe_compute_effective_address() argument
153 unsigned int rs1 = (insn >> 14) & 0x1f; in safe_compute_effective_address()
154 unsigned int rs2 = insn & 0x1f; in safe_compute_effective_address()
155 unsigned int rd = (insn >> 25) & 0x1f; in safe_compute_effective_address()
157 if(insn & 0x2000) { in safe_compute_effective_address()
159 return (safe_fetch_reg(rs1, regs) + sign_extend_imm13(insn)); in safe_compute_effective_address()
203 static inline int floating_point_load_or_store_p(unsigned int insn) in floating_point_load_or_store_p() argument
205 return (insn >> 24) & 1; in floating_point_load_or_store_p()
208 static inline int ok_for_kernel(unsigned int insn) in ok_for_kernel() argument
210 return !floating_point_load_or_store_p(insn); in ok_for_kernel()
213 static void kernel_mna_trap_fault(struct pt_regs *regs, unsigned int insn) in kernel_mna_trap_fault() argument
219 unsigned long address = compute_effective_address(regs, insn); in kernel_mna_trap_fault()
239 asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) in kernel_unaligned_trap() argument
241 enum direction dir = decode_direction(insn); in kernel_unaligned_trap()
242 int size = decode_access_size(insn); in kernel_unaligned_trap()
244 if(!ok_for_kernel(insn) || dir == both) { in kernel_unaligned_trap()
249 unsigned long addr = compute_effective_address(regs, insn); in kernel_unaligned_trap()
255 err = do_int_load(fetch_reg_addr(((insn>>25)&0x1f), in kernel_unaligned_trap()
258 decode_signedness(insn)); in kernel_unaligned_trap()
262 err = do_int_store(((insn>>25)&0x1f), size, in kernel_unaligned_trap()
270 kernel_mna_trap_fault(regs, insn); in kernel_unaligned_trap()
276 static inline int ok_for_user(struct pt_regs *regs, unsigned int insn, in ok_for_user() argument
281 int size = ((insn >> 19) & 3) == 3 ? 8 : 4; in ok_for_user()
290 reg = (insn >> 25) & 0x1f; in ok_for_user()
295 reg = (insn >> 14) & 0x1f; in ok_for_user()
300 if (!(insn & 0x2000)) { in ok_for_user()
301 reg = (insn & 0x1f); in ok_for_user()
311 static void user_mna_trap_fault(struct pt_regs *regs, unsigned int insn) in user_mna_trap_fault() argument
318 info.si_addr = (void __user *)safe_compute_effective_address(regs, insn); in user_mna_trap_fault()
323 asmlinkage void user_unaligned_trap(struct pt_regs *regs, unsigned int insn) in user_unaligned_trap() argument
328 (((insn >> 30) & 3) != 3)) in user_unaligned_trap()
330 dir = decode_direction(insn); in user_unaligned_trap()
331 if(!ok_for_user(regs, insn, dir)) { in user_unaligned_trap()
334 int err, size = decode_access_size(insn); in user_unaligned_trap()
337 if(floating_point_load_or_store_p(insn)) { in user_unaligned_trap()
342 addr = compute_effective_address(regs, insn); in user_unaligned_trap()
346 err = do_int_load(fetch_reg_addr(((insn>>25)&0x1f), in user_unaligned_trap()
349 decode_signedness(insn)); in user_unaligned_trap()
353 err = do_int_store(((insn>>25)&0x1f), size, in user_unaligned_trap()
378 user_mna_trap_fault(regs, insn); in user_unaligned_trap()