diff --git a/repos/dde_linux/src/include/lx_emul/alloc.h b/repos/dde_linux/src/include/lx_emul/alloc.h index 88daeb69f6..8f5fbbddf4 100644 --- a/repos/dde_linux/src/include/lx_emul/alloc.h +++ b/repos/dde_linux/src/include/lx_emul/alloc.h @@ -21,6 +21,7 @@ extern "C" { void * lx_emul_mem_alloc(unsigned long size); void * lx_emul_mem_alloc_uncached(unsigned long size); void * lx_emul_mem_alloc_aligned(unsigned long size, unsigned long align); +void * lx_emul_mem_alloc_aligned_uncached(unsigned long size, unsigned long align); unsigned long lx_emul_mem_dma_addr(void * addr); void lx_emul_mem_free(const void * ptr); unsigned long lx_emul_mem_size(const void * ptr); diff --git a/repos/dde_linux/src/lib/lx_emul/alloc.cc b/repos/dde_linux/src/lib/lx_emul/alloc.cc index 2c9a2c449b..4c11920b0c 100644 --- a/repos/dde_linux/src/lib/lx_emul/alloc.cc +++ b/repos/dde_linux/src/lib/lx_emul/alloc.cc @@ -43,6 +43,16 @@ extern "C" void * lx_emul_mem_alloc_uncached(unsigned long size) }; +extern "C" void * lx_emul_mem_alloc_aligned_uncached(unsigned long size, + unsigned long align) +{ + /* always align memory objects to 32 bytes, like malloc, heap etc. */ + void * const ptr = Lx_kit::env().uncached_memory.alloc(size, align); + lx_emul_forget_pages(ptr, size); + return ptr; +}; + + extern "C" unsigned long lx_emul_mem_dma_addr(void * addr) { unsigned long ret = Lx_kit::env().memory.dma_addr(addr); diff --git a/repos/dde_linux/src/lib/lx_emul/shadow/kernel/dma/mapping.c b/repos/dde_linux/src/lib/lx_emul/shadow/kernel/dma/mapping.c index 90df148508..6caed93c10 100644 --- a/repos/dde_linux/src/lib/lx_emul/shadow/kernel/dma/mapping.c +++ b/repos/dde_linux/src/lib/lx_emul/shadow/kernel/dma/mapping.c @@ -29,7 +29,7 @@ void * dma_alloc_attrs(struct device * dev, lx_emul_trace_and_stop(__func__); } - addr = lx_emul_mem_alloc_uncached(size); + addr = lx_emul_mem_alloc_aligned_uncached(size, PAGE_SIZE); *dma_handle = lx_emul_mem_dma_addr(addr); return addr; }