33 * Unaligned memory access handler
44 *
55 * Copyright (C) 2001 Randolph Chung <tausq@debian.org>
6+ * Copyright (C) 2022 Helge Deller <deller@gmx.de>
67 * Significantly tweaked by LaMont Jones <lamont@debian.org>
78 */
89
9- #include <linux/jiffies.h>
10- #include <linux/kernel.h>
11- #include <linux/module.h>
1210#include <linux/sched/signal.h>
13- #include <linux/sched/debug.h>
1411#include <linux/signal.h>
1512#include <linux/ratelimit.h>
1613#include <linux/uaccess.h>
2522#define DPRINTF (fmt , args ...)
2623#endif
2724
28- #ifdef CONFIG_64BIT
29- #define RFMT "%016lx"
30- #else
31- #define RFMT "%08lx"
32- #endif
25+ #define RFMT "%#08lx"
3326
3427/* 1111 1100 0000 0000 0001 0011 1100 0000 */
3528#define OPCODE1 (a ,b ,c ) ((a)<<26|(b)<<12|(c)<<6)
@@ -130,7 +123,7 @@ static int emulate_ldh(struct pt_regs *regs, int toreg)
130123 : "+r" (val ), "+r" (ret ), "=&r" (temp1 )
131124 : "r" (saddr ), "r" (regs -> isr ) );
132125
133- DPRINTF ("val = 0x " RFMT "\n" , val );
126+ DPRINTF ("val = " RFMT "\n" , val );
134127
135128 if (toreg )
136129 regs -> gr [toreg ] = val ;
@@ -162,7 +155,7 @@ static int emulate_ldw(struct pt_regs *regs, int toreg, int flop)
162155 : "+r" (val ), "+r" (ret ), "=&r" (temp1 ), "=&r" (temp2 )
163156 : "r" (saddr ), "r" (regs -> isr ) );
164157
165- DPRINTF ("val = 0x " RFMT "\n" , val );
158+ DPRINTF ("val = " RFMT "\n" , val );
166159
167160 if (flop )
168161 ((__u32 * )(regs -> fr ))[toreg ] = val ;
@@ -240,7 +233,7 @@ static int emulate_sth(struct pt_regs *regs, int frreg)
240233 if (!frreg )
241234 val = 0 ;
242235
243- DPRINTF ("store r%d (0x " RFMT ") to " RFMT ":" RFMT " for 2 bytes\n" , frreg ,
236+ DPRINTF ("store r%d (" RFMT ") to " RFMT ":" RFMT " for 2 bytes\n" , frreg ,
244237 val , regs -> isr , regs -> ior );
245238
246239 __asm__ __volatile__ (
@@ -269,7 +262,7 @@ static int emulate_stw(struct pt_regs *regs, int frreg, int flop)
269262 else
270263 val = 0 ;
271264
272- DPRINTF ("store r%d (0x " RFMT ") to " RFMT ":" RFMT " for 4 bytes\n" , frreg ,
265+ DPRINTF ("store r%d (" RFMT ") to " RFMT ":" RFMT " for 4 bytes\n" , frreg ,
273266 val , regs -> isr , regs -> ior );
274267
275268
@@ -383,7 +376,6 @@ void handle_unaligned(struct pt_regs *regs)
383376 unsigned long newbase = R1 (regs -> iir )?regs -> gr [R1 (regs -> iir )]:0 ;
384377 int modify = 0 ;
385378 int ret = ERR_NOTHANDLED ;
386- register int flop = 0 ; /* true if this is a flop */
387379
388380 __inc_irq_stat (irq_unaligned_count );
389381
@@ -395,10 +387,10 @@ void handle_unaligned(struct pt_regs *regs)
395387
396388 if (!(current -> thread .flags & PARISC_UAC_NOPRINT ) &&
397389 __ratelimit (& ratelimit )) {
398- char buf [ 256 ];
399- sprintf ( buf , "%s(%d): unaligned access to 0x " RFMT " at ip=0x " RFMT "\n" ,
400- current -> comm , task_pid_nr (current ), regs -> ior , regs -> iaoq [ 0 ]);
401- printk ( KERN_WARNING "%s" , buf );
390+ printk ( KERN_WARNING "%s(%d): unaligned access to " RFMT
391+ " at ip " RFMT " (iir " RFMT ") \n" ,
392+ current -> comm , task_pid_nr (current ), regs -> ior ,
393+ regs -> iaoq [ 0 ], regs -> iir );
402394#ifdef DEBUG_UNALIGNED
403395 show_regs (regs );
404396#endif
@@ -510,27 +502,23 @@ void handle_unaligned(struct pt_regs *regs)
510502 case OPCODE_FLDWS :
511503 case OPCODE_FLDWXR :
512504 case OPCODE_FLDWSR :
513- flop = 1 ;
514505 ret = emulate_ldw (regs ,FR3 (regs -> iir ),1 );
515506 break ;
516507
517508 case OPCODE_FLDDX :
518509 case OPCODE_FLDDS :
519- flop = 1 ;
520510 ret = emulate_ldd (regs ,R3 (regs -> iir ),1 );
521511 break ;
522512
523513 case OPCODE_FSTWX :
524514 case OPCODE_FSTWS :
525515 case OPCODE_FSTWXR :
526516 case OPCODE_FSTWSR :
527- flop = 1 ;
528517 ret = emulate_stw (regs ,FR3 (regs -> iir ),1 );
529518 break ;
530519
531520 case OPCODE_FSTDX :
532521 case OPCODE_FSTDS :
533- flop = 1 ;
534522 ret = emulate_std (regs ,R3 (regs -> iir ),1 );
535523 break ;
536524
@@ -544,11 +532,9 @@ void handle_unaligned(struct pt_regs *regs)
544532 switch (regs -> iir & OPCODE2_MASK )
545533 {
546534 case OPCODE_FLDD_L :
547- flop = 1 ;
548535 ret = emulate_ldd (regs ,R2 (regs -> iir ),1 );
549536 break ;
550537 case OPCODE_FSTD_L :
551- flop = 1 ;
552538 ret = emulate_std (regs , R2 (regs -> iir ),1 );
553539 break ;
554540#ifdef CONFIG_64BIT
@@ -563,15 +549,13 @@ void handle_unaligned(struct pt_regs *regs)
563549 switch (regs -> iir & OPCODE3_MASK )
564550 {
565551 case OPCODE_FLDW_L :
566- flop = 1 ;
567552 ret = emulate_ldw (regs , R2 (regs -> iir ), 1 );
568553 break ;
569554 case OPCODE_LDW_M :
570555 ret = emulate_ldw (regs , R2 (regs -> iir ), 0 );
571556 break ;
572557
573558 case OPCODE_FSTW_L :
574- flop = 1 ;
575559 ret = emulate_stw (regs , R2 (regs -> iir ),1 );
576560 break ;
577561 case OPCODE_STW_M :
0 commit comments