XIZI_AIoT: Add modifications for all SDK files. Add libmalloc interfaces(not functional)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user