mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 16:54:20 +08:00
[ARM] Fix SMP booting with non-zero PHYS_OFFSET
The existing code tries to get the pmd for the temporary page table by doing: pgd = pgd_alloc(&init_mm); pmd = pmd_offset(pgd, PHYS_OFFSET); Since we have a two level page table, pmd_offset() is a no-op, so this just has a casting effect from a pgd to a pmd - the address argument is unused. So this can't work. Normally, we'd do: pgd = pgd_offset(&init_mm, PHYS_OFFSET); ... pmd = pmd_offset(pgd, PHYS_OFFSET); to get the pmd you want. However, pgd_offset() takes the mm_struct, not the (unattached) pgd we just allocated. So, instead use: pgd = pgd_alloc(&init_mm); pmd = pmd_offset(pgd + pgd_index(PHYS_OFFSET), PHYS_OFFSET); Reported-by: Antti P Miettinen <ananaza@iki.fi> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
afd2fc02ab
commit
058ddee562
@ -100,7 +100,7 @@ int __cpuinit __cpu_up(unsigned int cpu)
|
||||
* a 1:1 mapping for the physical address of the kernel.
|
||||
*/
|
||||
pgd = pgd_alloc(&init_mm);
|
||||
pmd = pmd_offset(pgd, PHYS_OFFSET);
|
||||
pmd = pmd_offset(pgd + pgd_index(PHYS_OFFSET), PHYS_OFFSET);
|
||||
*pmd = __pmd((PHYS_OFFSET & PGDIR_MASK) |
|
||||
PMD_TYPE_SECT | PMD_SECT_AP_WRITE);
|
||||
|
||||
@ -139,7 +139,7 @@ int __cpuinit __cpu_up(unsigned int cpu)
|
||||
secondary_data.stack = NULL;
|
||||
secondary_data.pgdir = 0;
|
||||
|
||||
*pmd_offset(pgd, PHYS_OFFSET) = __pmd(0);
|
||||
*pmd = __pmd(0);
|
||||
pgd_free(&init_mm, pgd);
|
||||
|
||||
if (ret) {
|
||||
|
Loading…
Reference in New Issue
Block a user