Skip to content

Commit

Permalink
First draft implementation of tables mapping
Browse files Browse the repository at this point in the history
  • Loading branch information
phaubertin committed Jan 15, 2025
1 parent 213849b commit 299aac2
Show file tree
Hide file tree
Showing 14 changed files with 343 additions and 28 deletions.
2 changes: 2 additions & 0 deletions include/kernel/domain/services/mman.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@

void *map_in_kernel(kern_paddr_t paddr, size_t size, int prot);

void expand_map_in_kernel(const void *addr, size_t size, int prot);

void undo_map_in_kernel(void *addr);

#endif
32 changes: 32 additions & 0 deletions include/kernel/infrastructure/acpi/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,36 @@ typedef struct {
uint8_t reserved[3];
} acpi_rsdp_t;

typedef struct {
char signature[4];
uint32_t length;
uint8_t revision;
uint8_t checksum;
char oemid[6];
char oem_table_id[8];
uint32_t oem_revision;
uint32_t creator_id;
uint32_t creator_revision;
} acpi_table_header_t;

typedef struct {
acpi_table_header_t header;
uint32_t entries[];
} acpi_rsdt_t;

typedef struct {
acpi_table_header_t header;
/* TODO */
} acpi_fadt_t;

typedef struct {
acpi_table_header_t header;
/* TODO */
} acpi_madt_t;

typedef struct {
acpi_table_header_t header;
/* TODO */
} acpi_hpet_t;

#endif
16 changes: 14 additions & 2 deletions include/kernel/infrastructure/i686/drivers/acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,23 @@
#ifndef JINUE_KERNEL_INFRASTRUCTURE_I686_DRIVERS_ACPI_H
#define JINUE_KERNEL_INFRASTRUCTURE_I686_DRIVERS_ACPI_H

#include <kernel/infrastructure/acpi/types.h>
#include <kernel/infrastructure/i686/drivers/asm/acpi.h>
#include <kernel/infrastructure/i686/types.h>
#include <stdint.h>

void acpi_init(void);
typedef struct {
const acpi_rsdp_t *rsdp;
const acpi_rsdt_t *rsdt;
const acpi_fadt_t *fadt;
const acpi_madt_t *madt;
const acpi_hpet_t *hpet;
} acpi_tables_t;

uint32_t acpi_get_rsdp_paddr(void);
void find_acpi_rsdp(void);

void init_acpi(void);

kern_paddr_t acpi_get_rsdp_paddr(void);

#endif
5 changes: 5 additions & 0 deletions include/kernel/infrastructure/i686/drivers/asm/acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,9 @@

#define ACPI_V1_RSDP_SIZE 20

/* Arbitrary value expected to be large enough to accomodate any real table
* while ensuring we don't create arbitrary large mappings because of garbage
* data in length members. */
#define ACPI_TABLE_MAX_SIZE (128 * 1024)

#endif
4 changes: 2 additions & 2 deletions include/kernel/infrastructure/i686/pmap/nopae.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@ void nopae_create_addr_space(addr_space_t *addr_space, pte_t *page_directory);

void nopae_destroy_addr_space(addr_space_t *addr_space);

unsigned int nopae_page_table_offset_of(void *addr);
unsigned int nopae_page_table_offset_of(const void *addr);

unsigned int nopae_page_directory_offset_of(void *addr);
unsigned int nopae_page_directory_offset_of(const void *addr);

pte_t *nopae_lookup_page_directory(addr_space_t *addr_space);

Expand Down
6 changes: 3 additions & 3 deletions include/kernel/infrastructure/i686/pmap/pae.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ void pae_destroy_addr_space(addr_space_t *addr_space);

pte_t *pae_lookup_page_directory(
addr_space_t *addr_space,
void *addr,
const void *addr,
bool create_as_needed,
bool *reload_cr3);

unsigned int pae_page_table_offset_of(void *addr);
unsigned int pae_page_table_offset_of(const void *addr);

unsigned int pae_page_directory_offset_of(void *addr);
unsigned int pae_page_directory_offset_of(const void *addr);

pte_t *pae_get_pte_with_offset(pte_t *pte, unsigned int offset);

Expand Down
2 changes: 1 addition & 1 deletion include/kernel/machine/pmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,6 @@ bool machine_clone_userspace_mapping(
size_t length,
int prot) ;

kern_paddr_t machine_lookup_kernel_paddr(void *addr);
kern_paddr_t machine_lookup_kernel_paddr(const void *addr);

#endif
30 changes: 29 additions & 1 deletion kernel/domain/services/mman.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,34 @@ void *map_in_kernel(kern_paddr_t paddr, size_t size, int prot) {
return start + offset;
}

/**
* Expand a mapping established by map_in_kernel()
*
* This function is intended for use during boot and has the following caveats:
* - It assumes the mapping being expanded is the last mapping performed.
* - This function does not perform locking. It is intended for use by the
* first running CPU only during boot.
*
* @param addr address returned by map_in_kernel() for the mapping being expanded
* @param size size of memory to map
* @param prot mapping protection flags
*
*/
void expand_map_in_kernel(const void *addr, size_t size, int prot) {
void *start = ALIGN_START_PTR(addr, PAGE_SIZE);
addr_t old_end = alloc_state.addr;
addr_t new_end = ALIGN_END_PTR((addr_t)addr + size, PAGE_SIZE);

kern_paddr_t paddr = machine_lookup_kernel_paddr(start) + (new_end - old_end);

for(addr_t page_addr = old_end; page_addr < (addr_t)new_end; page_addr += PAGE_SIZE) {
machine_map_kernel_page(page_addr, paddr, prot);
++paddr;
}

alloc_state.addr = new_end;
}

/**
* Undo a mapping established by map_in_kernel()
*
Expand All @@ -109,7 +137,7 @@ void undo_map_in_kernel(void *addr) {
void *start = ALIGN_START_PTR(addr, PAGE_SIZE);
void *end = alloc_state.addr;

for(addr_t page_addr = start; page_addr < (addr_t)end; ++page_addr) {
for(addr_t page_addr = start; page_addr < (addr_t)end; page_addr += PAGE_SIZE) {
machine_unmap_kernel_page(page_addr);
}

Expand Down
Loading

0 comments on commit 299aac2

Please sign in to comment.