aarch64 support share_mem obj.

This commit is contained in:
zhangzheng
2024-08-29 23:35:25 +08:00
parent 0992ba2540
commit 0d65637d91
19 changed files with 493 additions and 156 deletions

View File

@@ -5,10 +5,17 @@
#define THREAD_CREATE_VM 0x1
typedef enum share_mem_type
{
SHARE_MEM_CNT_BUDDY_CNT, //!< buddy分配的连续内存最大4M默认的内存分配方式
SHARE_MEM_CNT_CMA_CNT, //!< cma分配的连续内存
SHARE_MEM_CNT_DPD, //!< 离散内存
} share_mem_type_t;
msg_tag_t factory_create_irq_sender(obj_handler_t obj, vpage_t vpage);
msg_tag_t factory_create_ipc(obj_handler_t obj, vpage_t vpage);
msg_tag_t factory_create_thread(obj_handler_t obj, vpage_t vpage);
msg_tag_t factory_create_thread_vcpu(obj_handler_t obj, vpage_t vpage);
msg_tag_t factory_create_task(obj_handler_t obj, vpage_t vpage);
msg_tag_t facotry_create_share_mem(obj_handler_t obj, vpage_t vpage, umword_t size);
msg_tag_t facotry_create_share_mem(obj_handler_t obj, vpage_t vpage, share_mem_type_t mem_type, umword_t size);
msg_tag_t facotry_create_sema(obj_handler_t obj, vpage_t vpage, int cnt, int max);

View File

@@ -1,5 +1,6 @@
#include "u_types.h"
#include "u_prot.h"
#include "u_vmam.h"
msg_tag_t share_mem_map(obj_handler_t obj, uint8_t attrs, umword_t *addr, umword_t *size);
msg_tag_t share_mem_map(obj_handler_t obj, vma_addr_t vaddr, umword_t *addr, umword_t *size);
msg_tag_t share_mem_unmap(obj_handler_t obj);

View File

