Page MenuHomeFreeBSD

D45324.id139007.diff
No OneTemporary

D45324.id139007.diff

diff --git a/sys/riscv/include/machdep.h b/sys/riscv/include/machdep.h
--- a/sys/riscv/include/machdep.h
+++ b/sys/riscv/include/machdep.h
@@ -39,7 +39,6 @@
vm_offset_t kern_l1pt; /* Kernel L1 base */
vm_offset_t kern_phys; /* Kernel base (physical) addr */
vm_offset_t kern_stack;
- vm_offset_t dtbp_virt; /* Device tree blob virtual addr */
vm_offset_t dtbp_phys; /* Device tree blob physical addr */
vm_offset_t modulep; /* loader(8) metadata */
};
diff --git a/sys/riscv/include/vmparam.h b/sys/riscv/include/vmparam.h
--- a/sys/riscv/include/vmparam.h
+++ b/sys/riscv/include/vmparam.h
@@ -209,8 +209,6 @@
#define PS_STRINGS_SV39 (USRSTACK_SV39 - sizeof(struct ps_strings))
#define PS_STRINGS_SV48 (USRSTACK_SV48 - sizeof(struct ps_strings))
-#define VM_EARLY_DTB_ADDRESS (VM_MAX_KERNEL_ADDRESS - (2 * L2_SIZE))
-
/*
* How many physical pages per kmem arena virtual page.
*/
diff --git a/sys/riscv/riscv/genassym.c b/sys/riscv/riscv/genassym.c
--- a/sys/riscv/riscv/genassym.c
+++ b/sys/riscv/riscv/genassym.c
@@ -58,7 +58,6 @@
ASSYM(KERNBASE, KERNBASE);
ASSYM(VM_MAXUSER_ADDRESS, VM_MAXUSER_ADDRESS);
ASSYM(VM_MAX_KERNEL_ADDRESS, VM_MAX_KERNEL_ADDRESS);
-ASSYM(VM_EARLY_DTB_ADDRESS, VM_EARLY_DTB_ADDRESS);
ASSYM(PMAP_MAPDEV_EARLY_SIZE, PMAP_MAPDEV_EARLY_SIZE);
ASSYM(PCB_ONFAULT, offsetof(struct pcb, pcb_onfault));
@@ -102,6 +101,5 @@
ASSYM(RISCV_BOOTPARAMS_KERN_PHYS, offsetof(struct riscv_bootparams, kern_phys));
ASSYM(RISCV_BOOTPARAMS_KERN_STACK, offsetof(struct riscv_bootparams,
kern_stack));
-ASSYM(RISCV_BOOTPARAMS_DTBP_VIRT, offsetof(struct riscv_bootparams, dtbp_virt));
ASSYM(RISCV_BOOTPARAMS_DTBP_PHYS, offsetof(struct riscv_bootparams, dtbp_phys));
ASSYM(RISCV_BOOTPARAMS_MODULEP, offsetof(struct riscv_bootparams, modulep));
diff --git a/sys/riscv/riscv/locore.S b/sys/riscv/riscv/locore.S
--- a/sys/riscv/riscv/locore.S
+++ b/sys/riscv/riscv/locore.S
@@ -118,9 +118,27 @@
* a1 - zero or dtbp
*/
pagetables:
- /* Get the kernel's load address */
+ /* Get the kernel's load address (kernstart) in s9 */
jal get_physmem
+ /* Construct 1GB Identity Map (1:1 PA->VA) */
+ lla s1, pagetable_l1
+ srli s2, s9, L1_SHIFT
+
+ srli a5, s9, L1_SHIFT
+ andi a5, a5, Ln_ADDR_MASK
+ li t4, (PTE_KERN)
+ slli s2, s2, PTE_PPN2_S
+ or t6, t4, s2
+
+ /* Store L1 PTE entry to position */
+ li a6, PTE_SIZE
+ mulw a5, a5, a6
+ add t0, s1, a5
+ sd t6, (t0)
+
+ /* Construct the virtual address space */
+
/* Add L1 entry for kernel */
lla s1, pagetable_l1
lla s2, pagetable_l2 /* Link to next level PN */
@@ -172,33 +190,9 @@
add t0, s1, a5
sd t6, (t0)
- /* Check if we have a DTB that needs to be mapped */
- beqz a1, 2f
-
- /* Create an L2 mapping for the DTB */
- lla s1, pagetable_l2_devmap
- mv s2, a1
- srli s2, s2, PAGE_SHIFT
- /* Mask off any bits that aren't aligned */
- andi s2, s2, ~((1 << (PTE_PPN1_S - PTE_PPN0_S)) - 1)
-
- li t0, (PTE_KERN)
- slli t2, s2, PTE_PPN0_S /* << PTE_PPN0_S */
- or t0, t0, t2
-
- /* Store the L2 table entry for the DTB */
- li a6, PTE_SIZE
- li a5, VM_EARLY_DTB_ADDRESS
- srli a5, a5, L2_SHIFT /* >> L2_SHIFT */
- andi a5, a5, Ln_ADDR_MASK /* & Ln_ADDR_MASK */
- mulw a5, a5, a6
- add t1, s1, a5
- sd t0, (t1)
-
/* Page tables END */
/* Setup supervisor trap vector */
-2:
lla t0, va
sub t0, t0, s9
li t1, KERNBASE
@@ -253,15 +247,7 @@
la t0, initstack
sd t0, RISCV_BOOTPARAMS_KERN_STACK(sp)
-
- li t0, (VM_EARLY_DTB_ADDRESS)
- /* Add offset of DTB within superpage */
- li t1, (L2_OFFSET)
- and t1, a1, t1
- add t0, t0, t1
- sd t0, RISCV_BOOTPARAMS_DTBP_VIRT(sp)
sd a1, RISCV_BOOTPARAMS_DTBP_PHYS(sp)
-
sd a0, RISCV_BOOTPARAMS_MODULEP(sp)
mv a0, sp
diff --git a/sys/riscv/riscv/machdep.c b/sys/riscv/riscv/machdep.c
--- a/sys/riscv/riscv/machdep.c
+++ b/sys/riscv/riscv/machdep.c
@@ -380,13 +380,16 @@
PRELOAD_PUSH_VALUE(uint32_t, sizeof(size_t));
PRELOAD_PUSH_VALUE(uint64_t, (size_t)((vm_offset_t)&end - KERNBASE));
- /* Copy the DTB to KVA space. */
+ /*
+ * Copy the DTB to KVA space. We are able to dereference the physical
+ * address due to the identity map created in locore.
+ */
lastaddr = roundup(lastaddr, sizeof(int));
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_METADATA | MODINFOMD_DTBP);
PRELOAD_PUSH_VALUE(uint32_t, sizeof(vm_offset_t));
PRELOAD_PUSH_VALUE(vm_offset_t, lastaddr);
- dtb_size = fdt_totalsize(rvbp->dtbp_virt);
- memmove((void *)lastaddr, (const void *)rvbp->dtbp_virt, dtb_size);
+ dtb_size = fdt_totalsize(rvbp->dtbp_phys);
+ memmove((void *)lastaddr, (const void *)rvbp->dtbp_phys, dtb_size);
lastaddr = roundup(lastaddr + dtb_size, sizeof(int));
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_METADATA | MODINFOMD_KERNEND);
diff --git a/sys/riscv/riscv/pmap.c b/sys/riscv/riscv/pmap.c
--- a/sys/riscv/riscv/pmap.c
+++ b/sys/riscv/riscv/pmap.c
@@ -686,15 +686,6 @@
freemempos = pmap_bootstrap_l3(l1pt,
VM_MAX_KERNEL_ADDRESS - PMAP_MAPDEV_EARLY_SIZE, freemempos);
- /*
- * Invalidate the mapping we created for the DTB. At this point a copy
- * has been created, and we no longer need it. We want to avoid the
- * possibility of an aliased mapping in the future.
- */
- l2p = pmap_l2(kernel_pmap, VM_EARLY_DTB_ADDRESS);
- if ((pmap_load(l2p) & PTE_V) != 0)
- pmap_clear(l2p);
-
sfence_vma();
#define alloc_pages(var, np) \

File Metadata

Mime Type
text/plain
Expires
Sun, Feb 16, 2:49 PM (3 h, 50 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16675049
Default Alt Text
D45324.id139007.diff (5 KB)

Event Timeline