s390/facilities: always use lowcore's stfle field for storing facility bits
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Tue, 24 Nov 2015 11:33:07 +0000 (12:33 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 18 Dec 2015 13:59:19 +0000 (14:59 +0100)
head.s contains an stfle instruction which stores it result at the
storage location that is assigned to the stfl instruction.

This is currently no problem, since we only care about one double
word. However if the number of double words in the ALS bitfield grows
the current code is not very stable.

E.g. before issuing the stfle command the memory to which it stores
must be cleared, since the instruction may or may not clear memory
contents where no bits are set.

In order to simplify the code a bit always use the storage location
that we reserved for the stfle result.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/asm-offsets.c
arch/s390/kernel/head.S
arch/s390/kernel/head64.S

index ae7b565b6c4c7872f3391f4980c538d9b0daa73a..d8d18f8d8b7759ef802a0c749016df29872ca5a3 100644 (file)
@@ -120,6 +120,7 @@ int main(void)
        OFFSET(__LC_IO_INT_PARM, _lowcore, io_int_parm);
        OFFSET(__LC_IO_INT_WORD, _lowcore, io_int_word);
        OFFSET(__LC_STFL_FAC_LIST, _lowcore, stfl_fac_list);
+       OFFSET(__LC_STFLE_FAC_LIST, _lowcore, stfle_fac_list);
        OFFSET(__LC_MCCK_CODE, _lowcore, mcck_interruption_code);
        OFFSET(__LC_MCCK_FAIL_STOR_ADDR, _lowcore, failing_storage_address);
        OFFSET(__LC_LAST_BREAK, _lowcore, breaking_event_addr);
index d893d5aeb3070e6c9e72ee4f344c8b1be1296ad3..d28a148491268a076a989f151ca41bbb0bcd556e 100644 (file)
@@ -300,19 +300,19 @@ ENTRY(startup_kdump)
        xc      0x200(256),0x200        # partially clear lowcore
        xc      0x300(256),0x300
        xc      0xe00(256),0xe00
+       xc      0xf00(256),0xf00
        lctlg   %c0,%c15,0x200(%r0)     # initialize control registers
        stck    __LC_LAST_UPDATE_CLOCK
        spt     6f-.LPG0(%r13)
        mvc     __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
-       xc      __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
-       # check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
        stfl    0(%r0)                  # store facilities @ __LC_STFL_FAC_LIST
-       tm      __LC_STFL_FAC_LIST,0x01 # stfle available ?
+       mvc     __LC_STFLE_FAC_LIST(4),__LC_STFL_FAC_LIST
+       tm      __LC_STFLE_FAC_LIST,0x01        # stfle available ?
        jz      0f
        la      %r0,1
-       .insn   s,0xb2b00000,__LC_STFL_FAC_LIST # store facility list extended
+       .insn   s,0xb2b00000,__LC_STFLE_FAC_LIST # store facility list extended
        # verify if all required facilities are supported by the machine
-0:     la      %r1,__LC_STFL_FAC_LIST
+0:     la      %r1,__LC_STFLE_FAC_LIST
        la      %r2,3f+8-.LPG0(%r13)
        l       %r3,0(%r2)
 1:     l       %r0,0(%r1)
index 58b719fa8067a5b7e2ec428c0babc758c6dc0eb4..c5febe84eba633385cd7a8c09bee87e484c2e05c 100644 (file)
@@ -16,7 +16,7 @@
 
 __HEAD
 ENTRY(startup_continue)
-       tm      __LC_STFL_FAC_LIST+6,0x80       # LPP available ?
+       tm      __LC_STFLE_FAC_LIST+6,0x80      # LPP available ?
        jz      0f
        xc      __LC_LPP+1(7,0),__LC_LPP+1      # clear lpp and current_pid
        mvi     __LC_LPP,0x80                   #   and set LPP_MAGIC