@@ -30,7 +30,7 @@ typedef union vma_addr
};
} vma_addr_t;
static inline vma_addr_t vam_addr_create_raw(umword_t raw)
static inline vma_addr_t vma_addr_create_raw(umword_t raw)
{
return (vma_addr_t){
.raw = raw,

View File

@@ -86,7 +86,7 @@ msg_tag_t factory_create_ipc(obj_handler_t obj, vpage_t vpage)
return tag;
}
msg_tag_t facotry_create_share_mem(obj_handler_t obj, vpage_t vpage, umword_t size)
msg_tag_t facotry_create_share_mem(obj_handler_t obj, vpage_t vpage, share_mem_type_t mem_type, umword_t size)
{
register volatile umword_t r0 asm(ARCH_REG_0);
@@ -94,8 +94,8 @@ msg_tag_t facotry_create_share_mem(obj_handler_t obj, vpage_t vpage, umword_t si
0,
SHARE_MEM_PROT,
vpage.raw,
mem_type,
size,
0,
0);
asm __volatile__(""
:

View File

@@ -2,19 +2,20 @@
#include "u_prot.h"
#include "u_types.h"
#include "u_ipc.h"
#include "u_vmam.h"
enum share_mem_op
{
SHARE_MEM_MAP,
SHARE_MEM_UNMAP,
};
msg_tag_t share_mem_map(obj_handler_t obj, uint8_t attrs, umword_t *addr, umword_t *size)
msg_tag_t share_mem_map(obj_handler_t obj, vma_addr_t vaddr, umword_t *addr, umword_t *size)
{
register volatile umword_t r0 asm(ARCH_REG_0);
register volatile umword_t r1 asm(ARCH_REG_1);
register volatile umword_t r2 asm(ARCH_REG_2);
mk_syscall(syscall_prot_create4(SHARE_MEM_MAP, SHARE_MEM_PROT, obj, FALSE).raw,
attrs,
vaddr.raw,
0,
0,
0,

View File

@@ -0,0 +1,57 @@
#include "u_types.h"
#include "u_prot.h"
#include "u_factory.h"
#include "u_task.h"
#include "u_hd_man.h"
#include "u_share_mem.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <CuTest.h>
static void sharea_mem_test(CuTest *cu)
{
addr_t addr;
umword_t size;
obj_handler_t hd = handler_alloc();
assert(hd != HANDLER_INVALID);
msg_tag_t tag = facotry_create_share_mem(FACTORY_PROT,
vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd),
SHARE_MEM_CNT_BUDDY_CNT,
PAGE_SIZE * 100);
assert(msg_tag_get_prot(tag) >= 0);
tag = share_mem_map(hd, vma_addr_create(VPAGE_PROT_RW, VMA_ADDR_RESV, 0), &addr, &size);
assert(msg_tag_get_prot(tag) >= 0);
memset((void *)addr, 0, size);
share_mem_unmap(hd);
tag = share_mem_map(hd, vma_addr_create(VPAGE_PROT_RW, VMA_ADDR_RESV, 0), &addr, &size);
assert(msg_tag_get_prot(tag) >= 0);
memset((void *)addr, 0, size);
share_mem_unmap(hd);
handler_free_umap(hd);
hd = handler_alloc();
assert(hd != HANDLER_INVALID);
tag = facotry_create_share_mem(FACTORY_PROT,
vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd),
SHARE_MEM_CNT_DPD,
PAGE_SIZE * 100);
assert(msg_tag_get_prot(tag) >= 0);
tag = share_mem_map(hd, vma_addr_create(VPAGE_PROT_RW, VMA_ADDR_RESV, 0), &addr, &size);
assert(msg_tag_get_prot(tag) >= 0);
memset((void *)addr, 0, size);
share_mem_unmap(hd);
tag = share_mem_map(hd, vma_addr_create(VPAGE_PROT_RW, VMA_ADDR_RESV, 0), &addr, &size);
assert(msg_tag_get_prot(tag) >= 0);
memset((void *)addr, 0, size);
share_mem_unmap(hd);
handler_free_umap(hd);
}
CuSuite *sharem_mem_test_suite(void)
{
CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, sharea_mem_test);
return suite;
}

View File

@@ -14,6 +14,7 @@ CuSuite *map_test_suite(void);
CuSuite *pthread_base_test_suite(void);
CuSuite *thread_base_test_suite(void);
CuSuite *ipc_test_suite(void);
CuSuite *sharem_mem_test_suite(void);
void test_main(void);
void mm_test(void);

View File

@@ -11,11 +11,12 @@ static void RunAllTests(void)
CuSuiteAddSuite(suite, ulog_test_suite());
CuSuiteAddSuite(suite, printf_test_suite());
CuSuiteAddSuite(suite, vmm_test_suite());
CuSuiteAddSuite(suite, malloc_test_suite());
CuSuiteAddSuite(suite, sharem_mem_test_suite());
CuSuiteAddSuite(suite, map_test_suite());
CuSuiteAddSuite(suite, thread_base_test_suite());
CuSuiteAddSuite(suite, sema_test_suite());
CuSuiteAddSuite(suite, malloc_test_suite());
CuSuiteAddSuite(suite, pthread_base_test_suite());
CuSuiteAddSuite(suite, pthread_press_test_suite());
CuSuiteAddSuite(suite, pthread_lock_test_suite());

View File

@@ -44,9 +44,12 @@ static err_t low_level_init(struct netif *netif)
msg_tag_t tag;
send_shm_hd = handler_alloc();
assert(send_shm_hd != HANDLER_INVALID);
tag = facotry_create_share_mem(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, send_shm_hd), 2048);
tag = facotry_create_share_mem(FACTORY_PROT,
vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, send_shm_hd), SHARE_MEM_CNT_BUDDY_CNT,
2048);
assert(msg_tag_get_prot(tag) >= 0);
tag = share_mem_map(send_shm_hd, 3, &send_shm_addr, &send_shm_size);
tag = share_mem_map(send_shm_hd, vma_addr_create(VPAGE_PROT_RW, VMA_ADDR_RESV, 0),
&send_shm_addr, &send_shm_size);
assert(msg_tag_get_prot(tag) >= 0);
return ERR_OK;

View File

@@ -38,9 +38,10 @@ int main(int args, char *argv[])
obj_handler_t shm_hd = handler_alloc();
assert(shm_hd != HANDLER_INVALID);
tag = facotry_create_share_mem(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, shm_hd), 2048);
tag = facotry_create_share_mem(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, shm_hd),
SHARE_MEM_CNT_BUDDY_CNT, 2048);
assert(msg_tag_get_prot(tag) >= 0);
tag = share_mem_map(shm_hd, 3, &addr, &size);
tag = share_mem_map(shm_hd, vma_addr_create(VPAGE_PROT_RW, VMA_ADDR_RESV, 0), &addr, &size);
assert(msg_tag_get_prot(tag) >= 0);
while (1)

View File

@@ -1,24 +0,0 @@
#include "u_types.h"
#include "u_prot.h"
#include "u_factory.h"
#include "u_task.h"
#include "u_hd_man.h"
#include "u_share_mem.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
AUTO_CALL(102)
void sharea_mem_test(void)
{
addr_t addr;
umword_t size;
obj_handler_t hd = handler_alloc();
assert(hd != HANDLER_INVALID);
msg_tag_t tag = facotry_create_share_mem(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd), 1024);
assert(msg_tag_get_prot(tag) >= 0);
tag = share_mem_map(hd, 3, &addr, &size);
assert(msg_tag_get_prot(tag) >= 0);
memset((void *)addr, 0, size);
// share_mem_unmap(hd);
handler_free_umap(hd);
}