]>
cvs.zerfleddert.de Git - ms2-kexec/blob - idmap.c
1 #include <linux/kernel.h>
3 #include <asm/cputype.h>
4 #include <asm/pgalloc.h>
5 #include <asm/pgtable.h>
7 static void idmap_add_pmd(pud_t
*pud
, unsigned long addr
, unsigned long end
,
10 pmd_t
*pmd
= pmd_offset(pud
, addr
);
12 addr
= (addr
& PMD_MASK
) | prot
;
19 static void idmap_add_pud(pgd_t
*pgd
, unsigned long addr
, unsigned long end
,
22 pud_t
*pud
= pud_offset(pgd
, addr
);
26 next
= pud_addr_end(addr
, end
);
27 idmap_add_pmd(pud
, addr
, next
, prot
);
28 } while (pud
++, addr
= next
, addr
!= end
);
31 void identity_mapping_add(pgd_t
*pgd
, unsigned long addr
, unsigned long end
)
33 unsigned long prot
, next
;
35 prot
= PMD_TYPE_SECT
| PMD_SECT_AP_WRITE
;
37 if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ
&& !cpu_is_xscale())
41 pgd
+= pgd_index(addr
);
43 next
= pgd_addr_end(addr
, end
);
44 idmap_add_pud(pgd
, addr
, next
, prot
);
45 } while (pgd
++, addr
= next
, addr
!= end
);
49 static void idmap_del_pmd(pud_t
*pud
, unsigned long addr
, unsigned long end
)
51 pmd_t
*pmd
= pmd_offset(pud
, addr
);
55 static void idmap_del_pud(pgd_t
*pgd
, unsigned long addr
, unsigned long end
)
57 pud_t
*pud
= pud_offset(pgd
, addr
);
61 next
= pud_addr_end(addr
, end
);
62 idmap_del_pmd(pud
, addr
, next
);
63 } while (pud
++, addr
= next
, addr
!= end
);
66 void identity_mapping_del(pgd_t
*pgd
, unsigned long addr
, unsigned long end
)
70 pgd
+= pgd_index(addr
);
72 next
= pgd_addr_end(addr
, end
);
73 idmap_del_pud(pgd
, addr
, next
);
74 } while (pgd
++, addr
= next
, addr
!= end
);
79 * In order to soft-boot, we need to insert a 1:1 mapping in place of
80 * the user-mode pages. This will then ensure that we have predictable
81 * results when turning the mmu off
83 void setup_mm_for_reboot(char mode
)
86 * We need to access to user-mode page tables here. For kernel threads
87 * we don't have any user-mode mappings so we use the context that we
90 identity_mapping_add(current
->active_mm
->pgd
, 0, TASK_SIZE
);
91 local_flush_tlb_all();