]> Git Repo - linux.git/commitdiff
Merge tag 's390-6.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
authorLinus Torvalds <[email protected]>
Tue, 21 May 2024 19:09:36 +0000 (12:09 -0700)
committerLinus Torvalds <[email protected]>
Tue, 21 May 2024 19:09:36 +0000 (12:09 -0700)
Pull more s390 updates from Alexander Gordeev:

 - Switch read and write software bits for PUDs

 - Add missing hardware bits for PUDs and PMDs

 - Generate unwind information for C modules to fix GDB unwind error for
   vDSO functions

 - Create .build-id links for unstripped vDSO files to enable vDSO
   debugging with symbols

 - Use standard stack frame layout for vDSO generated stack frames to
   manually walk stack frames without DWARF information

 - Rework perf_callchain_user() and arch_stack_walk_user() functions to
   reduce code duplication

 - Skip first stack frame when walking user stack

 - Add basic checks to identify invalid instruction pointers when
   walking stack frames

 - Introduce and use struct stack_frame_vdso_wrapper within vDSO user
   wrapper code to automatically generate an asm-offset define. Also use
   STACK_FRAME_USER_OVERHEAD instead of STACK_FRAME_OVERHEAD to document
   that the code works with user space stack

 - Clear the backchain of the extra stack frame added by the vDSO user
   wrapper code. This allows the user stack walker to detect and skip
   the non-standard stack frame. Without this an incorrect instruction
   pointer would be added to stack traces.

 - Rewrite psw_idle() function in C to ease maintenance and further
   enhancements

 - Remove get_vtimer() function and use get_cpu_timer() instead

 - Mark psw variable in __load_psw_mask() as __unitialized to avoid
   superfluous clearing of PSW

 - Remove obsolete and superfluous comment about removed TIF_FPU flag

 - Replace memzero_explicit() and kfree() with kfree_sensitive() to fix
   warnings reported by Coccinelle

 - Wipe sensitive data and all copies of protected- or secure-keys from
   stack when an IOCTL fails

 - Both do_airq_interrupt() and do_io_interrupt() functions set
   CIF_NOHZ_DELAY flag. Move it in do_io_irq() to simplify the code

 - Provide iucv_alloc_device() and iucv_release_device() helpers, which
   can be used to deduplicate more or less identical IUCV device
   allocation and release code in four different drivers

 - Make use of iucv_alloc_device() and iucv_release_device() helpers to
   get rid of quite some code and also remove a cast to an incompatible
   function (clang W=1)

 - There is no user of iucv_root outside of the core IUCV code left.
   Therefore remove the EXPORT_SYMBOL

 - __apply_alternatives() contains a runtime check which verifies that
   the size of the to be patched code area is even. Convert this to a
   compile time check

 - Increase size of buffers for sending z/VM CP DIAGNOSE X'008' commands
   from 128 to 240

 - Do not accept z/VM CP DIAGNOSE X'008' commands longer than maximally
   allowed

 - Use correct defines IPL_BP_NVME_LEN and IPL_BP0_NVME_LEN instead of
   IPL_BP_FCP_LEN and IPL_BP0_FCP_LEN ones to initialize NVMe reIPL
   block on 'scp_data' sysfs attribute update

 - Initialize the correct fields of the NVMe dump block, which were
   confused with FCP fields

 - Refactor macros for 'scp_data' (re-)IPL sysfs attribute to reduce
   code duplication

 - Introduce 'scp_data' sysfs attribute for dump IPL to allow tools such
   as dumpconf passing additional kernel command line parameters to a
   stand-alone dumper

 - Rework the CPACF query functions to use the correct RRE or RRF
   instruction formats and set instruction register fields correctly

 - Instead of calling BUG() at runtime force a link error during compile
   when a unsupported opcode is used with __cpacf_query() or
   __cpacf_check_opcode() functions

 - Fix a crash in ap_parse_bitmap_str() function on /sys/bus/ap/apmask
   or /sys/bus/ap/aqmask sysfs file update with a relative mask value

 - Fix "bindings complete" udev event which should be sent once all AP
   devices have been bound to device drivers and again when unbind/bind
   actions take place and all AP devices are bound again

 - Facility list alt_stfle_fac_list is nowhere used in the decompressor,
   therefore remove it there

 - Remove custom kprobes insn slot allocator in favour of the standard
   module_alloc() one, since kernel image and module areas are located
   within 4GB

 - Use kvcalloc() instead of kvmalloc_array() in zcrypt driver to avoid
   calling memset() with a large byte count and get rid of the sparse
   warning as result

* tag 's390-6.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (39 commits)
  s390/zcrypt: Use kvcalloc() instead of kvmalloc_array()
  s390/kprobes: Remove custom insn slot allocator
  s390/boot: Remove alt_stfle_fac_list from decompressor
  s390/ap: Fix bind complete udev event sent after each AP bus scan
  s390/ap: Fix crash in AP internal function modify_bitmap()
  s390/cpacf: Make use of invalid opcode produce a link error
  s390/cpacf: Split and rework cpacf query functions
  s390/ipl: Introduce sysfs attribute 'scp_data' for dump ipl
  s390/ipl: Introduce macros for (re)ipl sysfs attribute 'scp_data'
  s390/ipl: Fix incorrect initialization of nvme dump block
  s390/ipl: Fix incorrect initialization of len fields in nvme reipl block
  s390/ipl: Do not accept z/VM CP diag X'008' cmds longer than max length
  s390/ipl: Fix size of vmcmd buffers for sending z/VM CP diag X'008' cmds
  s390/alternatives: Convert runtime sanity check into compile time check
  s390/iucv: Unexport iucv_root
  tty: hvc-iucv: Make use of iucv_alloc_device()
  s390/smsgiucv_app: Make use of iucv_alloc_device()
  s390/netiucv: Make use of iucv_alloc_device()
  s390/vmlogrdr: Make use of iucv_alloc_device()
  s390/iucv: Provide iucv_alloc_device() / iucv_release_device()
  ...

1  2 
arch/s390/include/asm/pgtable.h
arch/s390/kernel/ipl.c
arch/s390/kernel/irq.c
arch/s390/kernel/kprobes.c
arch/s390/kernel/vdso32/Makefile
arch/s390/kernel/vdso64/Makefile
net/iucv/iucv.c
scripts/Makefile.vdsoinst

