From 4c78eb4a9199631fe94845cb3fbd6376aae1251d Mon Sep 17 00:00:00 2001 From: Alexander Gordeev Date: Wed, 29 Nov 2023 13:47:35 +0100 Subject: [PATCH 08/14] s390x: fix virtual vs physical address confusion Physical and virtual addresses are the same on S390X. That led to missing to use PTOV and VTOP macros where they actually expected. Signed-off-by: Alexander Gordeev Signed-off-by: Lianbo Jiang --- s390x.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/s390x.c b/s390x.c index 096c072186f5..957b839a5fa9 100644 --- a/s390x.c +++ b/s390x.c @@ -311,7 +311,7 @@ static struct s390x_cpu *s390x_cpu_get(struct bt_info *bt) readmem(lowcore_ptr + cpu * sizeof(long), KVADDR, &prefix, sizeof(long), "lowcore_ptr", FAULT_ON_ERROR); for (i = 0; i < s390x_cpu_cnt; i++) { - if (s390x_cpu_vec[i].prefix == prefix) + if (s390x_cpu_vec[i].prefix == VTOP(prefix)) return &s390x_cpu_vec[i]; } error(FATAL, "cannot determine CPU for task: %lx\n", bt->task); @@ -985,12 +985,12 @@ int s390x_vtop(ulong table, ulong vaddr, physaddr_t *phys_addr, int verbose) verbose); if (!entry) return FALSE; - table = entry & ~0xfffULL; + table = PTOV(entry & ~0xfffULL); /* Check if this a 2GB page */ if ((entry & 0x400ULL) && (level == 1)) { /* Add the 2GB frame offset & return the final value. */ table &= ~0x7fffffffULL; - *phys_addr = table + (vaddr & 0x7fffffffULL); + *phys_addr = VTOP(table + (vaddr & 0x7fffffffULL)); return TRUE; } len = entry & 0x3ULL; @@ -1001,12 +1001,12 @@ int s390x_vtop(ulong table, ulong vaddr, physaddr_t *phys_addr, int verbose) if (entry & 0x400ULL) { /* Add the 1MB page offset and return the final value. */ table &= ~0xfffffULL; - *phys_addr = table + (vaddr & 0xfffffULL); + *phys_addr = VTOP(table + (vaddr & 0xfffffULL)); return TRUE; } /* Get the page table entry */ - entry = _kl_pg_table_deref_s390x(vaddr, entry & ~0x7ffULL, verbose); + entry = _kl_pg_table_deref_s390x(vaddr, PTOV(entry & ~0x7ffULL), verbose); if (!entry) return FALSE; @@ -1033,7 +1033,7 @@ s390x_vmalloc_start(void) { unsigned long highmem_addr,high_memory; highmem_addr=symbol_value("high_memory"); - readmem(highmem_addr, PHYSADDR, &high_memory,sizeof(long), + readmem(highmem_addr, KVADDR, &high_memory,sizeof(long), "highmem",FAULT_ON_ERROR); return high_memory; } -- 2.41.0