[S390] cio: fix storage key handling
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Fri, 26 Feb 2010 21:37:30 +0000 (22:37 +0100)
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>
Fri, 26 Feb 2010 21:37:30 +0000 (22:37 +0100)
Some parts of cio do not shift PAGE_DEFAULT_KEY correctly and end up
with an incorrect key in their data structures.
Since the default key is zero this doesn't really matter. However if
somebody would use key-controlled protection for debugging purposes
it would be quite helpful if all of this would work as expected.

Also remove a stale declaration.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/page.h
drivers/s390/cio/chsc.c
drivers/s390/cio/chsc_sch.c
drivers/s390/cio/qdio_setup.c
drivers/s390/cio/qdio_thinint.c

index 5e9daf5..af650fb 100644 (file)
@@ -107,9 +107,6 @@ typedef pte_t *pgtable_t;
 #define __pgd(x)        ((pgd_t) { (x) } )
 #define __pgprot(x)     ((pgprot_t) { (x) } )
 
-/* default storage key used for all pages */
-extern unsigned int default_storage_key;
-
 static inline void
 page_set_storage_key(unsigned long addr, unsigned int skey)
 {
index 1ecd3e5..4038f5b 100644 (file)
@@ -574,7 +574,7 @@ int __chsc_do_secm(struct channel_subsystem *css, int enable, void *page)
        secm_area->request.length = 0x0050;
        secm_area->request.code = 0x0016;
 
-       secm_area->key = PAGE_DEFAULT_KEY;
+       secm_area->key = PAGE_DEFAULT_KEY >> 4;
        secm_area->cub_addr1 = (u64)(unsigned long)css->cub_addr1;
        secm_area->cub_addr2 = (u64)(unsigned long)css->cub_addr2;
 
index c84ac94..df7388e 100644 (file)
@@ -237,7 +237,7 @@ static int chsc_async(struct chsc_async_area *chsc_area,
        int ret = -ENODEV;
        char dbf[10];
 
-       chsc_area->header.key = PAGE_DEFAULT_KEY;
+       chsc_area->header.key = PAGE_DEFAULT_KEY >> 4;
        while ((sch = chsc_get_next_subchannel(sch))) {
                spin_lock(sch->lock);
                private = sch->private;
index 8c2dea5..4464907 100644 (file)
@@ -333,10 +333,10 @@ static void __qdio_allocate_fill_qdr(struct qdio_irq *irq_ptr,
        irq_ptr->qdr->qdf0[i + nr].slsba =
                (unsigned long)&irq_ptr_qs[i]->slsb.val[0];
 
-       irq_ptr->qdr->qdf0[i + nr].akey = PAGE_DEFAULT_KEY;
-       irq_ptr->qdr->qdf0[i + nr].bkey = PAGE_DEFAULT_KEY;
-       irq_ptr->qdr->qdf0[i + nr].ckey = PAGE_DEFAULT_KEY;
-       irq_ptr->qdr->qdf0[i + nr].dkey = PAGE_DEFAULT_KEY;
+       irq_ptr->qdr->qdf0[i + nr].akey = PAGE_DEFAULT_KEY >> 4;
+       irq_ptr->qdr->qdf0[i + nr].bkey = PAGE_DEFAULT_KEY >> 4;
+       irq_ptr->qdr->qdf0[i + nr].ckey = PAGE_DEFAULT_KEY >> 4;
+       irq_ptr->qdr->qdf0[i + nr].dkey = PAGE_DEFAULT_KEY >> 4;
 }
 
 static void setup_qdr(struct qdio_irq *irq_ptr,
@@ -350,7 +350,7 @@ static void setup_qdr(struct qdio_irq *irq_ptr,
        irq_ptr->qdr->iqdsz = sizeof(struct qdesfmt0) / 4; /* size in words */
        irq_ptr->qdr->oqdsz = sizeof(struct qdesfmt0) / 4;
        irq_ptr->qdr->qiba = (unsigned long)&irq_ptr->qib;
-       irq_ptr->qdr->qkey = PAGE_DEFAULT_KEY;
+       irq_ptr->qdr->qkey = PAGE_DEFAULT_KEY >> 4;
 
        for (i = 0; i < qdio_init->no_input_qs; i++)
                __qdio_allocate_fill_qdr(irq_ptr, irq_ptr->input_qs, i, 0);
index 091d904..9942c10 100644 (file)
@@ -198,8 +198,8 @@ static int set_subchannel_ind(struct qdio_irq *irq_ptr, int reset)
                .code   = 0x0021,
        };
        scssc_area->operation_code = 0;
-       scssc_area->ks = PAGE_DEFAULT_KEY;
-       scssc_area->kc = PAGE_DEFAULT_KEY;
+       scssc_area->ks = PAGE_DEFAULT_KEY >> 4;
+       scssc_area->kc = PAGE_DEFAULT_KEY >> 4;
        scssc_area->isc = QDIO_AIRQ_ISC;
        scssc_area->schid = irq_ptr->schid;