Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F167837442
D25201.id72879.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D25201.id72879.diff
View Options
Index: sys/arm64/arm64/pmap.c
===================================================================
--- sys/arm64/arm64/pmap.c
+++ sys/arm64/arm64/pmap.c
@@ -110,10 +110,12 @@
#include <sys/param.h>
#include <sys/bitstring.h>
#include <sys/bus.h>
+#include <sys/efi.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/ktr.h>
#include <sys/limits.h>
+#include <sys/linker.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mman.h>
@@ -145,6 +147,8 @@
#include <vm/vm_reserv.h>
#include <vm/uma.h>
+#include <machine/efi.h>
+#include <machine/metadata.h>
#include <machine/machdep.h>
#include <machine/md_var.h>
#include <machine/pcb.h>
@@ -5445,6 +5449,57 @@
return ((void *)(va + offset));
}
+void *pmap_mapacpi(vm_paddr_t pa, vm_size_t size); /* TODO: header */
+void *pmap_mapacpi(vm_paddr_t pa, vm_size_t size)
+{
+ vm_offset_t va, offset;
+ pd_entry_t *pde;
+ int i, lvl, ndesc, mode = VM_MEMATTR_DEVICE;
+ size_t efisz;
+ struct efi_map_header *efihdr;
+ struct efi_md *map, *p;
+ caddr_t kmdp;
+
+ /* Find mode using EFI (TODO: don't search preload etc. on every call) */
+ kmdp = preload_search_by_type("elf kernel");
+ efihdr = (struct efi_map_header *)preload_search_info(kmdp,
+ MODINFO_METADATA | MODINFOMD_EFI_MAP);
+ efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf;
+ map = (struct efi_md *)((uint8_t *)efihdr + efisz);
+ ndesc = efihdr->memory_size / efihdr->descriptor_size;
+ for (i = 0, p = map; i < ndesc; i++, p = efi_next_descriptor(p,
+ efihdr->descriptor_size)) {
+ if (pa < p->md_phys || pa >= p->md_phys + p->md_pages * EFI_PAGE_SIZE)
+ continue;
+ if (p->md_type == EFI_MD_TYPE_IOMEM || p->md_type == EFI_MD_TYPE_IOPORT)
+ mode = VM_MEMATTR_DEVICE;
+ else if ((p->md_attr & EFI_MD_ATTR_WB) != 0 || p->md_type == EFI_MD_TYPE_RECLAIM)
+ mode = VM_MEMATTR_WRITE_BACK;
+ else if ((p->md_attr & EFI_MD_ATTR_WT) != 0)
+ mode = VM_MEMATTR_WRITE_THROUGH;
+ else if ((p->md_attr & EFI_MD_ATTR_WC) != 0)
+ mode = VM_MEMATTR_WRITE_COMBINING;
+ break;
+ }
+
+ offset = pa & PAGE_MASK;
+ size = round_page(offset + size);
+
+ va = kva_alloc(size);
+ if (va == 0)
+ panic("%s: Couldn't allocate KVA", __func__);
+
+ pde = pmap_pde(kernel_pmap, va, &lvl);
+ KASSERT(lvl == 2, ("pmap_mapbios: Invalid level %d", lvl));
+
+ /* L3 table is linked */
+ va = trunc_page(va);
+ pa = trunc_page(pa);
+ pmap_kenter(va, size, pa, mode);
+
+ return ((void *)(va + offset));
+}
+
void
pmap_unmapbios(vm_offset_t va, vm_size_t size)
{
Index: sys/dev/acpica/Osd/OsdMemory.c
===================================================================
--- sys/dev/acpica/Osd/OsdMemory.c
+++ sys/dev/acpica/Osd/OsdMemory.c
@@ -57,7 +57,8 @@
void *
AcpiOsMapMemory(ACPI_PHYSICAL_ADDRESS PhysicalAddress, ACPI_SIZE Length)
{
- return (pmap_mapbios((vm_offset_t)PhysicalAddress, Length));
+ extern void *pmap_mapacpi(vm_paddr_t pa, vm_size_t size); /* TODO: header */
+ return (pmap_mapacpi((vm_offset_t)PhysicalAddress, Length));
}
void
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Aug 25, 9:49 PM (6 h, 34 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37252793
Default Alt Text
D25201.id72879.diff (2 KB)
Attached To
Mode
D25201: Use EFI memory map to determine attributes for AcpiOsMapMemory mappings on arm64
Attached
Detach File
Event Timeline
Log In to Comment