Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[S390] cio: fix storage key handling

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>

authored by

Heiko Carstens and committed by
Martin Schwidefsky
d1bf8590 0d01bb89

+9 -12
-3
arch/s390/include/asm/page.h
··· 107 107 #define __pgd(x) ((pgd_t) { (x) } ) 108 108 #define __pgprot(x) ((pgprot_t) { (x) } ) 109 109 110 - /* default storage key used for all pages */ 111 - extern unsigned int default_storage_key; 112 - 113 110 static inline void 114 111 page_set_storage_key(unsigned long addr, unsigned int skey) 115 112 {
+1 -1
drivers/s390/cio/chsc.c
··· 574 574 secm_area->request.length = 0x0050; 575 575 secm_area->request.code = 0x0016; 576 576 577 - secm_area->key = PAGE_DEFAULT_KEY; 577 + secm_area->key = PAGE_DEFAULT_KEY >> 4; 578 578 secm_area->cub_addr1 = (u64)(unsigned long)css->cub_addr1; 579 579 secm_area->cub_addr2 = (u64)(unsigned long)css->cub_addr2; 580 580
+1 -1
drivers/s390/cio/chsc_sch.c
··· 237 237 int ret = -ENODEV; 238 238 char dbf[10]; 239 239 240 - chsc_area->header.key = PAGE_DEFAULT_KEY; 240 + chsc_area->header.key = PAGE_DEFAULT_KEY >> 4; 241 241 while ((sch = chsc_get_next_subchannel(sch))) { 242 242 spin_lock(sch->lock); 243 243 private = sch->private;
+5 -5
drivers/s390/cio/qdio_setup.c
··· 333 333 irq_ptr->qdr->qdf0[i + nr].slsba = 334 334 (unsigned long)&irq_ptr_qs[i]->slsb.val[0]; 335 335 336 - irq_ptr->qdr->qdf0[i + nr].akey = PAGE_DEFAULT_KEY; 337 - irq_ptr->qdr->qdf0[i + nr].bkey = PAGE_DEFAULT_KEY; 338 - irq_ptr->qdr->qdf0[i + nr].ckey = PAGE_DEFAULT_KEY; 339 - irq_ptr->qdr->qdf0[i + nr].dkey = PAGE_DEFAULT_KEY; 336 + irq_ptr->qdr->qdf0[i + nr].akey = PAGE_DEFAULT_KEY >> 4; 337 + irq_ptr->qdr->qdf0[i + nr].bkey = PAGE_DEFAULT_KEY >> 4; 338 + irq_ptr->qdr->qdf0[i + nr].ckey = PAGE_DEFAULT_KEY >> 4; 339 + irq_ptr->qdr->qdf0[i + nr].dkey = PAGE_DEFAULT_KEY >> 4; 340 340 } 341 341 342 342 static void setup_qdr(struct qdio_irq *irq_ptr, ··· 350 350 irq_ptr->qdr->iqdsz = sizeof(struct qdesfmt0) / 4; /* size in words */ 351 351 irq_ptr->qdr->oqdsz = sizeof(struct qdesfmt0) / 4; 352 352 irq_ptr->qdr->qiba = (unsigned long)&irq_ptr->qib; 353 - irq_ptr->qdr->qkey = PAGE_DEFAULT_KEY; 353 + irq_ptr->qdr->qkey = PAGE_DEFAULT_KEY >> 4; 354 354 355 355 for (i = 0; i < qdio_init->no_input_qs; i++) 356 356 __qdio_allocate_fill_qdr(irq_ptr, irq_ptr->input_qs, i, 0);
+2 -2
drivers/s390/cio/qdio_thinint.c
··· 198 198 .code = 0x0021, 199 199 }; 200 200 scssc_area->operation_code = 0; 201 - scssc_area->ks = PAGE_DEFAULT_KEY; 202 - scssc_area->kc = PAGE_DEFAULT_KEY; 201 + scssc_area->ks = PAGE_DEFAULT_KEY >> 4; 202 + scssc_area->kc = PAGE_DEFAULT_KEY >> 4; 203 203 scssc_area->isc = QDIO_AIRQ_ISC; 204 204 scssc_area->schid = irq_ptr->schid; 205 205