XIZI_AIoT: Add modifications for all SDK files. Add libmalloc interfaces(not functional)

This commit is contained in:
TXuian
2024-02-02 11:10:55 +08:00
parent c7529f1702
commit 6942ad6d1d
51 changed files with 2010 additions and 1665 deletions

View File

@@ -25,7 +25,7 @@
* @brief Format of an ELF executable file
* @version 3.0
* @author AIIT XUOS Lab
* @date 2024.11.23
* @date 2023.11.23
*/
/*************************************************
@@ -33,7 +33,7 @@ File name: execelf.h
Description: Format of an ELF executable file
Others:
History:
1. Date: 2024-11-23
1. Date: 2023-11-23
Author: AIIT XUOS Lab
Modification:
1. reserve only necessary elfhdr structs

View File

@@ -54,8 +54,9 @@ Modification:
typedef enum {
SYS_STATE_TEST = 0,
SYS_STATE_MEMBLOCK_INFO,
SYS_STATE_SET_TASK_PRIORITY,
SYS_STATE_GET_HEAP_BASE,
SYS_STATE_MEMBLOCK_INFO,
SYS_STATE_SHOW_TASKS,
SYS_STATE_SHOW_MEM_INFO,
SYS_STATE_SHOW_CPU_INFO,

View File

@@ -39,7 +39,7 @@ Modification:
#define TASK_CLOCK_TICK 50
#define TASK_MAX_PRIORITY 32
#define TASK_DEFAULT_PRIORITY 1
#define TASK_DEFAULT_PRIORITY 2
#define TASK_NAME_MAX_LEN 16
enum ProcState {

View File

@@ -33,8 +33,8 @@ Modification:
#include "actracer.h"
#include "buddy.h"
struct KBuddy user_phy_freemem_buddy;
struct KBuddy kern_virtmem_buddy;
struct KBuddy user_phy_freemem_buddy;
extern uint32_t kernel_data_end[];
bool module_phymem_init()

View File

@@ -143,6 +143,7 @@ static bool _map_user_pages(uintptr_t* pgdir, uintptr_t vaddr, uintptr_t paddr,
static void _free_user_pgdir(struct TopLevelPageDirectory* pgdir)
{
uintptr_t low_bound = kern_virtmem_buddy.mem_start, high_bound = kern_virtmem_buddy.mem_end;
uintptr_t user_low_bound = user_phy_freemem_buddy.mem_start, user_high_bound = user_phy_freemem_buddy.mem_end;
uintptr_t end_idx = USER_MEM_TOP >> LEVEL3_PDE_SHIFT;
for (uintptr_t i = 0; i < end_idx; i++) {
@@ -152,8 +153,12 @@ static void _free_user_pgdir(struct TopLevelPageDirectory* pgdir)
// free each page
for (uintptr_t j = 0; j < NUM_LEVEL4_PTE; j++) {
uintptr_t* page_paddr = (uintptr_t*)ALIGNDOWN(((uintptr_t*)P2V(pgtbl_paddr))[j], PAGE_SIZE);
if (page_paddr != NULL && (uintptr_t)page_paddr >= low_bound && (uintptr_t)page_paddr < high_bound) {
kfree(P2V(page_paddr));
if (page_paddr != NULL) {
if (LIKELY((uintptr_t)page_paddr >= low_bound && (uintptr_t)page_paddr < high_bound)) {
kfree(P2V(page_paddr));
} else if (LIKELY((uintptr_t)page_paddr >= user_low_bound && (uintptr_t)page_paddr < user_high_bound)) {
raw_free((char*)page_paddr);
}
}
}
kfree(P2V(pgtbl_paddr));

View File

@@ -180,7 +180,7 @@ int task_exec(struct TaskMicroDescriptor* task, struct Session* session, int fd,
task->pgdir = pgdir;
/// @todo record mem size used b task
task->mem_size = load_size;
task->mem_size = ALIGNUP(load_size, PAGE_SIZE);
xizi_pager.free_user_pgdir(&old_pgdir);
return 0;

View File

@@ -41,19 +41,27 @@ int sys_mmap(uintptr_t vaddr, uintptr_t paddr, int len, int is_dev)
struct TaskMicroDescriptor* cur_task = cur_cpu()->task;
assert(cur_task != NULL);
int true_len = ALIGNUP(len, PAGE_SIZE);
if (paddr != (uintptr_t)NULL) {
if (xizi_share_page_manager.task_map_pages(cur_task, vaddr, paddr, ALIGNUP(len, PAGE_SIZE) / PAGE_SIZE, is_dev) == (uintptr_t)NULL) {
if (xizi_share_page_manager.task_map_pages(cur_task, vaddr, paddr, true_len / PAGE_SIZE, is_dev) == (uintptr_t)NULL) {
return -1;
}
} else {
char* kern_vaddr = kalloc(len);
if (kern_vaddr == NULL) {
return -1;
}
if (xizi_share_page_manager.task_map_pages(cur_task, vaddr, V2P(kern_vaddr), ALIGNUP(len, PAGE_SIZE) / PAGE_SIZE, is_dev) == (uintptr_t)NULL) {
kfree(kern_vaddr);
return -1;
int load_len = 0;
uintptr_t load_vaddr = vaddr;
while (load_len < true_len) {
char* paddr = raw_alloc(PAGE_SIZE);
if (paddr == NULL) {
return -1;
}
if (xizi_share_page_manager.task_map_pages(cur_task, load_vaddr, (uintptr_t)paddr, 1, false) == (uintptr_t)NULL) {
raw_free(paddr);
return -1;
}
load_vaddr += PAGE_SIZE;
load_len += PAGE_SIZE;
}
}
return 0;
return vaddr + true_len;
}

View File

@@ -128,6 +128,8 @@ int sys_state(sys_state_option option, sys_state_info* info)
if (option == SYS_STATE_MEMBLOCK_INFO) {
info->memblock_info.memblock_start = (uintptr_t)V2P(_binary_fs_img_start);
info->memblock_info.memblock_end = (uintptr_t)V2P(_binary_fs_img_end);
} else if (option == SYS_STATE_GET_HEAP_BASE) {
return cur_cpu()->task->mem_size;
} else if (option == SYS_STATE_SET_TASK_PRIORITY) {
xizi_task_manager.set_cur_task_priority(info->priority);
} else if (option == SYS_STATE_SHOW_TASKS) {

View File

@@ -136,6 +136,7 @@ int spawn_embedded_task(char* img_start, char* name, char** argv)
new_task_cb->pgdir = pgdir;
/// @todo record mem size used b task
new_task_cb->mem_size = ALIGNUP(load_size, PAGE_SIZE);
xizi_pager.free_user_pgdir(&old_pgdir);