Support mmap with customized attr.

This commit is contained in:
TXuian
2024-10-31 21:00:09 +08:00
parent 78cba2564e
commit ce727442de
10 changed files with 163 additions and 9 deletions
@@ -128,8 +128,12 @@ uintptr_t get_tick()
uintptr_t mmap(uintptr_t vaddr, uintptr_t paddr, int len, bool is_dev)
{
sys_mmap_info info = {
.type = SYS_MMAP_NORMAL,
.is_dev = is_dev,
};
uintptr_t vaddr_inner = vaddr, paddr_inner = paddr;
if (syscall(SYSCALL_MMAP, (intptr_t)&vaddr_inner, (intptr_t)&paddr_inner, (intptr_t)len, (intptr_t)is_dev) < 0) {
if (syscall(SYSCALL_MMAP, (intptr_t)&vaddr_inner, (intptr_t)&paddr_inner, (intptr_t)len, (intptr_t)&info) < 0) {
return (uintptr_t)NULL;
}
return vaddr_inner;
@@ -137,7 +141,20 @@ uintptr_t mmap(uintptr_t vaddr, uintptr_t paddr, int len, bool is_dev)
int naive_mmap(uintptr_t* vaddr, uintptr_t* paddr, int len, bool is_dev)
{
return syscall(SYSCALL_MMAP, (uintptr_t)vaddr, (intptr_t)paddr, (intptr_t)len, (intptr_t)is_dev);
sys_mmap_info info = {
.type = SYS_MMAP_NORMAL,
.is_dev = is_dev,
};
return syscall(SYSCALL_MMAP, (uintptr_t)vaddr, (intptr_t)paddr, (intptr_t)len, (intptr_t)&info);
}
int mmap_with_attr(uintptr_t vaddr, uintptr_t paddr, int len, uintptr_t attr)
{
sys_mmap_info info = {
.type = SYS_MMAP_CUSTOMIZE,
.attr = attr,
};
return syscall(SYSCALL_MMAP, (intptr_t)vaddr, (intptr_t)paddr, (intptr_t)len, (intptr_t)&info);
}
int register_irq(int irq, int opcode)
@@ -58,6 +58,17 @@ typedef enum {
SYS_TASK_YIELD_BLOCK_IPC = 0x2,
} task_yield_reason;
typedef enum {
SYS_MMAP_NORMAL = 0x0,
SYS_MMAP_CUSTOMIZE,
} sys_mmap_type;
typedef struct sys_mmap_info {
sys_mmap_type type;
uintptr_t attr;
bool is_dev;
} sys_mmap_info;
typedef union {
struct {
uintptr_t memblock_start;
@@ -96,6 +107,7 @@ int register_irq(int irq, int opcode);
uintptr_t mmap(uintptr_t vaddr, uintptr_t paddr, int len, bool is_dev);
int naive_mmap(uintptr_t* vaddr, uintptr_t* paddr, int len, bool is_dev);
int customized_mmap(uintptr_t vaddr, uintptr_t paddr, int len, uintptr_t attr);
int task_heap_base();
int get_memblock_info(sys_state_info* info);