From 98164f0075092852f9df61f92f51a54c9cd59e8c Mon Sep 17 00:00:00 2001 From: Heiko Carstens Date: Sat, 27 Apr 2013 13:07:17 +0200 Subject: [PATCH] --- yaml --- r: 373273 b: refs/heads/master c: 0a694067111e8fcd3eda430f8fa2d0277edd231f h: refs/heads/master i: 373271: b8efd69c4fc50a747ee33e67b121618a7ac18382 v: v3 --- [refs] | 2 +- trunk/arch/s390/mm/mem_detect.c | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index d9074ebe2c57..70d59309e135 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d009f4d8860defaea65ea7573818b96f3c4b171e +refs/heads/master: 0a694067111e8fcd3eda430f8fa2d0277edd231f diff --git a/trunk/arch/s390/mm/mem_detect.c b/trunk/arch/s390/mm/mem_detect.c index fb216e11c25d..854c08448de1 100644 --- a/trunk/arch/s390/mm/mem_detect.c +++ b/trunk/arch/s390/mm/mem_detect.c @@ -50,16 +50,28 @@ void detect_memory_layout(struct mem_chunk chunk[]) unsigned long flags, flags_dat, cr0; memset(chunk, 0, MEMORY_CHUNKS * sizeof(struct mem_chunk)); - /* Disable IRQs, DAT and low address protection so tprot does the + /* + * Disable IRQs, DAT and low address protection so tprot does the * right thing and we don't get scheduled away with low address * protection disabled. */ local_irq_save(flags); flags_dat = __arch_local_irq_stnsm(0xfb); + /* + * In case DAT was enabled, make sure chunk doesn't reside in vmalloc + * space. We have disabled DAT and any access to vmalloc area will + * cause an exception. + * If DAT was disabled we are called from early ipl code. + */ + if (test_bit(5, &flags_dat)) { + if (WARN_ON_ONCE(is_vmalloc_or_module_addr(chunk))) + goto out; + } __ctl_store(cr0, 0, 0); __ctl_clear_bit(0, 28); find_memory_chunks(chunk); __ctl_load(cr0, 0, 0); +out: __arch_local_irq_ssm(flags_dat); local_irq_restore(flags); }