]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
s390/appldata: pass parameter list pointer to appldata_asm
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 6 Sep 2018 08:43:27 +0000 (10:43 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 9 Oct 2018 09:20:50 +0000 (11:20 +0200)
In preparation for CONFIG_VMAP_STACK=y move the allocation of the
struct appldata_parameter_list to the caller of appldata_asm().

Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/appldata/appldata_base.c
arch/s390/include/asm/appldata.h
drivers/s390/char/monwriter.c

index 9bf8489df6e62d00c804189285f71269cb53a634..50dd7117cbc1bc57d8d8b5311667dd468662a723 100644 (file)
@@ -145,6 +145,7 @@ static void appldata_work_fn(struct work_struct *work)
 int appldata_diag(char record_nr, u16 function, unsigned long buffer,
                        u16 length, char *mod_lvl)
 {
+       struct appldata_parameter_list parm_list;
        struct appldata_product_id id = {
                .prod_nr    = {0xD3, 0xC9, 0xD5, 0xE4,
                               0xE7, 0xD2, 0xD9},       /* "LINUXKR" */
@@ -155,7 +156,8 @@ int appldata_diag(char record_nr, u16 function, unsigned long buffer,
 
        id.record_nr = record_nr;
        id.mod_lvl = (mod_lvl[0]) << 8 | mod_lvl[1];
-       return appldata_asm(&id, function, (void *) buffer, length);
+       return appldata_asm(&parm_list, &id, function,
+                           (void *) buffer, length);
 }
 /************************ timer, work, DIAG <END> ****************************/
 
index 4afbb5938726e568e3c23a88dd2bcaeaa0fe2c68..c5bd9f4437e59d0754cbc72a6784a693312df6cf 100644 (file)
@@ -40,26 +40,27 @@ struct appldata_product_id {
        u16  mod_lvl;           /* modification level */
 } __attribute__ ((packed));
 
-static inline int appldata_asm(struct appldata_product_id *id,
+
+static inline int appldata_asm(struct appldata_parameter_list *parm_list,
+                              struct appldata_product_id *id,
                               unsigned short fn, void *buffer,
                               unsigned short length)
 {
-       struct appldata_parameter_list parm_list;
        int ry;
 
        if (!MACHINE_IS_VM)
                return -EOPNOTSUPP;
-       parm_list.diag = 0xdc;
-       parm_list.function = fn;
-       parm_list.parlist_length = sizeof(parm_list);
-       parm_list.buffer_length = length;
-       parm_list.product_id_addr = (unsigned long) id;
-       parm_list.buffer_addr = virt_to_phys(buffer);
+       parm_list->diag = 0xdc;
+       parm_list->function = fn;
+       parm_list->parlist_length = sizeof(*parm_list);
+       parm_list->buffer_length = length;
+       parm_list->product_id_addr = (unsigned long) id;
+       parm_list->buffer_addr = virt_to_phys(buffer);
        diag_stat_inc(DIAG_STAT_X0DC);
        asm volatile(
                "       diag    %1,%0,0xdc"
                : "=d" (ry)
-               : "d" (&parm_list), "m" (parm_list), "m" (*id)
+               : "d" (parm_list), "m" (*parm_list), "m" (*id)
                : "cc");
        return ry;
 }
index 4f1a69c9d81d621e159ee8a103c4ded636d596cb..6388f614de4e580822ded85103655911f1df390b 100644 (file)
@@ -58,6 +58,7 @@ struct mon_private {
 
 static int monwrite_diag(struct monwrite_hdr *myhdr, char *buffer, int fcn)
 {
+       struct appldata_parameter_list parm_list;
        struct appldata_product_id id;
        int rc;
 
@@ -67,7 +68,8 @@ static int monwrite_diag(struct monwrite_hdr *myhdr, char *buffer, int fcn)
        id.version_nr = myhdr->version;
        id.release_nr = myhdr->release;
        id.mod_lvl = myhdr->mod_level;
-       rc = appldata_asm(&id, fcn, (void *) buffer, myhdr->datalen);
+       rc = appldata_asm(&parm_list, &id, fcn,
+                         (void *) buffer, myhdr->datalen);
        if (rc <= 0)
                return rc;
        pr_err("Writing monitor data failed with rc=%i\n", rc);