index ad55b5b99a75840b1e36f8e24265f05b510a9426,07f0307905ffeaad67853ef64eb3b730c5be9b22..70b6ee557eb2246be9d06e76ded170f0a9b974b6
@@@ -268,12 -268,14 +268,14 @@@ static inline int is_module_addr(void *
  #define _REGION3_ENTRY                (_REGION_ENTRY_TYPE_R3 | _REGION_ENTRY_LENGTH)
  #define _REGION3_ENTRY_EMPTY  (_REGION_ENTRY_TYPE_R3 | _REGION_ENTRY_INVALID)
  
+ #define _REGION3_ENTRY_HARDWARE_BITS          0xfffffffffffff6ffUL
+ #define _REGION3_ENTRY_HARDWARE_BITS_LARGE    0xffffffff8001073cUL
  #define _REGION3_ENTRY_ORIGIN_LARGE ~0x7fffffffUL /* large page address            */
  #define _REGION3_ENTRY_DIRTY  0x2000  /* SW region dirty bit */
  #define _REGION3_ENTRY_YOUNG  0x1000  /* SW region young bit */
  #define _REGION3_ENTRY_LARGE  0x0400  /* RTTE-format control, large page  */
- #define _REGION3_ENTRY_READ   0x0002  /* SW region read bit */
- #define _REGION3_ENTRY_WRITE  0x0001  /* SW region write bit */
+ #define _REGION3_ENTRY_WRITE  0x0002  /* SW region write bit */
+ #define _REGION3_ENTRY_READ   0x0001  /* SW region read bit */
  
  #ifdef CONFIG_MEM_SOFT_DIRTY
  #define _REGION3_ENTRY_SOFT_DIRTY 0x4000 /* SW region soft dirty bit */
  #define _REGION_ENTRY_BITS     0xfffffffffffff22fUL
  
  /* Bits in the segment table entry */
- #define _SEGMENT_ENTRY_BITS                   0xfffffffffffffe33UL
- #define _SEGMENT_ENTRY_HARDWARE_BITS          0xfffffffffffffe30UL
- #define _SEGMENT_ENTRY_HARDWARE_BITS_LARGE    0xfffffffffff00730UL
+ #define _SEGMENT_ENTRY_BITS                   0xfffffffffffffe3fUL
+ #define _SEGMENT_ENTRY_HARDWARE_BITS          0xfffffffffffffe3cUL
+ #define _SEGMENT_ENTRY_HARDWARE_BITS_LARGE    0xfffffffffff1073cUL
  #define _SEGMENT_ENTRY_ORIGIN_LARGE ~0xfffffUL /* large page address      */
  #define _SEGMENT_ENTRY_ORIGIN ~0x7ffUL/* page table origin                */
  #define _SEGMENT_ENTRY_PROTECT        0x200   /* segment protection bit           */
@@@ -1421,7 -1423,6 +1423,7 @@@ static inline unsigned long pud_deref(p
        return (unsigned long)__va(pud_val(pud) & origin_mask);
  }
  
 +#define pud_pfn pud_pfn
  static inline unsigned long pud_pfn(pud_t pud)
  {
        return __pa(pud_deref(pud)) >> PAGE_SHIFT;
@@@ -1785,10 -1786,8 +1787,10 @@@ static inline pmd_t pmdp_huge_clear_flu
  static inline pmd_t pmdp_invalidate(struct vm_area_struct *vma,
                                   unsigned long addr, pmd_t *pmdp)
  {
 -      pmd_t pmd = __pmd(pmd_val(*pmdp) | _SEGMENT_ENTRY_INVALID);
 +      pmd_t pmd;
  
 +      VM_WARN_ON_ONCE(!pmd_present(*pmdp));
 +      pmd = __pmd(pmd_val(*pmdp) | _SEGMENT_ENTRY_INVALID);
        return pmdp_xchg_direct(vma->vm_mm, addr, pmdp, pmd);
  }
  
diff --combined arch/s390/kernel/ipl.c
index f3609a0d453d5953301fe69c2f3bd5d8dbf481c4,ff6bd177f69f2bab05412ab38033236b335de68c..3a7d6e1722112ac37813329309cab839cc454580
@@@ -20,7 -20,6 +20,7 @@@
  #include <linux/gfp.h>
  #include <linux/crash_dump.h>
  #include <linux/debug_locks.h>
 +#include <linux/vmalloc.h>
  #include <asm/asm-extable.h>
  #include <asm/diag.h>
  #include <asm/ipl.h>
@@@ -267,7 -266,11 +267,11 @@@ static ssize_t sys_##_prefix##_##_name#
                struct kobj_attribute *attr,                            \
                const char *buf, size_t len)                            \
  {                                                                     \
-       strscpy(_value, buf, sizeof(_value));                           \
+       if (len >= sizeof(_value))                                      \
+               return -E2BIG;                                          \
+       len = strscpy(_value, buf, sizeof(_value));                     \
+       if (len < 0)                                                    \
+               return len;                                             \
        strim(_value);                                                  \
        return len;                                                     \
  }                                                                     \
@@@ -276,6 -279,61 +280,61 @@@ static struct kobj_attribute sys_##_pre
                        sys_##_prefix##_##_name##_show,                 \
                        sys_##_prefix##_##_name##_store)
  
+ #define IPL_ATTR_SCP_DATA_SHOW_FN(_prefix, _ipl_block)                        \
+ static ssize_t sys_##_prefix##_scp_data_show(struct file *filp,               \
+                                           struct kobject *kobj,       \
+                                           struct bin_attribute *attr, \
+                                           char *buf, loff_t off,      \
+                                           size_t count)               \
+ {                                                                     \
+       size_t size = _ipl_block.scp_data_len;                          \
+       void *scp_data = _ipl_block.scp_data;                           \
+                                                                       \
+       return memory_read_from_buffer(buf, count, &off,                \
+                                      scp_data, size);                 \
+ }
+ #define IPL_ATTR_SCP_DATA_STORE_FN(_prefix, _ipl_block_hdr, _ipl_block, _ipl_bp_len, _ipl_bp0_len)\
+ static ssize_t sys_##_prefix##_scp_data_store(struct file *filp,      \
+                                       struct kobject *kobj,           \
+                                       struct bin_attribute *attr,     \
+                                       char *buf, loff_t off,          \
+                                       size_t count)                   \
+ {                                                                     \
+       size_t scpdata_len = count;                                     \
+       size_t padding;                                                 \
+                                                                       \
+       if (off)                                                        \
+               return -EINVAL;                                         \
+                                                                       \
+       memcpy(_ipl_block.scp_data, buf, count);                        \
+       if (scpdata_len % 8) {                                          \
+               padding = 8 - (scpdata_len % 8);                        \
+               memset(_ipl_block.scp_data + scpdata_len,               \
+                      0, padding);                                     \
+               scpdata_len += padding;                                 \
+       }                                                               \
+                                                                       \
+       _ipl_block_hdr.len = _ipl_bp_len + scpdata_len;                 \
+       _ipl_block.len = _ipl_bp0_len + scpdata_len;                    \
+       _ipl_block.scp_data_len = scpdata_len;                          \
+                                                                       \
+       return count;                                                   \
+ }
+ #define DEFINE_IPL_ATTR_SCP_DATA_RO(_prefix, _ipl_block, _size)               \
+ IPL_ATTR_SCP_DATA_SHOW_FN(_prefix, _ipl_block)                                \
+ static struct bin_attribute sys_##_prefix##_scp_data_attr =           \
+       __BIN_ATTR(scp_data, 0444, sys_##_prefix##_scp_data_show,       \
+                  NULL, _size)
+ #define DEFINE_IPL_ATTR_SCP_DATA_RW(_prefix, _ipl_block_hdr, _ipl_block, _ipl_bp_len, _ipl_bp0_len, _size)\
+ IPL_ATTR_SCP_DATA_SHOW_FN(_prefix, _ipl_block)                                        \
+ IPL_ATTR_SCP_DATA_STORE_FN(_prefix, _ipl_block_hdr, _ipl_block, _ipl_bp_len, _ipl_bp0_len)\
+ static struct bin_attribute sys_##_prefix##_scp_data_attr =                   \
+       __BIN_ATTR(scp_data, 0644, sys_##_prefix##_scp_data_show,               \
+                  sys_##_prefix##_scp_data_store, _size)
  /*
   * ipl section
   */
@@@ -374,71 -432,38 +433,38 @@@ static ssize_t sys_ipl_device_show(stru
  static struct kobj_attribute sys_ipl_device_attr =
        __ATTR(device, 0444, sys_ipl_device_show, NULL);
  
- static ssize_t ipl_parameter_read(struct file *filp, struct kobject *kobj,
-                                 struct bin_attribute *attr, char *buf,
-                                 loff_t off, size_t count)
+ static ssize_t sys_ipl_parameter_read(struct file *filp, struct kobject *kobj,
+                                     struct bin_attribute *attr, char *buf,
+                                     loff_t off, size_t count)
  {
        return memory_read_from_buffer(buf, count, &off, &ipl_block,
                                       ipl_block.hdr.len);
  }
- static struct bin_attribute ipl_parameter_attr =
-       __BIN_ATTR(binary_parameter, 0444, ipl_parameter_read, NULL,
+ static struct bin_attribute sys_ipl_parameter_attr =
+       __BIN_ATTR(binary_parameter, 0444, sys_ipl_parameter_read, NULL,
                   PAGE_SIZE);
  
- static ssize_t ipl_scp_data_read(struct file *filp, struct kobject *kobj,
-                                struct bin_attribute *attr, char *buf,
-                                loff_t off, size_t count)
- {
-       unsigned int size = ipl_block.fcp.scp_data_len;
-       void *scp_data = &ipl_block.fcp.scp_data;
-       return memory_read_from_buffer(buf, count, &off, scp_data, size);
- }
- static ssize_t ipl_nvme_scp_data_read(struct file *filp, struct kobject *kobj,
-                                struct bin_attribute *attr, char *buf,
-                                loff_t off, size_t count)
- {
-       unsigned int size = ipl_block.nvme.scp_data_len;
-       void *scp_data = &ipl_block.nvme.scp_data;
-       return memory_read_from_buffer(buf, count, &off, scp_data, size);
- }
- static ssize_t ipl_eckd_scp_data_read(struct file *filp, struct kobject *kobj,
-                                     struct bin_attribute *attr, char *buf,
-                                     loff_t off, size_t count)
- {
-       unsigned int size = ipl_block.eckd.scp_data_len;
-       void *scp_data = &ipl_block.eckd.scp_data;
-       return memory_read_from_buffer(buf, count, &off, scp_data, size);
- }
- static struct bin_attribute ipl_scp_data_attr =
-       __BIN_ATTR(scp_data, 0444, ipl_scp_data_read, NULL, PAGE_SIZE);
- static struct bin_attribute ipl_nvme_scp_data_attr =
-       __BIN_ATTR(scp_data, 0444, ipl_nvme_scp_data_read, NULL, PAGE_SIZE);
- static struct bin_attribute ipl_eckd_scp_data_attr =
-       __BIN_ATTR(scp_data, 0444, ipl_eckd_scp_data_read, NULL, PAGE_SIZE);
+ DEFINE_IPL_ATTR_SCP_DATA_RO(ipl_fcp, ipl_block.fcp, PAGE_SIZE);
  
  static struct bin_attribute *ipl_fcp_bin_attrs[] = {
-       &ipl_parameter_attr,
-       &ipl_scp_data_attr,
+       &sys_ipl_parameter_attr,
+       &sys_ipl_fcp_scp_data_attr,
        NULL,
  };
  
+ DEFINE_IPL_ATTR_SCP_DATA_RO(ipl_nvme, ipl_block.nvme, PAGE_SIZE);
  static struct bin_attribute *ipl_nvme_bin_attrs[] = {
-       &ipl_parameter_attr,
-       &ipl_nvme_scp_data_attr,
+       &sys_ipl_parameter_attr,
+       &sys_ipl_nvme_scp_data_attr,
        NULL,
  };
  
+ DEFINE_IPL_ATTR_SCP_DATA_RO(ipl_eckd, ipl_block.eckd, PAGE_SIZE);
  static struct bin_attribute *ipl_eckd_bin_attrs[] = {
-       &ipl_parameter_attr,
-       &ipl_eckd_scp_data_attr,
+       &sys_ipl_parameter_attr,
+       &sys_ipl_eckd_scp_data_attr,
        NULL,
  };
  
@@@ -777,44 -802,10 +803,10 @@@ static struct kobj_attribute sys_reipl_
  
  /* FCP reipl device attributes */
  
- static ssize_t reipl_fcp_scpdata_read(struct file *filp, struct kobject *kobj,
-                                     struct bin_attribute *attr,
-                                     char *buf, loff_t off, size_t count)
- {
-       size_t size = reipl_block_fcp->fcp.scp_data_len;
-       void *scp_data = reipl_block_fcp->fcp.scp_data;
-       return memory_read_from_buffer(buf, count, &off, scp_data, size);
- }
- static ssize_t reipl_fcp_scpdata_write(struct file *filp, struct kobject *kobj,
-                                      struct bin_attribute *attr,
-                                      char *buf, loff_t off, size_t count)
- {
-       size_t scpdata_len = count;
-       size_t padding;
-       if (off)
-               return -EINVAL;
-       memcpy(reipl_block_fcp->fcp.scp_data, buf, count);
-       if (scpdata_len % 8) {
-               padding = 8 - (scpdata_len % 8);
-               memset(reipl_block_fcp->fcp.scp_data + scpdata_len,
-                      0, padding);
-               scpdata_len += padding;
-       }
-       reipl_block_fcp->hdr.len = IPL_BP_FCP_LEN + scpdata_len;
-       reipl_block_fcp->fcp.len = IPL_BP0_FCP_LEN + scpdata_len;
-       reipl_block_fcp->fcp.scp_data_len = scpdata_len;
-       return count;
- }
- static struct bin_attribute sys_reipl_fcp_scp_data_attr =
-       __BIN_ATTR(scp_data, 0644, reipl_fcp_scpdata_read,
-                  reipl_fcp_scpdata_write, DIAG308_SCPDATA_SIZE);
+ DEFINE_IPL_ATTR_SCP_DATA_RW(reipl_fcp, reipl_block_fcp->hdr,
+                           reipl_block_fcp->fcp,
+                           IPL_BP_FCP_LEN, IPL_BP0_FCP_LEN,
+                           DIAG308_SCPDATA_SIZE);
  
  static struct bin_attribute *reipl_fcp_bin_attrs[] = {
        &sys_reipl_fcp_scp_data_attr,
@@@ -935,44 -926,10 +927,10 @@@ static struct kobj_attribute sys_reipl_
  
  /* NVME reipl device attributes */
  
- static ssize_t reipl_nvme_scpdata_read(struct file *filp, struct kobject *kobj,
-                                     struct bin_attribute *attr,
-                                     char *buf, loff_t off, size_t count)
- {
-       size_t size = reipl_block_nvme->nvme.scp_data_len;
-       void *scp_data = reipl_block_nvme->nvme.scp_data;
-       return memory_read_from_buffer(buf, count, &off, scp_data, size);
- }
- static ssize_t reipl_nvme_scpdata_write(struct file *filp, struct kobject *kobj,
-                                      struct bin_attribute *attr,
-                                      char *buf, loff_t off, size_t count)
- {
-       size_t scpdata_len = count;
-       size_t padding;
-       if (off)
-               return -EINVAL;
-       memcpy(reipl_block_nvme->nvme.scp_data, buf, count);
-       if (scpdata_len % 8) {
-               padding = 8 - (scpdata_len % 8);
-               memset(reipl_block_nvme->nvme.scp_data + scpdata_len,
-                      0, padding);
-               scpdata_len += padding;
-       }
-       reipl_block_nvme->hdr.len = IPL_BP_FCP_LEN + scpdata_len;
-       reipl_block_nvme->nvme.len = IPL_BP0_FCP_LEN + scpdata_len;
-       reipl_block_nvme->nvme.scp_data_len = scpdata_len;
-       return count;
- }
- static struct bin_attribute sys_reipl_nvme_scp_data_attr =
-       __BIN_ATTR(scp_data, 0644, reipl_nvme_scpdata_read,
-                  reipl_nvme_scpdata_write, DIAG308_SCPDATA_SIZE);
+ DEFINE_IPL_ATTR_SCP_DATA_RW(reipl_nvme, reipl_block_nvme->hdr,
+                           reipl_block_nvme->nvme,
+                           IPL_BP_NVME_LEN, IPL_BP0_NVME_LEN,
+                           DIAG308_SCPDATA_SIZE);
  
  static struct bin_attribute *reipl_nvme_bin_attrs[] = {
        &sys_reipl_nvme_scp_data_attr,
@@@ -1068,44 -1025,10 +1026,10 @@@ static struct attribute_group reipl_ccw
  
  /* ECKD reipl device attributes */
  
- static ssize_t reipl_eckd_scpdata_read(struct file *filp, struct kobject *kobj,
-                                      struct bin_attribute *attr,
-                                      char *buf, loff_t off, size_t count)
- {
-       size_t size = reipl_block_eckd->eckd.scp_data_len;
-       void *scp_data = reipl_block_eckd->eckd.scp_data;
-       return memory_read_from_buffer(buf, count, &off, scp_data, size);
- }
- static ssize_t reipl_eckd_scpdata_write(struct file *filp, struct kobject *kobj,
-                                       struct bin_attribute *attr,
-                                       char *buf, loff_t off, size_t count)
- {
-       size_t scpdata_len = count;
-       size_t padding;
-       if (off)
-               return -EINVAL;
-       memcpy(reipl_block_eckd->eckd.scp_data, buf, count);
-       if (scpdata_len % 8) {
-               padding = 8 - (scpdata_len % 8);
-               memset(reipl_block_eckd->eckd.scp_data + scpdata_len,
-                      0, padding);
-               scpdata_len += padding;
-       }
-       reipl_block_eckd->hdr.len = IPL_BP_ECKD_LEN + scpdata_len;
-       reipl_block_eckd->eckd.len = IPL_BP0_ECKD_LEN + scpdata_len;
-       reipl_block_eckd->eckd.scp_data_len = scpdata_len;
-       return count;
- }
- static struct bin_attribute sys_reipl_eckd_scp_data_attr =
-       __BIN_ATTR(scp_data, 0644, reipl_eckd_scpdata_read,
-                  reipl_eckd_scpdata_write, DIAG308_SCPDATA_SIZE);
+ DEFINE_IPL_ATTR_SCP_DATA_RW(reipl_eckd, reipl_block_eckd->hdr,
+                           reipl_block_eckd->eckd,
+                           IPL_BP_ECKD_LEN, IPL_BP0_ECKD_LEN,
+                           DIAG308_SCPDATA_SIZE);
  
  static struct bin_attribute *reipl_eckd_bin_attrs[] = {
        &sys_reipl_eckd_scp_data_attr,
@@@ -1649,6 -1572,11 +1573,11 @@@ DEFINE_IPL_ATTR_RW(dump_fcp, br_lba, "%
  DEFINE_IPL_ATTR_RW(dump_fcp, device, "0.0.%04llx\n", "0.0.%llx\n",
                   dump_block_fcp->fcp.devno);
  
+ DEFINE_IPL_ATTR_SCP_DATA_RW(dump_fcp, dump_block_fcp->hdr,
+                           dump_block_fcp->fcp,
+                           IPL_BP_FCP_LEN, IPL_BP0_FCP_LEN,
+                           DIAG308_SCPDATA_SIZE);
  static struct attribute *dump_fcp_attrs[] = {
        &sys_dump_fcp_device_attr.attr,
        &sys_dump_fcp_wwpn_attr.attr,
        NULL,
  };
  
+ static struct bin_attribute *dump_fcp_bin_attrs[] = {
+       &sys_dump_fcp_scp_data_attr,
+       NULL,
+ };
  static struct attribute_group dump_fcp_attr_group = {
        .name  = IPL_FCP_STR,
        .attrs = dump_fcp_attrs,
+       .bin_attrs = dump_fcp_bin_attrs,
  };
  
  /* NVME dump device attributes */
@@@ -1673,6 -1607,11 +1608,11 @@@ DEFINE_IPL_ATTR_RW(dump_nvme, bootprog
  DEFINE_IPL_ATTR_RW(dump_nvme, br_lba, "%lld\n", "%llx\n",
                   dump_block_nvme->nvme.br_lba);
  
+ DEFINE_IPL_ATTR_SCP_DATA_RW(dump_nvme, dump_block_nvme->hdr,
+                           dump_block_nvme->nvme,
+                           IPL_BP_NVME_LEN, IPL_BP0_NVME_LEN,
+                           DIAG308_SCPDATA_SIZE);
  static struct attribute *dump_nvme_attrs[] = {
        &sys_dump_nvme_fid_attr.attr,
        &sys_dump_nvme_nsid_attr.attr,
        NULL,
  };
  
+ static struct bin_attribute *dump_nvme_bin_attrs[] = {
+       &sys_dump_nvme_scp_data_attr,
+       NULL,
+ };
  static struct attribute_group dump_nvme_attr_group = {
        .name  = IPL_NVME_STR,
        .attrs = dump_nvme_attrs,
+       .bin_attrs = dump_nvme_bin_attrs,
  };
  
  /* ECKD dump device attributes */
@@@ -1697,6 -1642,11 +1643,11 @@@ IPL_ATTR_BR_CHR_STORE_FN(dump, dump_blo
  static struct kobj_attribute sys_dump_eckd_br_chr_attr =
        __ATTR(br_chr, 0644, eckd_dump_br_chr_show, eckd_dump_br_chr_store);
  
+ DEFINE_IPL_ATTR_SCP_DATA_RW(dump_eckd, dump_block_eckd->hdr,
+                           dump_block_eckd->eckd,
+                           IPL_BP_ECKD_LEN, IPL_BP0_ECKD_LEN,
+                           DIAG308_SCPDATA_SIZE);
  static struct attribute *dump_eckd_attrs[] = {
        &sys_dump_eckd_device_attr.attr,
        &sys_dump_eckd_bootprog_attr.attr,
        NULL,
  };
  
+ static struct bin_attribute *dump_eckd_bin_attrs[] = {
+       &sys_dump_eckd_scp_data_attr,
+       NULL,
+ };
  static struct attribute_group dump_eckd_attr_group = {
        .name  = IPL_ECKD_STR,
        .attrs = dump_eckd_attrs,
+       .bin_attrs = dump_eckd_bin_attrs,
  };
  
  /* CCW dump device attributes */
@@@ -1859,9 -1815,9 +1816,9 @@@ static int __init dump_nvme_init(void
        }
        dump_block_nvme->hdr.len = IPL_BP_NVME_LEN;
        dump_block_nvme->hdr.version = IPL_PARM_BLOCK_VERSION;
-       dump_block_nvme->fcp.len = IPL_BP0_NVME_LEN;
-       dump_block_nvme->fcp.pbt = IPL_PBT_NVME;
-       dump_block_nvme->fcp.opt = IPL_PB0_NVME_OPT_DUMP;
+       dump_block_nvme->nvme.len = IPL_BP0_NVME_LEN;
+       dump_block_nvme->nvme.pbt = IPL_PBT_NVME;
+       dump_block_nvme->nvme.opt = IPL_PB0_NVME_OPT_DUMP;
        dump_capabilities |= DUMP_TYPE_NVME;
        return 0;
  }
@@@ -1959,11 -1915,13 +1916,13 @@@ static struct shutdown_action __refdat
   * vmcmd shutdown action: Trigger vm command on shutdown.
   */
  
- static char vmcmd_on_reboot[128];
- static char vmcmd_on_panic[128];
- static char vmcmd_on_halt[128];
- static char vmcmd_on_poff[128];
- static char vmcmd_on_restart[128];
+ #define VMCMD_MAX_SIZE        240
+ static char vmcmd_on_reboot[VMCMD_MAX_SIZE + 1];
+ static char vmcmd_on_panic[VMCMD_MAX_SIZE + 1];
+ static char vmcmd_on_halt[VMCMD_MAX_SIZE + 1];
+ static char vmcmd_on_poff[VMCMD_MAX_SIZE + 1];
+ static char vmcmd_on_restart[VMCMD_MAX_SIZE + 1];
  
  DEFINE_IPL_ATTR_STR_RW(vmcmd, on_reboot, "%s\n", "%s\n", vmcmd_on_reboot);
  DEFINE_IPL_ATTR_STR_RW(vmcmd, on_panic, "%s\n", "%s\n", vmcmd_on_panic);
@@@ -2289,8 -2247,8 +2248,8 @@@ static int __init vmcmd_on_reboot_setup
  {
        if (!MACHINE_IS_VM)
                return 1;
-       strncpy_skip_quote(vmcmd_on_reboot, str, 127);
-       vmcmd_on_reboot[127] = 0;
+       strncpy_skip_quote(vmcmd_on_reboot, str, VMCMD_MAX_SIZE);
+       vmcmd_on_reboot[VMCMD_MAX_SIZE] = 0;
        on_reboot_trigger.action = &vmcmd_action;
        return 1;
  }
@@@ -2300,8 -2258,8 +2259,8 @@@ static int __init vmcmd_on_panic_setup(
  {
        if (!MACHINE_IS_VM)
                return 1;
-       strncpy_skip_quote(vmcmd_on_panic, str, 127);
-       vmcmd_on_panic[127] = 0;
+       strncpy_skip_quote(vmcmd_on_panic, str, VMCMD_MAX_SIZE);
+       vmcmd_on_panic[VMCMD_MAX_SIZE] = 0;
        on_panic_trigger.action = &vmcmd_action;
        return 1;
  }
@@@ -2311,8 -2269,8 +2270,8 @@@ static int __init vmcmd_on_halt_setup(c
  {
        if (!MACHINE_IS_VM)
                return 1;
-       strncpy_skip_quote(vmcmd_on_halt, str, 127);
-       vmcmd_on_halt[127] = 0;
+       strncpy_skip_quote(vmcmd_on_halt, str, VMCMD_MAX_SIZE);
+       vmcmd_on_halt[VMCMD_MAX_SIZE] = 0;
        on_halt_trigger.action = &vmcmd_action;
        return 1;
  }
@@@ -2322,8 -2280,8 +2281,8 @@@ static int __init vmcmd_on_poff_setup(c
  {
        if (!MACHINE_IS_VM)
                return 1;
-       strncpy_skip_quote(vmcmd_on_poff, str, 127);
-       vmcmd_on_poff[127] = 0;
+       strncpy_skip_quote(vmcmd_on_poff, str, VMCMD_MAX_SIZE);
+       vmcmd_on_poff[VMCMD_MAX_SIZE] = 0;
        on_poff_trigger.action = &vmcmd_action;
        return 1;
  }
diff --combined arch/s390/kernel/irq.c
index 259496fe0ef9fd1d260720624b2b753d024397b1,89bcd4205e67ba985e0462d8465c0a380448172d..9acc6630abd318c3c6cd755a3f6ef0bbafdf803f
@@@ -29,7 -29,6 +29,7 @@@
  #include <asm/hw_irq.h>
  #include <asm/stacktrace.h>
  #include <asm/softirq_stack.h>
 +#include <asm/vtime.h>
  #include "entry.h"
  
  DEFINE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat);
@@@ -151,6 -150,7 +151,7 @@@ void noinstr do_io_irq(struct pt_regs *
        if (from_idle)
                account_idle_time_irq();
  
+       set_cpu_flag(CIF_NOHZ_DELAY);
        do {
                regs->tpi_info = S390_lowcore.tpi_info;
                if (S390_lowcore.tpi_info.adapter_IO)
index 3c1b1be744de32bf733bdd31867a2e71e4566cd2,d8b8e341cfc2de81051b754c51ed855393b09d27..05c83505e9799011364c3d157c7de9095f8ceb7d
@@@ -9,6 -9,7 +9,6 @@@
  
  #define pr_fmt(fmt) "kprobes: " fmt
  
 -#include <linux/moduleloader.h>
  #include <linux/kprobes.h>
  #include <linux/ptrace.h>
  #include <linux/preempt.h>
  #include <linux/slab.h>
  #include <linux/hardirq.h>
  #include <linux/ftrace.h>
 +#include <linux/execmem.h>
  #include <asm/set_memory.h>
  #include <asm/sections.h>
  #include <asm/dis.h>
- #include "kprobes.h"
  #include "entry.h"
  
  DEFINE_PER_CPU(struct kprobe *, current_kprobe);
@@@ -32,39 -31,17 +31,17 @@@ DEFINE_PER_CPU(struct kprobe_ctlblk, kp
  
  struct kretprobe_blackpoint kretprobe_blacklist[] = { };
  
- static int insn_page_in_use;
  void *alloc_insn_page(void)
  {
        void *page;
  
 -      page = module_alloc(PAGE_SIZE);
 +      page = execmem_alloc(EXECMEM_KPROBES, PAGE_SIZE);
        if (!page)
                return NULL;
        set_memory_rox((unsigned long)page, 1);
        return page;
  }
  
- static void *alloc_s390_insn_page(void)
- {
-       if (xchg(&insn_page_in_use, 1) == 1)
-               return NULL;
-       return &kprobes_insn_page;
- }
- static void free_s390_insn_page(void *page)
- {
-       xchg(&insn_page_in_use, 0);
- }
- struct kprobe_insn_cache kprobe_s390_insn_slots = {
-       .mutex = __MUTEX_INITIALIZER(kprobe_s390_insn_slots.mutex),
-       .alloc = alloc_s390_insn_page,
-       .free = free_s390_insn_page,
-       .pages = LIST_HEAD_INIT(kprobe_s390_insn_slots.pages),
-       .insn_size = MAX_INSN_SIZE,
- };
  static void copy_instruction(struct kprobe *p)
  {
        kprobe_opcode_t insn[MAX_INSN_SIZE];
        if (probe_is_insn_relative_long(&insn[0])) {
                /*
                 * For pc-relative instructions in RIL-b or RIL-c format patch
-                * the RI2 displacement field. We have already made sure that
-                * the insn slot for the patched instruction is within the same
-                * 2GB area as the original instruction (either kernel image or
-                * module area). Therefore the new displacement will always fit.
+                * the RI2 displacement field. The insn slot for the to be
+                * patched instruction is within the same 4GB area like the
+                * original instruction. Therefore the new displacement will
+                * always fit.
                 */
                disp = *(s32 *)&insn[1];
                addr = (u64)(unsigned long)p->addr;
  }
  NOKPROBE_SYMBOL(copy_instruction);
  
- static int s390_get_insn_slot(struct kprobe *p)
- {
-       /*
-        * Get an insn slot that is within the same 2GB area like the original
-        * instruction. That way instructions with a 32bit signed displacement
-        * field can be patched and executed within the insn slot.
-        */
-       p->ainsn.insn = NULL;
-       if (is_kernel((unsigned long)p->addr))
-               p->ainsn.insn = get_s390_insn_slot();
-       else if (is_module_addr(p->addr))
-               p->ainsn.insn = get_insn_slot();
-       return p->ainsn.insn ? 0 : -ENOMEM;
- }
- NOKPROBE_SYMBOL(s390_get_insn_slot);
- static void s390_free_insn_slot(struct kprobe *p)
- {
-       if (!p->ainsn.insn)
-               return;
-       if (is_kernel((unsigned long)p->addr))
-               free_s390_insn_slot(p->ainsn.insn, 0);
-       else
-               free_insn_slot(p->ainsn.insn, 0);
-       p->ainsn.insn = NULL;
- }
- NOKPROBE_SYMBOL(s390_free_insn_slot);
  /* Check if paddr is at an instruction boundary */
  static bool can_probe(unsigned long paddr)
  {
@@@ -174,7 -123,8 +123,8 @@@ int arch_prepare_kprobe(struct kprobe *
        /* Make sure the probe isn't going on a difficult instruction */
        if (probe_is_prohibited_opcode(p->addr))
                return -EINVAL;
-       if (s390_get_insn_slot(p))
+       p->ainsn.insn = get_insn_slot();
+       if (!p->ainsn.insn)
                return -ENOMEM;
        copy_instruction(p);
        return 0;
@@@ -216,7 -166,10 +166,10 @@@ NOKPROBE_SYMBOL(arch_disarm_kprobe)
  
  void arch_remove_kprobe(struct kprobe *p)
  {
-       s390_free_insn_slot(p);
+       if (!p->ainsn.insn)
+               return;
+       free_insn_slot(p->ainsn.insn, 0);
+       p->ainsn.insn = NULL;
  }
  NOKPROBE_SYMBOL(arch_remove_kprobe);
  
index df928fee26b51ed65d78596784bf5db0c6d3f754,4800d80decee695ace461625e888aaf3e7a73c55..2c5afb88d298263a70abbe1e4f903a95c0389225
@@@ -1,6 -1,8 +1,6 @@@
  # SPDX-License-Identifier: GPL-2.0
  # List of files in the vdso
  
 -KCOV_INSTRUMENT := n
 -
  # Include the generic Makefile to check the built vdso.
  include $(srctree)/lib/vdso/Makefile
  obj-vdso32 = vdso_user_wrapper-32.o note-32.o
@@@ -17,8 -19,10 +17,10 @@@ KBUILD_AFLAGS_32 := $(filter-out -m64,$
  KBUILD_AFLAGS_32 += -m31 -s
  
  KBUILD_CFLAGS_32 := $(filter-out -m64,$(KBUILD_CFLAGS))
+ KBUILD_CFLAGS_32 := $(filter-out -mpacked-stack,$(KBUILD_CFLAGS))
  KBUILD_CFLAGS_32 := $(filter-out -mno-pic-data-is-text-relative,$(KBUILD_CFLAGS_32))
- KBUILD_CFLAGS_32 += -m31 -fPIC -shared -fno-common -fno-builtin
+ KBUILD_CFLAGS_32 := $(filter-out -fno-asynchronous-unwind-tables,$(KBUILD_CFLAGS_32))
+ KBUILD_CFLAGS_32 += -m31 -fPIC -shared -fno-common -fno-builtin -fasynchronous-unwind-tables
  
  LDFLAGS_vdso32.so.dbg += -shared -soname=linux-vdso32.so.1 \
        --hash-style=both --build-id=sha1 -melf_s390 -T
@@@ -30,13 -34,19 +32,13 @@@ obj-y += vdso32_wrapper.
  targets += vdso32.lds
  CPPFLAGS_vdso32.lds += -P -C -U$(ARCH)
  
 -# Disable gcov profiling, ubsan and kasan for VDSO code
 -GCOV_PROFILE := n
 -UBSAN_SANITIZE := n
 -KASAN_SANITIZE := n
 -KCSAN_SANITIZE := n
 -
  # Force dependency (incbin is bad)
  $(obj)/vdso32_wrapper.o : $(obj)/vdso32.so
  
  quiet_cmd_vdso_and_check = VDSO    $@
        cmd_vdso_and_check = $(cmd_ld); $(cmd_vdso_check)
  
 -$(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32) FORCE
 +$(obj)/vdso32.so.dbg: $(obj)/vdso32.lds $(obj-vdso32) FORCE
        $(call if_changed,vdso_and_check)
  
  # strip rule for the .so file
@@@ -54,7 -64,7 +56,7 @@@ quiet_cmd_vdso32cc = VDSO32C $
        cmd_vdso32cc = $(CC) $(c_flags) -c -o $@ $<
  
  # Generate VDSO offsets using helper script
 -gen-vdsosym := $(srctree)/$(src)/gen_vdso_offsets.sh
 +gen-vdsosym := $(src)/gen_vdso_offsets.sh
  quiet_cmd_vdsosym = VDSOSYM $@
        cmd_vdsosym = $(NM) $< | $(gen-vdsosym) | LC_ALL=C sort > $@
  
index 6da1b9ad8ab0c7a43d676d50588001e09db2f3c9,2f2e4e997030c3fe91f12dbbbe6069db2bf895c8..ba19c0ca7c87af3b11ef301c78f3907b30d1f8c7
@@@ -1,6 -1,8 +1,6 @@@
  # SPDX-License-Identifier: GPL-2.0
  # List of files in the vdso
  
 -KCOV_INSTRUMENT := n
 -
  # Include the generic Makefile to check the built vdso.
  include $(srctree)/lib/vdso/Makefile
  obj-vdso64 = vdso_user_wrapper.o note.o
@@@ -22,9 -24,11 +22,11 @@@ KBUILD_AFLAGS_64 := $(filter-out -m64,$
  KBUILD_AFLAGS_64 += -m64
  
  KBUILD_CFLAGS_64 := $(filter-out -m64,$(KBUILD_CFLAGS))
+ KBUILD_CFLAGS_64 := $(filter-out -mpacked-stack,$(KBUILD_CFLAGS_64))
  KBUILD_CFLAGS_64 := $(filter-out -mno-pic-data-is-text-relative,$(KBUILD_CFLAGS_64))
  KBUILD_CFLAGS_64 := $(filter-out -munaligned-symbols,$(KBUILD_CFLAGS_64))
- KBUILD_CFLAGS_64 += -m64 -fPIC -fno-common -fno-builtin
+ KBUILD_CFLAGS_64 := $(filter-out -fno-asynchronous-unwind-tables,$(KBUILD_CFLAGS_64))
+ KBUILD_CFLAGS_64 += -m64 -fPIC -fno-common -fno-builtin -fasynchronous-unwind-tables
  ldflags-y := -shared -soname=linux-vdso64.so.1 \
             --hash-style=both --build-id=sha1 -T
  
@@@ -35,6 -39,12 +37,6 @@@ obj-y += vdso64_wrapper.
  targets += vdso64.lds
  CPPFLAGS_vdso64.lds += -P -C -U$(ARCH)
  
 -# Disable gcov profiling, ubsan and kasan for VDSO code
 -GCOV_PROFILE := n
 -UBSAN_SANITIZE := n
 -KASAN_SANITIZE := n
 -KCSAN_SANITIZE := n
 -
  # Force dependency (incbin is bad)
  $(obj)/vdso64_wrapper.o : $(obj)/vdso64.so
  
@@@ -42,7 -52,7 +44,7 @@@ quiet_cmd_vdso_and_check = VDSO    $
        cmd_vdso_and_check = $(cmd_ld); $(cmd_vdso_check)
  
  # link rule for the .so file, .lds has to be first
 -$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64) $(obj-cvdso64) FORCE
 +$(obj)/vdso64.so.dbg: $(obj)/vdso64.lds $(obj-vdso64) $(obj-cvdso64) FORCE
        $(call if_changed,vdso_and_check)
  
  # strip rule for the .so file
@@@ -64,7 -74,7 +66,7 @@@ quiet_cmd_vdso64cc = VDSO64C $
        cmd_vdso64cc = $(CC) $(c_flags) -c -o $@ $<
  
  # Generate VDSO offsets using helper script
 -gen-vdsosym := $(srctree)/$(src)/gen_vdso_offsets.sh
 +gen-vdsosym := $(src)/gen_vdso_offsets.sh
  quiet_cmd_vdsosym = VDSOSYM $@
        cmd_vdsosym = $(NM) $< | $(gen-vdsosym) | LC_ALL=C sort > $@
  
diff --combined net/iucv/iucv.c
index 5e37a8ceebcb88607c48ec548e53bd76633bec44,2e61f19621eec0de56edf19488044ea26776a022..b7bf34a5eb37ae56e776d63fc4f54f96ff173678
@@@ -73,8 -73,42 +73,42 @@@ const struct bus_type iucv_bus = 
  };
  EXPORT_SYMBOL(iucv_bus);
  
- struct device *iucv_root;
- EXPORT_SYMBOL(iucv_root);
+ static struct device *iucv_root;
+ static void iucv_release_device(struct device *device)
+ {
+       kfree(device);
+ }
+ struct device *iucv_alloc_device(const struct attribute_group **attrs,
+                                struct device_driver *driver,
+                                void *priv, const char *fmt, ...)
+ {
+       struct device *dev;
+       va_list vargs;
+       int rc;
+       dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+       if (!dev)
+               goto out_error;
+       va_start(vargs, fmt);
+       rc = dev_set_name(dev, fmt, vargs);
+       va_end(vargs);
+       if (rc)
+               goto out_error;
+       dev->bus = &iucv_bus;
+       dev->parent = iucv_root;
+       dev->driver = driver;
+       dev->groups = attrs;
+       dev->release = iucv_release_device;
+       dev_set_drvdata(dev, priv);
+       return dev;
+ out_error:
+       kfree(dev);
+       return NULL;
+ }
+ EXPORT_SYMBOL(iucv_alloc_device);
  
  static int iucv_available;
  
@@@ -520,7 -554,7 +554,7 @@@ static void iucv_setmask_mp(void
   */
  static void iucv_setmask_up(void)
  {
 -      cpumask_t cpumask;
 +      static cpumask_t cpumask;
        int cpu;
  
        /* Disable all cpu but the first in cpu_irq_cpumask. */
@@@ -628,33 -662,23 +662,33 @@@ static int iucv_cpu_online(unsigned in
  
  static int iucv_cpu_down_prep(unsigned int cpu)
  {
 -      cpumask_t cpumask;
 +      cpumask_var_t cpumask;
 +      int ret = 0;
  
        if (!iucv_path_table)
                return 0;
  
 -      cpumask_copy(&cpumask, &iucv_buffer_cpumask);
 -      cpumask_clear_cpu(cpu, &cpumask);
 -      if (cpumask_empty(&cpumask))
 +      if (!alloc_cpumask_var(&cpumask, GFP_KERNEL))
 +              return -ENOMEM;
 +
 +      cpumask_copy(cpumask, &iucv_buffer_cpumask);
 +      cpumask_clear_cpu(cpu, cpumask);
 +      if (cpumask_empty(cpumask)) {
                /* Can't offline last IUCV enabled cpu. */
 -              return -EINVAL;
 +              ret = -EINVAL;
 +              goto __free_cpumask;
 +      }
  
        iucv_retrieve_cpu(NULL);
        if (!cpumask_empty(&iucv_irq_cpumask))
 -              return 0;
 +              goto __free_cpumask;
 +
        smp_call_function_single(cpumask_first(&iucv_buffer_cpumask),
                                 iucv_allow_cpu, NULL, 1);
 -      return 0;
 +
 +__free_cpumask:
 +      free_cpumask_var(cpumask);
 +      return ret;
  }
  
  /**
index bf72880c50d00bad59dba62f356dee6d928a5d81,a81ca735003e4eeedc026cc9bd24c7d2dd364d01..ac85f9a4a56964d5ee2b45b8cf9f44a20c806141
@@@ -13,15 -13,16 +13,15 @@@ install-dir := $(MODLIB)/vds
  
  define gen_install_rules
  
 -src := $$(firstword $$(subst :,$(space),$(1)))
 -dest := $(install-dir)/$$(or $$(word 2,$$(subst :,$(space),$(1))),$$(patsubst %.dbg,%,$$(notdir $(1))))
 +dest := $(install-dir)/$$(patsubst %.dbg,%,$$(notdir $(1)))
  
  __default: $$(dest)
 -$$(dest): $$(src) FORCE
 +$$(dest): $(1) FORCE
        $$(call cmd,install)
  
  # Some architectures create .build-id symlinks
- ifneq ($(filter arm sparc x86, $(SRCARCH)),)
+ ifneq ($(filter arm s390 sparc x86, $(SRCARCH)),)
 -link := $(install-dir)/.build-id/$$(shell $(READELF) -n $$(src) | sed -n 's@^.*Build ID: \(..\)\(.*\)@\1/\2@p').debug
 +link := $(install-dir)/.build-id/$$(shell $(READELF) -n $(1) | sed -n 's@^.*Build ID: \(..\)\(.*\)@\1/\2@p').debug
  
  __default: $$(link)
  $$(link): $$(dest) FORCE
This page took 0.153609 seconds and 4 git commands to generate.