From fedad91b0d0f4d308f45182e103c7d11032fdbd4 Mon Sep 17 00:00:00 2001 From: ligd Date: Wed, 21 Dec 2022 18:41:52 +0800 Subject: [PATCH] sim/mem: don't let siwtch out when operated the host mem Signed-off-by: ligd --- arch/sim/src/sim/posix/sim_hostmemory.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/arch/sim/src/sim/posix/sim_hostmemory.c b/arch/sim/src/sim/posix/sim_hostmemory.c index 97d08d1522a..b7f2a226ac6 100644 --- a/arch/sim/src/sim/posix/sim_hostmemory.c +++ b/arch/sim/src/sim/posix/sim_hostmemory.c @@ -51,6 +51,9 @@ static atomic_int g_uordblks; * Public Functions ****************************************************************************/ +extern uint64_t up_irq_save(void); +extern void up_irq_restore(uint64_t flags); + /**************************************************************************** * Name: host_allocheap * @@ -61,6 +64,7 @@ static atomic_int g_uordblks; void *host_allocheap(size_t sz) { + uint64_t flags = up_irq_save(); void *p; #if defined(CONFIG_HOST_MACOS) && defined(CONFIG_HOST_ARM64) @@ -73,6 +77,8 @@ void *host_allocheap(size_t sz) MAP_ANON | MAP_PRIVATE, -1, 0); #endif + up_irq_restore(flags); + if (p == MAP_FAILED) { return NULL; @@ -83,6 +89,7 @@ void *host_allocheap(size_t sz) void *host_allocshmem(const char *name, size_t size, int master) { + uint64_t flags = up_irq_save(); void *mem; int oflag; int ret; @@ -97,6 +104,7 @@ void *host_allocshmem(const char *name, size_t size, int master) fd = shm_open(name, oflag, S_IRUSR | S_IWUSR); if (fd < 0) { + up_irq_restore(flags); return NULL; } @@ -110,12 +118,14 @@ void *host_allocshmem(const char *name, size_t size, int master) ret = ftruncate(fd, size); if (ret < 0) { + up_irq_restore(flags); close(fd); return NULL; } mem = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); close(fd); /* Don't need keep fd any more once the memory get mapped */ + up_irq_restore(flags); if (mem == MAP_FAILED) { return NULL; @@ -126,7 +136,9 @@ void *host_allocshmem(const char *name, size_t size, int master) void host_freeshmem(void *mem) { + uint64_t flags = up_irq_save(); munmap(mem, 0); + up_irq_restore(flags); } size_t host_mallocsize(void *mem) @@ -140,12 +152,14 @@ size_t host_mallocsize(void *mem) void *host_memalign(size_t alignment, size_t size) { + uint64_t flags = up_irq_save(); void *p; int error; error = posix_memalign(&p, alignment, size); if (error != 0) { + up_irq_restore(flags); return NULL; } @@ -153,26 +167,32 @@ void *host_memalign(size_t alignment, size_t size) g_aordblks += 1; g_uordblks += size; + up_irq_restore(flags); + return p; } void host_free(void *mem) { size_t size; + uint64_t flags; if (mem == NULL) { return; } + flags = up_irq_save(); size = host_mallocsize(mem); g_aordblks -= 1; g_uordblks -= size; free(mem); + up_irq_restore(flags); } void *host_realloc(void *oldmem, size_t size) { + uint64_t flags; size_t oldsize; void *mem; @@ -186,10 +206,13 @@ void *host_realloc(void *oldmem, size_t size) return host_memalign(sizeof(void *), size); } + flags = up_irq_save(); + oldsize = host_mallocsize(oldmem); mem = realloc(oldmem, size); if (mem == NULL) { + up_irq_restore(flags); return NULL; } @@ -197,6 +220,8 @@ void *host_realloc(void *oldmem, size_t size) g_uordblks -= oldsize; g_uordblks += size; + up_irq_restore(flags); + return mem; }