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(®s->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>
__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 */
account_idle_time_irq();
do {
- memcpy(®s->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