Utilize pmap.h names for constants and types used to construct EFI
trampoline page table. Also do some style cleanup. Reviewed by: imp Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D7934
This commit is contained in:
parent
90ee5f51f2
commit
563391230c
@ -35,6 +35,8 @@ __FBSDID("$FreeBSD$");
|
||||
#include <string.h>
|
||||
#include <machine/elf.h>
|
||||
#include <stand.h>
|
||||
#include <vm/vm.h>
|
||||
#include <vm/pmap.h>
|
||||
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
@ -57,8 +59,14 @@ extern int bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp);
|
||||
static int elf64_exec(struct preloaded_file *amp);
|
||||
static int elf64_obj_exec(struct preloaded_file *amp);
|
||||
|
||||
static struct file_format amd64_elf = { elf64_loadfile, elf64_exec };
|
||||
static struct file_format amd64_elf_obj = { elf64_obj_loadfile, elf64_obj_exec };
|
||||
static struct file_format amd64_elf = {
|
||||
.l_load = elf64_loadfile,
|
||||
.l_exec = elf64_exec,
|
||||
};
|
||||
static struct file_format amd64_elf_obj = {
|
||||
.l_load = elf64_obj_loadfile,
|
||||
.l_exec = elf64_obj_exec,
|
||||
};
|
||||
|
||||
struct file_format *file_formats[] = {
|
||||
&amd64_elf,
|
||||
@ -66,21 +74,12 @@ struct file_format *file_formats[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
#define PG_V 0x001
|
||||
#define PG_RW 0x002
|
||||
#define PG_U 0x004
|
||||
#define PG_PS 0x080
|
||||
|
||||
typedef u_int64_t p4_entry_t;
|
||||
typedef u_int64_t p3_entry_t;
|
||||
typedef u_int64_t p2_entry_t;
|
||||
static p4_entry_t *PT4;
|
||||
static p3_entry_t *PT3;
|
||||
static p2_entry_t *PT2;
|
||||
static pml4_entry_t *PT4;
|
||||
static pdp_entry_t *PT3;
|
||||
static pd_entry_t *PT2;
|
||||
|
||||
static void (*trampoline)(uint64_t stack, void *copy_finish, uint64_t kernend,
|
||||
uint64_t modulep, p4_entry_t *pagetable,
|
||||
uint64_t entry);
|
||||
uint64_t modulep, pml4_entry_t *pagetable, uint64_t entry);
|
||||
|
||||
extern uintptr_t amd64_tramp;
|
||||
extern uint32_t amd64_tramp_size;
|
||||
@ -157,7 +156,7 @@ elf64_exec(struct preloaded_file *fp)
|
||||
bcopy((void *)&amd64_tramp, (void *)trampcode, amd64_tramp_size);
|
||||
trampoline = (void *)trampcode;
|
||||
|
||||
PT4 = (p4_entry_t *)0x0000000040000000;
|
||||
PT4 = (pml4_entry_t *)0x0000000040000000;
|
||||
err = BS->AllocatePages(AllocateMaxAddress, EfiLoaderData, 3,
|
||||
(EFI_PHYSICAL_ADDRESS *)&PT4);
|
||||
bzero(PT4, 3 * EFI_PAGE_SIZE);
|
||||
@ -172,11 +171,11 @@ elf64_exec(struct preloaded_file *fp)
|
||||
*/
|
||||
for (i = 0; i < 512; i++) {
|
||||
/* Each slot of the L4 pages points to the same L3 page. */
|
||||
PT4[i] = (p4_entry_t)PT3;
|
||||
PT4[i] = (pml4_entry_t)PT3;
|
||||
PT4[i] |= PG_V | PG_RW | PG_U;
|
||||
|
||||
/* Each slot of the L3 pages points to the same L2 page. */
|
||||
PT3[i] = (p3_entry_t)PT2;
|
||||
PT3[i] = (pdp_entry_t)PT2;
|
||||
PT3[i] |= PG_V | PG_RW | PG_U;
|
||||
|
||||
/* The L2 page slots are mapped with 2MB pages for 1GB. */
|
||||
@ -204,5 +203,6 @@ elf64_exec(struct preloaded_file *fp)
|
||||
static int
|
||||
elf64_obj_exec(struct preloaded_file *fp)
|
||||
{
|
||||
|
||||
return (EFTYPE);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user