diff --git a/Ubiquitous/XiZi_AIoT/softkernel/include/buddy.h b/Ubiquitous/XiZi_AIoT/softkernel/include/buddy.h index d8a0354ca..3a657aec1 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/include/buddy.h +++ b/Ubiquitous/XiZi_AIoT/softkernel/include/buddy.h @@ -57,25 +57,25 @@ Modification: struct KPage { struct double_list_node node; union { - uint32_t order; + uintptr_t order; struct KPage* page_node; }; uintptr_t mapped_addr; }; struct KFreeList { - uint32_t n_free_pages; + uintptr_t n_free_pages; struct double_list_node list_head; }; struct KBuddy { - uint32_t n_pages; - uint32_t use_lock; + uintptr_t n_pages; + uintptr_t use_lock; struct spinlock lock; struct KFreeList free_list[MAX_BUDDY_ORDER]; struct KPage* first_page; - uint32_t mem_start; - uint32_t mem_end; + uintptr_t mem_start; + uintptr_t mem_end; struct KPage* pages; }; @@ -88,15 +88,15 @@ struct KBuddy { * @param mem_end free memory region end * @return void */ -bool KBuddyInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end); -void KBuddySysInit(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, uintptr_t mem_start, uintptr_t mem_end); /* * Continuous pages alloc by size - * @param size(uint32_t) size of need alloc + * @param size(uintptr_t) size of need alloc * @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 diff --git a/Ubiquitous/XiZi_AIoT/softkernel/include/execelf.h b/Ubiquitous/XiZi_AIoT/softkernel/include/execelf.h index 0161d81b5..4e14f976a 100755 --- a/Ubiquitous/XiZi_AIoT/softkernel/include/execelf.h +++ b/Ubiquitous/XiZi_AIoT/softkernel/include/execelf.h @@ -42,8 +42,11 @@ Modification: #include +#include "memlayout.h" + #define ELF_MAGIC 0x464C457FU // "\x7FELF" in little endian +#if (ARCH_BIT == 32) // File header struct elfhdr { uint32_t magic; // must equal ELF_MAGIC @@ -51,9 +54,9 @@ struct elfhdr { uint16_t type; uint16_t machine; uint32_t version; - uint32_t entry; - uint32_t phoff; - uint32_t shoff; + uintptr_t entry; + uintptr_t phoff; + uintptr_t shoff; uint32_t flags; uint16_t ehsize; uint16_t phentsize; @@ -74,6 +77,37 @@ struct proghdr { uint32_t flags; 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 #define ELF_PROG_LOAD 1 diff --git a/Ubiquitous/XiZi_AIoT/softkernel/include/kalloc.h b/Ubiquitous/XiZi_AIoT/softkernel/include/kalloc.h index 75106cda6..98e55333e 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/include/kalloc.h +++ b/Ubiquitous/XiZi_AIoT/softkernel/include/kalloc.h @@ -32,10 +32,10 @@ Modification: #include "pagetable.h" bool module_phymem_init(); -char* kalloc(uint32_t size); +char* kalloc(size_t size); bool kfree(char* vaddr); -char* raw_alloc(uint32_t size); +char* raw_alloc(size_t size); bool raw_free(char* paddr); void show_phymem_info(); diff --git a/Ubiquitous/XiZi_AIoT/softkernel/include/pagetable.h b/Ubiquitous/XiZi_AIoT/softkernel/include/pagetable.h index 0668ad5ae..27a796bee 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/include/pagetable.h +++ b/Ubiquitous/XiZi_AIoT/softkernel/include/pagetable.h @@ -39,8 +39,8 @@ Modification: #include "mmu_common.h" // clang-format off -#define ALIGNUP(sz, al) (((uint32_t)(sz) + (uint32_t)(al) - 1) & ~((uint32_t)(al) - 1)) -#define ALIGNDOWN(sz, al) ((uint32_t)(sz) & ~((uint32_t)(al) - 1)) +#define ALIGNUP(sz, al) (((uintptr_t)(sz) + (uintptr_t)(al) - 1) & ~((uintptr_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_ADDR(v) ALIGNDOWN(v, LEVEL4_PTE_SIZE) diff --git a/Ubiquitous/XiZi_AIoT/softkernel/main.c b/Ubiquitous/XiZi_AIoT/softkernel/main.c index 7ec2a73d7..dd61c4666 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/main.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/main.c @@ -38,7 +38,7 @@ Modification: 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); static struct TraceTag hardkernel_tag, softkernel_tag; diff --git a/Ubiquitous/XiZi_AIoT/softkernel/memory/buddy.c b/Ubiquitous/XiZi_AIoT/softkernel/memory/buddy.c index 702c0409e..4757838d0 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/memory/buddy.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/memory/buddy.c @@ -32,9 +32,9 @@ Modification: #include "kalloc.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) { list--; 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) { - uint32_t offset = page - pbuddy->pages; + uintptr_t offset = page - pbuddy->pages; *vaddr = (char*)(pbuddy->mem_start + (offset << LEVEL4_PTE_SHIFT)); return; } __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)); return; } @@ -109,9 +109,9 @@ static struct KPage* KBuddyPagesAlloc(struct KBuddy* pbuddy, int nPages) static void KBuddyPagesFree(struct KBuddy* pbuddy, struct KPage* page) { struct KPage* buddy = NULL; - uint32_t order = (page->order >= MAX_BUDDY_ORDER) ? 0 : page->order; - uint32_t buddy_idx = 0, new_buddy_idx = 0; - uint32_t page_idx = page - pbuddy->pages; + uintptr_t order = (page->order >= MAX_BUDDY_ORDER) ? 0 : page->order; + uintptr_t buddy_idx = 0, new_buddy_idx = 0; + uintptr_t page_idx = page - pbuddy->pages; for (; order < MAX_BUDDY_ORDER - 1; order++) { // find and delete buddy to combine @@ -139,7 +139,7 @@ static void KBuddyPagesFree(struct KBuddy* pbuddy, struct KPage* page) 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 = (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 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); // 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); @@ -185,7 +185,7 @@ bool KBuddyInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end) 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 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); } -char* KBuddyAlloc(struct KBuddy* pbuddy, uint32_t size) +char* KBuddyAlloc(struct KBuddy* pbuddy, uintptr_t size) { int nPages = CALCULATE_NPAGES(size); struct KPage* page = KBuddyPagesAlloc(pbuddy, nPages); @@ -210,15 +210,15 @@ bool KBuddyFree(struct KBuddy* pbuddy, char* vaddr) { struct KPage* page = NULL; - if ((uint32_t)vaddr % (PAGE_SIZE)) { + if ((uintptr_t)vaddr % (PAGE_SIZE)) { ERROR("kbuddyfree - unaligned: %x\n", vaddr); 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); 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); return false; } diff --git a/Ubiquitous/XiZi_AIoT/softkernel/memory/kalloc.c b/Ubiquitous/XiZi_AIoT/softkernel/memory/kalloc.c index 196a7b224..cdfc5f4d6 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/memory/kalloc.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/memory/kalloc.c @@ -36,19 +36,19 @@ Modification: struct KBuddy kern_virtmem_buddy; struct KBuddy user_phy_freemem_buddy; -extern uint32_t kernel_data_end[]; +extern uintptr_t kernel_data_end[]; bool module_phymem_init() { - uint32_t kern_freemem_start = V2P(&kernel_data_end); - uint32_t kern_freemem_end = PHY_USER_FREEMEM_BASE; - uint32_t user_freemem_start = PHY_USER_FREEMEM_BASE; - uint32_t user_freemem_end = PHY_MEM_STOP; + uintptr_t kern_freemem_start = V2P(&kernel_data_end); + uintptr_t kern_freemem_end = PHY_USER_FREEMEM_BASE; + uintptr_t user_freemem_start = PHY_USER_FREEMEM_BASE; + uintptr_t user_freemem_end = PHY_MEM_STOP; KBuddySysInit(&kern_virtmem_buddy, kern_freemem_start, kern_freemem_end); KBuddyInit(&user_phy_freemem_buddy, user_freemem_start, user_freemem_end); return true; } -char* kalloc(uint32_t size) +char* kalloc(size_t size) { char* mem_alloc = KBuddyAlloc(&kern_virtmem_buddy, size); if (mem_alloc == NULL) { @@ -67,7 +67,7 @@ bool kfree(char* 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); if (mem_alloc == NULL) { diff --git a/Ubiquitous/XiZi_AIoT/softkernel/memory/share_page.c b/Ubiquitous/XiZi_AIoT/softkernel/memory/share_page.c index ba57b8d3c..501bee02a 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/memory/share_page.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/memory/share_page.c @@ -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 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) { return false; } diff --git a/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_state.c b/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_state.c index 827799515..62ea696d5 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_state.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_state.c @@ -97,7 +97,7 @@ void show_tasks(void) extern struct KBuddy user_phy_freemem_buddy; extern struct KBuddy kern_virtmem_buddy; -extern uint32_t kernel_data_end[]; +extern uintptr_t kernel_data_end[]; void show_mem(void) { SHOWINFO_BORDER_LINE();