Fix softkernel uint32_t.

This commit is contained in:
TXuian 2024-05-10 15:40:36 +08:00
parent b6dd58c629
commit 79d741e015
9 changed files with 76 additions and 42 deletions

View File

@ -57,25 +57,25 @@ Modification:
struct KPage { struct KPage {
struct double_list_node node; struct double_list_node node;
union { union {
uint32_t order; uintptr_t order;
struct KPage* page_node; struct KPage* page_node;
}; };
uintptr_t mapped_addr; uintptr_t mapped_addr;
}; };
struct KFreeList { struct KFreeList {
uint32_t n_free_pages; uintptr_t n_free_pages;
struct double_list_node list_head; struct double_list_node list_head;
}; };
struct KBuddy { struct KBuddy {
uint32_t n_pages; uintptr_t n_pages;
uint32_t use_lock; uintptr_t use_lock;
struct spinlock lock; struct spinlock lock;
struct KFreeList free_list[MAX_BUDDY_ORDER]; struct KFreeList free_list[MAX_BUDDY_ORDER];
struct KPage* first_page; struct KPage* first_page;
uint32_t mem_start; uintptr_t mem_start;
uint32_t mem_end; uintptr_t mem_end;
struct KPage* pages; struct KPage* pages;
}; };
@ -88,15 +88,15 @@ struct KBuddy {
* @param mem_end free memory region end * @param mem_end free memory region end
* @return void * @return void
*/ */
bool KBuddyInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end); bool KBuddyInit(struct KBuddy* pbuddy, uintptr_t mem_start, uintptr_t mem_end);
void KBuddySysInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end); void KBuddySysInit(struct KBuddy* pbuddy, uintptr_t mem_start, uintptr_t mem_end);
/* /*
* Continuous pages alloc by size * Continuous pages alloc by size
* @param sizeuint32_t size of need alloc * @param sizeuintptr_t size of need alloc
* @return NULL or v_addr (char*) return NULL if alloc failed, or return virtual page's addr * @return NULL or v_addr (char*) return NULL if alloc failed, or return virtual page's addr
*/ */
char* KBuddyAlloc(struct KBuddy* pbuddy, uint32_t size); char* KBuddyAlloc(struct KBuddy* pbuddy, uintptr_t size);
/* /*
* Continuous pages free from vaddr * Continuous pages free from vaddr

View File

@ -42,8 +42,11 @@ Modification:
#include <stdint.h> #include <stdint.h>
#include "memlayout.h"
#define ELF_MAGIC 0x464C457FU // "\x7FELF" in little endian #define ELF_MAGIC 0x464C457FU // "\x7FELF" in little endian
#if (ARCH_BIT == 32)
// File header // File header
struct elfhdr { struct elfhdr {
uint32_t magic; // must equal ELF_MAGIC uint32_t magic; // must equal ELF_MAGIC
@ -51,9 +54,9 @@ struct elfhdr {
uint16_t type; uint16_t type;
uint16_t machine; uint16_t machine;
uint32_t version; uint32_t version;
uint32_t entry; uintptr_t entry;
uint32_t phoff; uintptr_t phoff;
uint32_t shoff; uintptr_t shoff;
uint32_t flags; uint32_t flags;
uint16_t ehsize; uint16_t ehsize;
uint16_t phentsize; uint16_t phentsize;
@ -74,6 +77,37 @@ struct proghdr {
uint32_t flags; uint32_t flags;
uint32_t align; uint32_t align;
}; };
#elif (ARCH_BIT == 64)
struct elfhdr {
uint magic; // must equal ELF_MAGIC
uchar elf[12];
ushort type;
ushort machine;
uint version;
uint64 entry;
uint64 phoff;
uint64 shoff;
uint flags;
ushort ehsize;
ushort phentsize;
ushort phnum;
ushort shentsize;
ushort shnum;
ushort shstrndx;
};
// Program section header
struct proghdr {
uint32 type;
uint32 flags;
uint64 off;
uint64 vaddr;
uint64 paddr;
uint64 filesz;
uint64 memsz;
uint64 align;
};
#endif
// Values for Proghdr type // Values for Proghdr type
#define ELF_PROG_LOAD 1 #define ELF_PROG_LOAD 1

View File

@ -32,10 +32,10 @@ Modification:
#include "pagetable.h" #include "pagetable.h"
bool module_phymem_init(); bool module_phymem_init();
char* kalloc(uint32_t size); char* kalloc(size_t size);
bool kfree(char* vaddr); bool kfree(char* vaddr);
char* raw_alloc(uint32_t size); char* raw_alloc(size_t size);
bool raw_free(char* paddr); bool raw_free(char* paddr);
void show_phymem_info(); void show_phymem_info();

View File

@ -39,8 +39,8 @@ Modification:
#include "mmu_common.h" #include "mmu_common.h"
// clang-format off // clang-format off
#define ALIGNUP(sz, al) (((uint32_t)(sz) + (uint32_t)(al) - 1) & ~((uint32_t)(al) - 1)) #define ALIGNUP(sz, al) (((uintptr_t)(sz) + (uintptr_t)(al) - 1) & ~((uintptr_t)(al) - 1))
#define ALIGNDOWN(sz, al) ((uint32_t)(sz) & ~((uint32_t)(al) - 1)) #define ALIGNDOWN(sz, al) ((uintptr_t)(sz) & ~((uintptr_t)(al) - 1))
#define LEVEL4_PTE_IDX(v) (((uintptr_t)(v) >> LEVEL4_PTE_SHIFT) & (NUM_LEVEL4_PTE - 1)) #define LEVEL4_PTE_IDX(v) (((uintptr_t)(v) >> LEVEL4_PTE_SHIFT) & (NUM_LEVEL4_PTE - 1))
#define LEVEL4_PTE_ADDR(v) ALIGNDOWN(v, LEVEL4_PTE_SIZE) #define LEVEL4_PTE_ADDR(v) ALIGNDOWN(v, LEVEL4_PTE_SIZE)

View File

@ -38,7 +38,7 @@ Modification:
struct spinlock whole_kernel_lock; struct spinlock whole_kernel_lock;
extern uint32_t _binary_init_start[], _binary_default_fs_start[]; extern uintptr_t _binary_init_start[], _binary_default_fs_start[];
extern int sys_spawn(char* img_start, char* name, char** argv); extern int sys_spawn(char* img_start, char* name, char** argv);
static struct TraceTag hardkernel_tag, softkernel_tag; static struct TraceTag hardkernel_tag, softkernel_tag;

View File

@ -32,9 +32,9 @@ Modification:
#include "kalloc.h" #include "kalloc.h"
#include "log.h" #include "log.h"
static void _buddy_split_page(struct KPage* page, uint32_t low_order, uint32_t high_order, struct KFreeList* list) static void _buddy_split_page(struct KPage* page, uintptr_t low_order, uintptr_t high_order, struct KFreeList* list)
{ {
uint32_t size = (1 << high_order); uintptr_t size = (1 << high_order);
while (high_order > low_order) { while (high_order > low_order) {
list--; list--;
size >>= 1; size >>= 1;
@ -57,14 +57,14 @@ __attribute__((always_inline)) static void inline _buddy_set_pages_order(struct
__attribute__((always_inline)) static void inline _buddy_page_to_vaddr(struct KBuddy* pbuddy, struct KPage* page, char** vaddr) __attribute__((always_inline)) static void inline _buddy_page_to_vaddr(struct KBuddy* pbuddy, struct KPage* page, char** vaddr)
{ {
uint32_t offset = page - pbuddy->pages; uintptr_t offset = page - pbuddy->pages;
*vaddr = (char*)(pbuddy->mem_start + (offset << LEVEL4_PTE_SHIFT)); *vaddr = (char*)(pbuddy->mem_start + (offset << LEVEL4_PTE_SHIFT));
return; return;
} }
__attribute__((always_inline)) static void inline _buddy_vaddr_to_page(struct KBuddy* pbuddy, struct KPage** page, char* vaddr) __attribute__((always_inline)) static void inline _buddy_vaddr_to_page(struct KBuddy* pbuddy, struct KPage** page, char* vaddr)
{ {
uint32_t offset = (uint32_t)vaddr - pbuddy->mem_start; uintptr_t offset = (uintptr_t)vaddr - pbuddy->mem_start;
*page = (struct KPage*)(pbuddy->pages + (offset >> LEVEL4_PTE_SHIFT)); *page = (struct KPage*)(pbuddy->pages + (offset >> LEVEL4_PTE_SHIFT));
return; return;
} }
@ -109,9 +109,9 @@ static struct KPage* KBuddyPagesAlloc(struct KBuddy* pbuddy, int nPages)
static void KBuddyPagesFree(struct KBuddy* pbuddy, struct KPage* page) static void KBuddyPagesFree(struct KBuddy* pbuddy, struct KPage* page)
{ {
struct KPage* buddy = NULL; struct KPage* buddy = NULL;
uint32_t order = (page->order >= MAX_BUDDY_ORDER) ? 0 : page->order; uintptr_t order = (page->order >= MAX_BUDDY_ORDER) ? 0 : page->order;
uint32_t buddy_idx = 0, new_buddy_idx = 0; uintptr_t buddy_idx = 0, new_buddy_idx = 0;
uint32_t page_idx = page - pbuddy->pages; uintptr_t page_idx = page - pbuddy->pages;
for (; order < MAX_BUDDY_ORDER - 1; order++) { for (; order < MAX_BUDDY_ORDER - 1; order++) {
// find and delete buddy to combine // find and delete buddy to combine
@ -139,7 +139,7 @@ static void KBuddyPagesFree(struct KBuddy* pbuddy, struct KPage* page)
return; return;
} }
bool KBuddyInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end) bool KBuddyInit(struct KBuddy* pbuddy, uintptr_t mem_start, uintptr_t mem_end)
{ {
if (pbuddy->pages == NULL) { if (pbuddy->pages == NULL) {
if ((pbuddy->pages = (struct KPage*)kalloc(((mem_end - mem_start) >> LEVEL4_PTE_SHIFT) * sizeof(struct KPage))) == NULL) { if ((pbuddy->pages = (struct KPage*)kalloc(((mem_end - mem_start) >> LEVEL4_PTE_SHIFT) * sizeof(struct KPage))) == NULL) {
@ -148,7 +148,7 @@ bool KBuddyInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end)
} }
} }
uint32_t i = 0; uintptr_t i = 0;
struct KPage* page = NULL; struct KPage* page = NULL;
struct KFreeList* free_list = NULL; struct KFreeList* free_list = NULL;
@ -160,7 +160,7 @@ bool KBuddyInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end)
pbuddy->mem_start = ALIGNUP(pbuddy->mem_start, 4 * PAGE_SIZE); pbuddy->mem_start = ALIGNUP(pbuddy->mem_start, 4 * PAGE_SIZE);
// total number of free pages // total number of free pages
pbuddy->n_pages = (pbuddy->mem_end - (uint32_t)pbuddy->mem_start) >> LEVEL4_PTE_SHIFT; pbuddy->n_pages = (pbuddy->mem_end - (uintptr_t)pbuddy->mem_start) >> LEVEL4_PTE_SHIFT;
memset(pbuddy->pages, 0, pbuddy->n_pages); memset(pbuddy->pages, 0, pbuddy->n_pages);
@ -185,7 +185,7 @@ bool KBuddyInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end)
return true; return true;
} }
void KBuddySysInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end) void KBuddySysInit(struct KBuddy* pbuddy, uintptr_t mem_start, uintptr_t mem_end)
{ {
#define MAX_NR_PAGES MAX_NR_FREE_PAGES #define MAX_NR_PAGES MAX_NR_FREE_PAGES
static struct KPage kern_free_pages[MAX_NR_PAGES]; static struct KPage kern_free_pages[MAX_NR_PAGES];
@ -193,7 +193,7 @@ void KBuddySysInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end)
KBuddyInit(pbuddy, mem_start, mem_end); KBuddyInit(pbuddy, mem_start, mem_end);
} }
char* KBuddyAlloc(struct KBuddy* pbuddy, uint32_t size) char* KBuddyAlloc(struct KBuddy* pbuddy, uintptr_t size)
{ {
int nPages = CALCULATE_NPAGES(size); int nPages = CALCULATE_NPAGES(size);
struct KPage* page = KBuddyPagesAlloc(pbuddy, nPages); struct KPage* page = KBuddyPagesAlloc(pbuddy, nPages);
@ -210,15 +210,15 @@ bool KBuddyFree(struct KBuddy* pbuddy, char* vaddr)
{ {
struct KPage* page = NULL; struct KPage* page = NULL;
if ((uint32_t)vaddr % (PAGE_SIZE)) { if ((uintptr_t)vaddr % (PAGE_SIZE)) {
ERROR("kbuddyfree - unaligned: %x\n", vaddr); ERROR("kbuddyfree - unaligned: %x\n", vaddr);
return false; return false;
} }
if ((uint32_t)vaddr < pbuddy->mem_start) { if ((uintptr_t)vaddr < pbuddy->mem_start) {
ERROR("kbuddyfree - under buddy free page address: %x\n", vaddr); ERROR("kbuddyfree - under buddy free page address: %x\n", vaddr);
return false; return false;
} }
if ((uint32_t)vaddr >= pbuddy->mem_end) { if ((uintptr_t)vaddr >= pbuddy->mem_end) {
ERROR("kbuddyfree - over buddy free page address: %x\n", vaddr); ERROR("kbuddyfree - over buddy free page address: %x\n", vaddr);
return false; return false;
} }

View File

@ -36,19 +36,19 @@ Modification:
struct KBuddy kern_virtmem_buddy; struct KBuddy kern_virtmem_buddy;
struct KBuddy user_phy_freemem_buddy; struct KBuddy user_phy_freemem_buddy;
extern uint32_t kernel_data_end[]; extern uintptr_t kernel_data_end[];
bool module_phymem_init() bool module_phymem_init()
{ {
uint32_t kern_freemem_start = V2P(&kernel_data_end); uintptr_t kern_freemem_start = V2P(&kernel_data_end);
uint32_t kern_freemem_end = PHY_USER_FREEMEM_BASE; uintptr_t kern_freemem_end = PHY_USER_FREEMEM_BASE;
uint32_t user_freemem_start = PHY_USER_FREEMEM_BASE; uintptr_t user_freemem_start = PHY_USER_FREEMEM_BASE;
uint32_t user_freemem_end = PHY_MEM_STOP; uintptr_t user_freemem_end = PHY_MEM_STOP;
KBuddySysInit(&kern_virtmem_buddy, kern_freemem_start, kern_freemem_end); KBuddySysInit(&kern_virtmem_buddy, kern_freemem_start, kern_freemem_end);
KBuddyInit(&user_phy_freemem_buddy, user_freemem_start, user_freemem_end); KBuddyInit(&user_phy_freemem_buddy, user_freemem_start, user_freemem_end);
return true; return true;
} }
char* kalloc(uint32_t size) char* kalloc(size_t size)
{ {
char* mem_alloc = KBuddyAlloc(&kern_virtmem_buddy, size); char* mem_alloc = KBuddyAlloc(&kern_virtmem_buddy, size);
if (mem_alloc == NULL) { if (mem_alloc == NULL) {
@ -67,7 +67,7 @@ bool kfree(char* vaddr)
return KBuddyFree(&kern_virtmem_buddy, V2P_WO(vaddr)); return KBuddyFree(&kern_virtmem_buddy, V2P_WO(vaddr));
} }
char* raw_alloc(uint32_t size) char* raw_alloc(size_t size)
{ {
char* mem_alloc = KBuddyAlloc(&user_phy_freemem_buddy, size); char* mem_alloc = KBuddyAlloc(&user_phy_freemem_buddy, size);
if (mem_alloc == NULL) { if (mem_alloc == NULL) {

View File

@ -57,7 +57,7 @@ static struct slab_allocator* SessionAllocator()
static inline bool check_pages_unmapped(struct TaskMicroDescriptor* task, uintptr_t vaddr, int nr_pages) static inline bool check_pages_unmapped(struct TaskMicroDescriptor* task, uintptr_t vaddr, int nr_pages)
{ {
static uintptr_t paddr = UINT32_MAX; static uintptr_t paddr = UINT32_MAX;
for (uint32_t i = 0; i < nr_pages; i++) { for (uintptr_t i = 0; i < nr_pages; i++) {
if ((paddr = xizi_pager.address_translate(&task->pgdir, vaddr)) != 0) { if ((paddr = xizi_pager.address_translate(&task->pgdir, vaddr)) != 0) {
return false; return false;
} }

View File

@ -97,7 +97,7 @@ void show_tasks(void)
extern struct KBuddy user_phy_freemem_buddy; extern struct KBuddy user_phy_freemem_buddy;
extern struct KBuddy kern_virtmem_buddy; extern struct KBuddy kern_virtmem_buddy;
extern uint32_t kernel_data_end[]; extern uintptr_t kernel_data_end[];
void show_mem(void) void show_mem(void)
{ {
SHOWINFO_BORDER_LINE(); SHOWINFO_BORDER_LINE();