summaryrefslogtreecommitdiff
path: root/loader/loader_efi.h
blob: 4ce3098cf8b01e13a975d07e928a475bdf877e04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#pragma once

#include <kernel/memory/range.h>
#include <kernel/memory/paging.h>

#include <elf/elf64.h>

#include <efi.h>
#include <efilib.h>

#include <stdbool.h>
#include <stddef.h>
#include <stdnoreturn.h>

enum page_type
{
    INVALID_PAGE_TYPE = 0x0,
    CODE_PAGE_TYPE = PAGE_PR,
    RODATA_PAGE_TYPE = PAGE_PR|PAGE_NX,
    DATA_PAGE_TYPE = PAGE_PR|PAGE_WR|PAGE_NX
};

struct system_image
{
    struct memory_range buffer;
    EFI_FILE_PROTOCOL *file;
    Elf64_Ehdr ehdr;
    Elf64_Phdr *phdrs;
};

extern EFI_SYSTEM_TABLE *e_st;
extern EFI_BOOT_SERVICES *e_bs;
extern EFI_RUNTIME_SERVICES *e_rt;

extern EFI_HANDLE e_image_handle;
extern EFI_LOADED_IMAGE_PROTOCOL *e_loaded_image;
extern EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *e_system_partition;
extern EFI_GRAPHICS_OUTPUT_PROTOCOL *e_graphics_output;
extern EFI_STATUS e_last_error;

noreturn void efi_exit(EFI_STATUS status);

struct memory_range system_allocate(size_t size);

void *efi_allocate(size_t size);
void efi_free(void *buffer);

void paging_init(void);
void paging_enter(void);
void *paging_map_page(void *vaddr, phys_addr_t paddr, enum page_type type);
void *paging_map_pages(void *vaddr,
                       phys_addr_t paddr,
                       enum page_type type,
                       size_t size);
void *paging_map_range(void *vaddr,
                       struct memory_range *range,
                       enum page_type type);

struct system_image *system_image_open(CHAR16 *path);
bool system_image_load(struct system_image *image);
void system_image_map(struct system_image *image);

void loader_main(void);