s390/entry: use assignment to read intcode / asm to copy gprs
authorSven Schnelle <svens@linux.ibm.com>
Wed, 5 May 2021 20:01:09 +0000 (22:01 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Mon, 7 Jun 2021 15:06:58 +0000 (17:06 +0200)
arch/s390/kernel/syscall.c: In function __do_syscall:
arch/s390/kernel/syscall.c:147:9: warning: memcpy reading 64 bytes from a region of size 0 [-Wstringop-overread]
  147 |         memcpy(&regs->gprs[8], S390_lowcore.save_area_sync, 8 * sizeof(unsigned long));
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/s390/kernel/syscall.c:148:9: warning: memcpy reading 4 bytes from a region of size 0 [-Wstringop-overread]
  148 |         memcpy(&regs->int_code, &S390_lowcore.svc_ilc, sizeof(regs->int_code));
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Fix this by moving the gprs restore from C to assembly, and use a assignment
for int_code instead of memcpy.

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/asm-offsets.c
arch/s390/kernel/entry.S
arch/s390/kernel/syscall.c

index 22bceee..484065b 100644 (file)
@@ -24,8 +24,7 @@ struct lowcore {
        __u32   ext_params;                     /* 0x0080 */
        __u16   ext_cpu_addr;                   /* 0x0084 */
        __u16   ext_int_code;                   /* 0x0086 */
-       __u16   svc_ilc;                        /* 0x0088 */
-       __u16   svc_code;                       /* 0x008a */
+       __u32   svc_int_code;                   /* 0x0088 */
        __u16   pgm_ilc;                        /* 0x008c */
        __u16   pgm_code;                       /* 0x008e */
        __u32   data_exc_code;                  /* 0x0090 */
index 15e6377..9627058 100644 (file)
@@ -58,8 +58,6 @@ int main(void)
        OFFSET(__LC_EXT_PARAMS, lowcore, ext_params);
        OFFSET(__LC_EXT_CPU_ADDR, lowcore, ext_cpu_addr);
        OFFSET(__LC_EXT_INT_CODE, lowcore, ext_int_code);
-       OFFSET(__LC_SVC_ILC, lowcore, svc_ilc);
-       OFFSET(__LC_SVC_INT_CODE, lowcore, svc_code);
        OFFSET(__LC_PGM_ILC, lowcore, pgm_ilc);
        OFFSET(__LC_PGM_INT_CODE, lowcore, pgm_code);
        OFFSET(__LC_DATA_EXC_CODE, lowcore, data_exc_code);
index 12de7a9..e7094ab 100644 (file)
@@ -276,6 +276,7 @@ ENTRY(system_call)
        xgr     %r10,%r10
        xgr     %r11,%r11
        la      %r2,STACK_FRAME_OVERHEAD(%r15)  # pointer to pt_regs
+       mvc     __PT_R8(64,%r2),__LC_SAVE_AREA_SYNC
        lgr     %r3,%r14
        brasl   %r14,__do_syscall
        lctlg   %c1,%c1,__LC_USER_ASCE
index 4e5cc7d..76f7916 100644 (file)
@@ -144,11 +144,8 @@ void noinstr __do_syscall(struct pt_regs *regs, int per_trap)
 {
        add_random_kstack_offset();
        enter_from_user_mode(regs);
-
-       memcpy(&regs->gprs[8], S390_lowcore.save_area_sync, 8 * sizeof(unsigned long));
-       memcpy(&regs->int_code, &S390_lowcore.svc_ilc, sizeof(regs->int_code));
        regs->psw = S390_lowcore.svc_old_psw;
-
+       regs->int_code = S390_lowcore.svc_int_code;
        update_timer_sys();
 
        local_irq_enable();