]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
s390/irq: add union/struct to access io interrupt data
authorSven Schnelle <svens@linux.ibm.com>
Wed, 5 May 2021 20:01:12 +0000 (22:01 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 26 May 2021 21:18:18 +0000 (23:18 +0200)
arch/s390/kernel/irq.c: In function do_io_irq:
arch/s390/kernel/irq.c:149:17: warning: memcpy reading 12 bytes from a region of size 0 [-Wstringop-overread]
  149 |                 memcpy(&regs->int_code, &S390_lowcore.subchannel_id, 12);
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Fix this by adding a struct for the subchannel data to struct lowcore.

Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/include/asm/lowcore.h
arch/s390/kernel/irq.c

index d08813c7f46254c033a0e0b853d5318585c03300..8f58c28277730b9004b7d359bed395b7cbdd4acf 100644 (file)
@@ -44,8 +44,13 @@ struct lowcore {
        __u8    pad_0x00a4[0x00a8-0x00a4];      /* 0x00a4 */
        __u64   trans_exc_code;                 /* 0x00a8 */
        __u64   monitor_code;                   /* 0x00b0 */
-       __u16   subchannel_id;                  /* 0x00b8 */
-       __u16   subchannel_nr;                  /* 0x00ba */
+       union {
+               struct {
+                       __u16   subchannel_id;  /* 0x00b8 */
+                       __u16   subchannel_nr;  /* 0x00ba */
+               } __packed;
+               __u32 subchannel;
+       } __packed;
        __u32   io_int_parm;                    /* 0x00bc */
        __u32   io_int_word;                    /* 0x00c0 */
        __u8    pad_0x00c4[0x00c8-0x00c4];      /* 0x00c4 */
index 169258012530a47f12dc56bc616093bf61e8ec60..1370d372301718149fbcfbf3359fea31489482be 100644 (file)
@@ -146,7 +146,10 @@ void noinstr do_io_irq(struct pt_regs *regs)
                account_idle_time_irq();
 
        do {
-               memcpy(&regs->int_code, &S390_lowcore.subchannel_id, 12);
+               regs->int_code = S390_lowcore.subchannel;
+               regs->int_parm = S390_lowcore.io_int_parm;
+               regs->int_parm_long = (unsigned long)S390_lowcore.io_int_word << 32;
+
                if (S390_lowcore.io_int_word & BIT(31))
                        do_irq_async(regs, THIN_INTERRUPT);
                else