aarch64 support share_mem obj.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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__(""
|
||||
:
|
||||
|
||||
@@ -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,
|
||||
|
||||
57
mkrtos_user/server/init/src/test/share_mem_test.c
Normal file
57
mkrtos_user/server/init/src/test/share_mem_test.c
Normal 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;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user