diff --git a/nx/source/applets/swkbd.c b/nx/source/applets/swkbd.c index 595c5f76..b366db85 100644 --- a/nx/source/applets/swkbd.c +++ b/nx/source/applets/swkbd.c @@ -1,11 +1,11 @@ #include -#include #include #include "libapplet_internal.h" #include "applets/swkbd.h" #include "services/vi.h" #include "runtime/hosversion.h" #include "runtime/util/utf.h" +#include "../runtime/alloc.h" static Result _swkbdGetReplies(SwkbdInline* s); @@ -85,7 +85,7 @@ Result swkbdCreate(SwkbdConfig* c, s32 max_dictwords) { c->workbuf_size = (c->workbuf_size + 0xfff) & ~0xfff; } - c->workbuf = (u8*)memalign(0x1000, c->workbuf_size); + c->workbuf = (u8*)__libnx_aligned_alloc(0x1000, c->workbuf_size); if (c->workbuf==NULL) rc = MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); if (R_SUCCEEDED(rc)) memset(c->workbuf, 0, c->workbuf_size); @@ -93,7 +93,7 @@ Result swkbdCreate(SwkbdConfig* c, s32 max_dictwords) { } void swkbdClose(SwkbdConfig* c) { - free(c->workbuf); + __libnx_free(c->workbuf); memset(c, 0, sizeof(SwkbdConfig)); } @@ -279,14 +279,14 @@ Result swkbdShow(SwkbdConfig* c, char* out_string, size_t out_string_size) { memset(&storage, 0, sizeof(AppletStorage)); memset(&customizedDictionarySet_storage, 0, sizeof(customizedDictionarySet_storage)); - strbuf = (u16*)malloc(strbuf_size+2); + strbuf = (u16*)__libnx_alloc(strbuf_size+2); if (strbuf==NULL) rc = MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); if (strbuf) memset(strbuf, 0, strbuf_size+2); if (R_FAILED(rc)) return rc; rc = appletCreateLibraryApplet(&holder, AppletId_LibraryAppletSwkbd, LibAppletMode_AllForeground); if (R_FAILED(rc)) { - free(strbuf); + __libnx_free(strbuf); return rc; } @@ -354,7 +354,7 @@ Result swkbdShow(SwkbdConfig* c, char* out_string, size_t out_string_size) { appletStorageCloseTmem(&storage); appletStorageCloseTmem(&customizedDictionarySet_storage); - free(strbuf); + __libnx_free(strbuf); return rc; } @@ -412,18 +412,18 @@ Result swkbdInlineCreate(SwkbdInline* s) { swkbdInlineSetUtf8Mode(s, true); s->interactive_tmpbuf_size = 0x1000; - s->interactive_tmpbuf = (u8*)malloc(s->interactive_tmpbuf_size); + s->interactive_tmpbuf = (u8*)__libnx_alloc(s->interactive_tmpbuf_size); if (s->interactive_tmpbuf==NULL) rc = MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); if (R_SUCCEEDED(rc)) memset(s->interactive_tmpbuf, 0, s->interactive_tmpbuf_size); if (R_SUCCEEDED(rc)) { s->interactive_strbuf_size = 0x1001; - s->interactive_strbuf = (char*)malloc(s->interactive_strbuf_size); + s->interactive_strbuf = (char*)__libnx_alloc(s->interactive_strbuf_size); if (s->interactive_strbuf==NULL) rc = MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); if (R_SUCCEEDED(rc)) memset(s->interactive_strbuf, 0, s->interactive_strbuf_size); if (R_FAILED(rc)) { - free(s->interactive_tmpbuf); + __libnx_free(s->interactive_tmpbuf); s->interactive_tmpbuf = NULL; } } @@ -470,10 +470,10 @@ Result swkbdInlineClose(SwkbdInline* s) { appletHolderClose(&s->holder); } - free(s->interactive_tmpbuf); + __libnx_free(s->interactive_tmpbuf); s->interactive_tmpbuf = NULL; s->interactive_tmpbuf_size = 0; - free(s->interactive_strbuf); + __libnx_free(s->interactive_strbuf); s->interactive_strbuf = NULL; s->interactive_strbuf_size = 0; diff --git a/nx/source/applets/web.c b/nx/source/applets/web.c index c4f429df..cd8a1f00 100644 --- a/nx/source/applets/web.c +++ b/nx/source/applets/web.c @@ -1,5 +1,4 @@ #include -#include #include "libapplet_internal.h" #include "applets/web.h" #include "runtime/hosversion.h" diff --git a/nx/source/audio/driver.c b/nx/source/audio/driver.c index b8cb2f18..96706dc1 100644 --- a/nx/source/audio/driver.c +++ b/nx/source/audio/driver.c @@ -64,7 +64,7 @@ Result audrvCreate(AudioDriver* d, const AudioRendererConfig* config, int num_fi size_t etc_size = _audrvGetEtcSize(config); memset(d, 0, sizeof(AudioDriver)); - d->etc = (AudioDriverEtc*)malloc(etc_size); + d->etc = (AudioDriverEtc*)__libnx_alloc(etc_size); if (!d->etc) goto _error0; @@ -80,12 +80,12 @@ Result audrvCreate(AudioDriver* d, const AudioRendererConfig* config, int num_fi d->etc->sinks = (AudioDriverEtcSink*)(d->etc->mixes+config->num_mix_objs); d->etc->out_buf_size = audrenGetOutputParamSize(config); - d->etc->out_buf = memalign(AUDREN_OUTPUT_PARAM_ALIGNMENT, d->etc->out_buf_size); + d->etc->out_buf = __libnx_aligned_alloc(AUDREN_OUTPUT_PARAM_ALIGNMENT, d->etc->out_buf_size); if (!d->etc->out_buf) goto _error1; d->etc->in_buf_size = audrenGetInputParamSize(config); - d->etc->in_buf = memalign(AUDREN_INPUT_PARAM_ALIGNMENT, d->etc->in_buf_size); + d->etc->in_buf = __libnx_aligned_alloc(AUDREN_INPUT_PARAM_ALIGNMENT, d->etc->in_buf_size); if (!d->etc->in_buf) goto _error2; @@ -93,9 +93,9 @@ Result audrvCreate(AudioDriver* d, const AudioRendererConfig* config, int num_fi return 0; _error2: - free(d->etc->out_buf); + __libnx_free(d->etc->out_buf); _error1: - free(d->etc); + __libnx_free(d->etc); d->etc = NULL; _error0: return MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); @@ -136,8 +136,8 @@ Result audrvUpdate(AudioDriver* d) void audrvClose(AudioDriver* d) { - free(d->etc->in_buf); - free(d->etc->out_buf); - free(d->etc); + __libnx_free(d->etc->in_buf); + __libnx_free(d->etc->out_buf); + __libnx_free(d->etc); memset(d, 0, sizeof(AudioDriver)); } diff --git a/nx/source/audio/driver_internal.h b/nx/source/audio/driver_internal.h index 116fe1a4..f234bbfc 100644 --- a/nx/source/audio/driver_internal.h +++ b/nx/source/audio/driver_internal.h @@ -1,10 +1,10 @@ #pragma once -#include #include #include "types.h" #include "result.h" #include "services/audren.h" #include "audio/driver.h" +#include "../runtime/alloc.h" typedef struct { int next_free; diff --git a/nx/source/display/framebuffer.c b/nx/source/display/framebuffer.c index 25043812..00a35fc8 100644 --- a/nx/source/display/framebuffer.c +++ b/nx/source/display/framebuffer.c @@ -11,6 +11,7 @@ #include "display/native_window.h" #include "display/framebuffer.h" #include "nvidia/graphic_buffer.h" +#include "../runtime/alloc.h" static const NvColorFormat g_nvColorFmtTable[] = { NvColorFormat_A8B8G8R8, // PIXEL_FORMAT_RGBA_8888 @@ -76,7 +77,7 @@ Result framebufferCreate(Framebuffer* fb, NWindow *win, u32 width, u32 height, u const u32 fb_size = width_aligned_bytes*height_aligned; const u32 buf_size = (num_fbs*fb_size + 0xFFF) &~ 0xFFF; // needs to be page aligned - fb->buf = aligned_alloc(0x1000, buf_size); + fb->buf = __libnx_aligned_alloc(0x1000, buf_size); if (!fb->buf) rc = MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); @@ -119,10 +120,11 @@ Result framebufferMakeLinear(Framebuffer* fb) return MAKERESULT(Module_Libnx, LibnxError_AlreadyInitialized); u32 height = (fb->win->height + 7) &~ 7; // GOBs are 8 rows tall - fb->buf_linear = calloc(1, fb->stride*height); + fb->buf_linear = __libnx_alloc(fb->stride*height); if (!fb->buf_linear) return MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); + memset(fb->buf_linear, 0, fb->stride*height); return 0; } @@ -132,12 +134,12 @@ void framebufferClose(Framebuffer* fb) return; if (fb->buf_linear) - free(fb->buf_linear); + __libnx_free(fb->buf_linear); if (fb->buf) { nwindowReleaseBuffers(fb->win); nvMapClose(&fb->map); - free(fb->buf); + __libnx_free(fb->buf); } memset(fb, 0, sizeof(*fb)); diff --git a/nx/source/kernel/jit.c b/nx/source/kernel/jit.c index 1028e3bb..452a3ad7 100644 --- a/nx/source/kernel/jit.c +++ b/nx/source/kernel/jit.c @@ -1,5 +1,4 @@ // Copyright 2018 plutoo -#include #include "types.h" #include "result.h" #include "runtime/env.h" @@ -7,6 +6,7 @@ #include "kernel/svc.h" #include "kernel/virtmem.h" #include "kernel/jit.h" +#include "../runtime/alloc.h" Result jitCreate(Jit* j, size_t size) { @@ -29,8 +29,7 @@ Result jitCreate(Jit* j, size_t size) } size = (size + 0xFFF) &~ 0xFFF; - - void* src_addr = memalign(0x1000, size); + void* src_addr = __libnx_aligned_alloc(0x1000, size); if (src_addr == NULL) return MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); @@ -92,7 +91,7 @@ Result jitCreate(Jit* j, size_t size) } if (R_FAILED(rc)) { - free(j->src_addr); + __libnx_free(j->src_addr); j->src_addr = NULL; } @@ -179,7 +178,7 @@ Result jitClose(Jit* j) if (R_SUCCEEDED(rc)) { if (j->src_addr != NULL) { - free(j->src_addr); + __libnx_free(j->src_addr); j->src_addr = NULL; } } diff --git a/nx/source/kernel/shmem.c b/nx/source/kernel/shmem.c index 99885b6f..5ed28da4 100644 --- a/nx/source/kernel/shmem.c +++ b/nx/source/kernel/shmem.c @@ -1,5 +1,4 @@ // Copyright 2017 plutoo -#include #include "types.h" #include "result.h" #include "kernel/svc.h" diff --git a/nx/source/kernel/thread.c b/nx/source/kernel/thread.c index af227449..2703a0f6 100644 --- a/nx/source/kernel/thread.c +++ b/nx/source/kernel/thread.c @@ -1,5 +1,4 @@ // Copyright 2017 plutoo -#include #include #include "types.h" #include "result.h" @@ -11,6 +10,7 @@ #include "runtime/env.h" #include "runtime/diag.h" #include "../internal.h" +#include "../runtime/alloc.h" #define USER_TLS_BEGIN 0x108 #define USER_TLS_END (0x200 - sizeof(ThreadVars)) @@ -90,14 +90,6 @@ void __libnx_init_thread(void) { getThreadVars()->thread_ptr = &g_mainThread; } -void* __attribute__((weak)) __libnx_thread_alloc(size_t size) { - return memalign(0x1000, size); -} - -void __attribute__((weak)) __libnx_thread_free(void* mem) { - free(mem); -} - Result threadCreate( Thread* t, ThreadFunc entry, void* arg, void* stack_mem, size_t stack_sz, int prio, int cpuid) @@ -109,7 +101,7 @@ Result threadCreate( bool owns_stack_mem; if (stack_mem == NULL) { // Allocate new memory, stack then reent then tls. - stack_mem = __libnx_thread_alloc(((stack_sz + reent_sz + tls_sz) + 0xFFF) & ~0xFFF); + stack_mem = __libnx_aligned_alloc(0x1000, stack_sz + reent_sz + tls_sz); owns_stack_mem = true; } else { @@ -190,7 +182,7 @@ Result threadCreate( if (R_FAILED(rc)) { if (owns_stack_mem) { - __libnx_thread_free(stack_mem); + __libnx_free(stack_mem); } } @@ -248,7 +240,7 @@ Result threadClose(Thread* t) { if (R_SUCCEEDED(rc)) { if (t->owns_stack_mem) { - __libnx_thread_free(t->stack_mem); + __libnx_free(t->stack_mem); } svcCloseHandle(t->handle); } diff --git a/nx/source/kernel/tmem.c b/nx/source/kernel/tmem.c index e5a9f7fe..cbf1aeb1 100644 --- a/nx/source/kernel/tmem.c +++ b/nx/source/kernel/tmem.c @@ -1,12 +1,12 @@ // Copyright 2017 plutoo #include -#include #include "types.h" #include "result.h" #include "kernel/svc.h" #include "kernel/tmem.h" #include "kernel/virtmem.h" #include "runtime/diag.h" +#include "../runtime/alloc.h" Result tmemCreate(TransferMemory* t, size_t size, Permission perm) { @@ -16,7 +16,7 @@ Result tmemCreate(TransferMemory* t, size_t size, Permission perm) t->size = size; t->perm = perm; t->map_addr = NULL; - t->src_addr = memalign(0x1000, size); + t->src_addr = __libnx_aligned_alloc(0x1000, size); if (t->src_addr == NULL) { rc = MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); @@ -30,7 +30,7 @@ Result tmemCreate(TransferMemory* t, size_t size, Permission perm) } if (R_FAILED(rc)) { - free(t->src_addr); + __libnx_free(t->src_addr); t->src_addr = NULL; } @@ -114,7 +114,7 @@ Result tmemClose(TransferMemory* t) } if (t->src_addr != NULL) { - free(t->src_addr); + __libnx_free(t->src_addr); } t->src_addr = NULL; diff --git a/nx/source/kernel/virtmem.c b/nx/source/kernel/virtmem.c index 650a7332..931ac292 100644 --- a/nx/source/kernel/virtmem.c +++ b/nx/source/kernel/virtmem.c @@ -5,7 +5,7 @@ #include "kernel/virtmem.h" #include "kernel/random.h" #include "runtime/diag.h" -#include +#include "../runtime/alloc.h" #define SEQUENTIAL_GUARD_REGION_SIZE 0x1000 #define RANDOM_MAX_ATTEMPTS 0x200 @@ -220,7 +220,7 @@ void* virtmemFindCodeMemory(size_t size, size_t guard_size) { VirtmemReservation* virtmemAddReservation(void* mem, size_t size) { if (!mutexIsLockedByCurrentThread(&g_VirtmemMutex)) return NULL; - VirtmemReservation* rv = (VirtmemReservation*)malloc(sizeof(VirtmemReservation)); + VirtmemReservation* rv = (VirtmemReservation*)__libnx_alloc(sizeof(VirtmemReservation)); if (rv) { rv->region.start = (uintptr_t)mem; rv->region.end = rv->region.start + size; @@ -241,4 +241,5 @@ void virtmemRemoveReservation(VirtmemReservation* rv) { rv->prev->next = rv->next; else g_Reservations = rv->next; + __libnx_free(rv); } diff --git a/nx/source/nvidia/address_space.c b/nx/source/nvidia/address_space.c index 051c9aaa..e7079734 100644 --- a/nx/source/nvidia/address_space.c +++ b/nx/source/nvidia/address_space.c @@ -1,4 +1,3 @@ -#include #include "types.h" #include "result.h" #include "kernel/svc.h" diff --git a/nx/source/nvidia/channel.c b/nx/source/nvidia/channel.c index 1dfa9c46..12efedd7 100644 --- a/nx/source/nvidia/channel.c +++ b/nx/source/nvidia/channel.c @@ -1,4 +1,3 @@ -#include #include "types.h" #include "result.h" #include "kernel/svc.h" diff --git a/nx/source/nvidia/gpu_channel.c b/nx/source/nvidia/gpu_channel.c index fb87649b..78931698 100644 --- a/nx/source/nvidia/gpu_channel.c +++ b/nx/source/nvidia/gpu_channel.c @@ -1,4 +1,3 @@ -#include #include "types.h" #include "result.h" #include "kernel/svc.h" diff --git a/nx/source/runtime/alloc.c b/nx/source/runtime/alloc.c new file mode 100644 index 00000000..ec882180 --- /dev/null +++ b/nx/source/runtime/alloc.c @@ -0,0 +1,15 @@ +#include "alloc.h" +#include + +void* __attribute__((weak)) __libnx_alloc(size_t size) { + return malloc(size); +} + +void* __attribute__((weak)) __libnx_aligned_alloc(size_t alignment, size_t size) { + size = (size + alignment - 1) &~ (alignment - 1); + return aligned_alloc(alignment, size); +} + +void __attribute__((weak)) __libnx_free(void* p) { + free(p); +} diff --git a/nx/source/runtime/alloc.h b/nx/source/runtime/alloc.h new file mode 100644 index 00000000..7e820fa2 --- /dev/null +++ b/nx/source/runtime/alloc.h @@ -0,0 +1,6 @@ +#pragma once +#include "types.h" + +void* __libnx_alloc(size_t size); +void* __libnx_aligned_alloc(size_t alignment, size_t size); +void __libnx_free(void* p); diff --git a/nx/source/runtime/devices/fs_dev.c b/nx/source/runtime/devices/fs_dev.c index e829a22a..f5590e92 100644 --- a/nx/source/runtime/devices/fs_dev.c +++ b/nx/source/runtime/devices/fs_dev.c @@ -14,6 +14,7 @@ #include "runtime/env.h" #include "services/time.h" +#include "../alloc.h" #include "path_buf.h" /*! @internal @@ -324,7 +325,7 @@ static int _fsdevMountDevice(const char *name, FsFileSystem fs, fsdev_fsdevice * goto _fail; device->setup = 1; - device->cwd = __nx_fsdev_support_cwd ? malloc(FS_MAX_PATH) : NULL; + device->cwd = __nx_fsdev_support_cwd ? __libnx_alloc(FS_MAX_PATH) : NULL; if(device->cwd!=NULL) { device->cwd[0] = '/'; @@ -365,7 +366,7 @@ static int _fsdevUnmountDeviceStruct(fsdev_fsdevice *device) strncat(name, ":", sizeof(name)-strlen(name)-1); RemoveDevice(name); - free(device->cwd); + __libnx_free(device->cwd); fsFsClose(&device->fs); if(device->id == fsdev_fsdevice_cwd) diff --git a/nx/source/runtime/devices/romfs_dev.c b/nx/source/runtime/devices/romfs_dev.c index 8c19e3b2..baad1d77 100644 --- a/nx/source/runtime/devices/romfs_dev.c +++ b/nx/source/runtime/devices/romfs_dev.c @@ -14,6 +14,7 @@ #include "runtime/env.h" #include "nro.h" +#include "../alloc.h" #include "path_buf.h" typedef enum { @@ -240,10 +241,10 @@ static romfs_mount* romfs_alloc(void) static void romfs_free(romfs_mount *mount) { - free(mount->fileTable); - free(mount->fileHashTable); - free(mount->dirTable); - free(mount->dirHashTable); + __libnx_free(mount->fileTable); + __libnx_free(mount->fileHashTable); + __libnx_free(mount->dirTable); + __libnx_free(mount->dirHashTable); _romfsResetMount(mount, mount->id); } @@ -395,25 +396,25 @@ Result romfsMountCommon(const char *name, romfs_mount *mount) if (_romfs_read(mount, 0, &mount->header, sizeof(mount->header)) != sizeof(mount->header)) goto fail_io; - mount->dirHashTable = (u32*)malloc(mount->header.dirHashTableSize); + mount->dirHashTable = (u32*)__libnx_alloc(mount->header.dirHashTableSize); if (!mount->dirHashTable) goto fail_oom; if (!_romfs_read_chk(mount, mount->header.dirHashTableOff, mount->dirHashTable, mount->header.dirHashTableSize)) goto fail_io; - mount->dirTable = malloc(mount->header.dirTableSize); + mount->dirTable = __libnx_alloc(mount->header.dirTableSize); if (!mount->dirTable) goto fail_oom; if (!_romfs_read_chk(mount, mount->header.dirTableOff, mount->dirTable, mount->header.dirTableSize)) goto fail_io; - mount->fileHashTable = (u32*)malloc(mount->header.fileHashTableSize); + mount->fileHashTable = (u32*)__libnx_alloc(mount->header.fileHashTableSize); if (!mount->fileHashTable) goto fail_oom; if (!_romfs_read_chk(mount, mount->header.fileHashTableOff, mount->fileHashTable, mount->header.fileHashTableSize)) goto fail_io; - mount->fileTable = malloc(mount->header.fileTableSize); + mount->fileTable = __libnx_alloc(mount->header.fileTableSize); if (!mount->fileTable) goto fail_oom; if (!_romfs_read_chk(mount, mount->header.fileTableOff, mount->fileTable, mount->header.fileTableSize)) diff --git a/nx/source/runtime/devices/socket.c b/nx/source/runtime/devices/socket.c index 02eddf3f..a2f0b4fe 100644 --- a/nx/source/runtime/devices/socket.c +++ b/nx/source/runtime/devices/socket.c @@ -4,7 +4,6 @@ #include #include #include -#include #include #include @@ -19,6 +18,7 @@ #include "services/ssl.h" #include "runtime/devices/socket.h" #include "runtime/hosversion.h" +#include "../alloc.h" __attribute__((weak)) size_t __nx_pollfd_sb_max_fds = 64; @@ -308,7 +308,7 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struc if(numfds <= __nx_pollfd_sb_max_fds) pollinfo = (struct pollfd *)alloca(numfds * sizeof(struct pollfd)); else - pollinfo = (struct pollfd *)malloc(numfds * sizeof(struct pollfd)); + pollinfo = (struct pollfd *)__libnx_alloc(numfds * sizeof(struct pollfd)); if(pollinfo == NULL) { errno = ENOMEM; return -1; @@ -379,7 +379,7 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struc cleanup: if(numfds > __nx_pollfd_sb_max_fds) - free(pollinfo); + __libnx_free(pollinfo); return rc; } @@ -396,7 +396,7 @@ int poll(struct pollfd *fds, nfds_t nfds, int timeout) { if(nfds <= __nx_pollfd_sb_max_fds) fds2 = (struct pollfd *)alloca(nfds * sizeof(struct pollfd)); else - fds2 = (struct pollfd *)malloc(nfds * sizeof(struct pollfd)); + fds2 = (struct pollfd *)__libnx_alloc(nfds * sizeof(struct pollfd)); if(fds2 == NULL) { errno = ENOMEM; return -1; @@ -426,7 +426,7 @@ int poll(struct pollfd *fds, nfds_t nfds, int timeout) { } if(nfds > __nx_pollfd_sb_max_fds) - free(fds2); + __libnx_free(fds2); return ret; } @@ -629,7 +629,7 @@ int ioctl(int fd, int request, ...) { return -1; } - struct bpf_program_serialized *prog_ser = (struct bpf_program_serialized *)malloc(sizeof(struct bpf_program_serialized)); + struct bpf_program_serialized *prog_ser = (struct bpf_program_serialized *)__libnx_alloc(sizeof(struct bpf_program_serialized)); if(prog_ser == NULL) { errno = ENOMEM; return -1; @@ -640,7 +640,7 @@ int ioctl(int fd, int request, ...) { request = _IOC(request & IOC_DIRMASK, IOCGROUP(request), IOCBASECMD(request), sizeof(struct bpf_program_serialized)); ret = bsdIoctl(fd, request, prog_ser); - free(prog_ser); + __libnx_free(prog_ser); return _socketParseBsdResult(NULL, ret); } default: @@ -967,7 +967,7 @@ static int _mmsgInitCommon(u8 **buf, size_t *alignsize, struct mmsghdr *msgvec, } *alignsize = (bufsize+0xfff) & ~0xfff; - *buf = (u8*)memalign(0x1000, *alignsize); + *buf = (u8*)__libnx_aligned_alloc(0x1000, *alignsize); if (*buf == NULL) { errno = ENOMEM; return -1; @@ -1018,7 +1018,7 @@ int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags) { if (ret2==-1) ret = ret2; } - free(buf); + __libnx_free(buf); return ret; } @@ -1062,7 +1062,7 @@ int recvmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags, s if (ret2==-1) ret = ret2; } - free(buf); + __libnx_free(buf); return ret; } diff --git a/nx/source/runtime/devices/usb_comms.c b/nx/source/runtime/devices/usb_comms.c index d0fcb933..18edd882 100644 --- a/nx/source/runtime/devices/usb_comms.c +++ b/nx/source/runtime/devices/usb_comms.c @@ -1,5 +1,4 @@ #include -#include #include "types.h" #include "result.h" #include "kernel/rwlock.h" @@ -7,6 +6,7 @@ #include "runtime/hosversion.h" #include "runtime/diag.h" #include "runtime/devices/usb_comms.h" +#include "../alloc.h" #define TOTAL_INTERFACES 4 @@ -177,8 +177,8 @@ static void _usbCommsInterfaceFree(usbCommsInterface *interface) interface->endpoint_out = NULL; interface->interface = NULL; - free(interface->endpoint_in_buffer); - free(interface->endpoint_out_buffer); + __libnx_free(interface->endpoint_in_buffer); + __libnx_free(interface->endpoint_out_buffer); interface->endpoint_in_buffer = NULL; interface->endpoint_out_buffer = NULL; @@ -258,11 +258,11 @@ static Result _usbCommsInterfaceInit5x(u32 intf_ind, const UsbCommsInterfaceInfo interface->initialized = 1; //The buffer for PostBufferAsync commands must be 0x1000-byte aligned. - interface->endpoint_in_buffer = memalign(0x1000, 0x1000); + interface->endpoint_in_buffer = __libnx_aligned_alloc(0x1000, 0x1000); if (interface->endpoint_in_buffer==NULL) rc = MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); if (R_SUCCEEDED(rc)) { - interface->endpoint_out_buffer = memalign(0x1000, 0x1000); + interface->endpoint_out_buffer = __libnx_aligned_alloc(0x1000, 0x1000); if (interface->endpoint_out_buffer==NULL) rc = MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); } @@ -360,11 +360,11 @@ static Result _usbCommsInterfaceInit1x(u32 intf_ind, const UsbCommsInterfaceInfo interface->initialized = 1; //The buffer for PostBufferAsync commands must be 0x1000-byte aligned. - interface->endpoint_in_buffer = memalign(0x1000, 0x1000); + interface->endpoint_in_buffer = __libnx_aligned_alloc(0x1000, 0x1000); if (interface->endpoint_in_buffer==NULL) rc = MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); if (R_SUCCEEDED(rc)) { - interface->endpoint_out_buffer = memalign(0x1000, 0x1000); + interface->endpoint_out_buffer = __libnx_aligned_alloc(0x1000, 0x1000); if (interface->endpoint_out_buffer==NULL) rc = MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); } diff --git a/nx/source/runtime/newlib.c b/nx/source/runtime/newlib.c index faee450e..57112aa6 100644 --- a/nx/source/runtime/newlib.c +++ b/nx/source/runtime/newlib.c @@ -18,6 +18,7 @@ #include "services/time.h" #include "runtime/diag.h" #include "result.h" +#include "alloc.h" #define THRD_MAIN_HANDLE ((struct __pthread_t*)~(uintptr_t)0) @@ -183,7 +184,7 @@ int __syscall_thread_create(struct __pthread_t **thread, void* (*func)(void*), v if (R_FAILED(rc)) return EPERM; - struct __pthread_t* t = (struct __pthread_t*)malloc(sizeof(struct __pthread_t)); + struct __pthread_t* t = (struct __pthread_t*)__libnx_alloc(sizeof(struct __pthread_t)); if (!t) return ENOMEM; @@ -217,7 +218,7 @@ int __syscall_thread_create(struct __pthread_t **thread, void* (*func)(void*), v _error2: threadClose(&t->thr); _error1: - free(t); + __libnx_free(t); return ENOMEM; } @@ -232,7 +233,7 @@ void* __syscall_thread_join(struct __pthread_t *thread) void* ret = thread->rc; threadClose(&thread->thr); - free(thread); + __libnx_free(thread); return ret; } diff --git a/nx/source/runtime/resolver.c b/nx/source/runtime/resolver.c index 36728b9f..7a35e3ad 100644 --- a/nx/source/runtime/resolver.c +++ b/nx/source/runtime/resolver.c @@ -14,6 +14,7 @@ #include "services/nifm.h" #include "runtime/hosversion.h" #include "runtime/resolver.h" +#include "alloc.h" __thread int h_errno; @@ -126,7 +127,7 @@ static struct hostent *_resolverDeserializeHostent(const void *out_he_serialized pos_addresses = pos; pos += addrlen * nb_addresses; - he = malloc( + he = __libnx_alloc( sizeof(struct hostent) + name_size + 8 * (nb_aliases + 1 + nb_addresses + 1) @@ -244,7 +245,7 @@ static struct addrinfo_serialized_hdr *_resolverSerializeAddrInfoList(size_t *ou if (reqsize > g_resolverAddrInfoHintsBufferSize) return NULL; - struct addrinfo_serialized_hdr *out = malloc(reqsize); + struct addrinfo_serialized_hdr *out = __libnx_alloc(reqsize); if (!out) return NULL; @@ -268,7 +269,7 @@ static struct addrinfo *_resolverDeserializeAddrInfo(size_t *out_len, const stru size_t subsize1 = hdr->ai_addrlen ? ntohl(hdr->ai_addrlen) : 4; size_t subsize2 = strlen((const char *)hdr + sizeof(struct addrinfo_serialized_hdr) + subsize1) + 1; - struct addrinfo_node *node = malloc(sizeof(struct addrinfo_node) + subsize2); + struct addrinfo_node *node = __libnx_alloc(sizeof(struct addrinfo_node) + subsize2); *out_len = sizeof(struct addrinfo_serialized_hdr) + subsize1 + subsize2; if (!node) @@ -348,13 +349,13 @@ static struct addrinfo *_resolverDeserializeAddrInfoList(struct addrinfo_seriali } void freehostent(struct hostent *he) { - free(he); + __libnx_free(he); } void freeaddrinfo(struct addrinfo *ai) { for (struct addrinfo *node = ai, *next; node; node = next) { next = node->ai_next; - free(node); + __libnx_free(node); } } @@ -371,7 +372,7 @@ struct hostent *gethostbyname(const char *name) { return NULL; } - void *out_serialized = malloc(g_resolverHostByNameBufferSize); + void *out_serialized = __libnx_alloc(g_resolverHostByNameBufferSize); if (!out_serialized) { h_errno = NETDB_INTERNAL; errno = ENOMEM; @@ -403,7 +404,7 @@ struct hostent *gethostbyname(const char *name) { if (h_errno == NETDB_SUCCESS) ret = _resolverDeserializeHostent(out_serialized); - free(out_serialized); + __libnx_free(out_serialized); return ret; } @@ -426,7 +427,7 @@ struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type) { return NULL; } - void *out_serialized = malloc(g_resolverHostByAddrBufferSize); + void *out_serialized = __libnx_alloc(g_resolverHostByAddrBufferSize); if (!out_serialized) { h_errno = NETDB_INTERNAL; errno = ENOMEM; @@ -458,7 +459,7 @@ struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type) { if (h_errno == NETDB_SUCCESS) ret = _resolverDeserializeHostent(out_serialized); - free(out_serialized); + __libnx_free(out_serialized); return ret; } @@ -508,9 +509,9 @@ int getaddrinfo(const char *node, const char *service, const struct addrinfo *hi } } - struct addrinfo_serialized_hdr *out_serialized = malloc(g_resolverAddrInfoBufferSize); + struct addrinfo_serialized_hdr *out_serialized = __libnx_alloc(g_resolverAddrInfoBufferSize); if (!out_serialized) { - free(hints_serialized); + __libnx_free(hints_serialized); errno = ENOMEM; return EAI_FAIL; } @@ -528,7 +529,7 @@ int getaddrinfo(const char *node, const char *service, const struct addrinfo *hi NULL); g_resolverResult = rc; g_resolverCancelHandle = 0; - free(hints_serialized); + __libnx_free(hints_serialized); if (R_FAILED(rc)) { if (R_MODULE(rc) == 21) // SM @@ -548,7 +549,7 @@ int getaddrinfo(const char *node, const char *service, const struct addrinfo *hi } } - free(out_serialized); + __libnx_free(out_serialized); return ret; } diff --git a/nx/source/runtime/ringcon.c b/nx/source/runtime/ringcon.c index 36bba588..95a935d8 100644 --- a/nx/source/runtime/ringcon.c +++ b/nx/source/runtime/ringcon.c @@ -1,7 +1,7 @@ #include -#include #include "runtime/ringcon.h" #include "arm/counter.h" +#include "alloc.h" static Result _ringconSetup(RingCon *c); @@ -62,7 +62,7 @@ Result ringconCreate(RingCon *c, HidNpadIdType id) { memset(c, 0, sizeof(*c)); c->workbuf_size = 0x1000; - c->workbuf = memalign(0x1000, c->workbuf_size); + c->workbuf = __libnx_aligned_alloc(0x1000, c->workbuf_size); if (c->workbuf == NULL) rc = MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); else @@ -101,7 +101,7 @@ void ringconClose(RingCon *c) { hidbusFinalize(c->handle); } - free(c->workbuf); + __libnx_free(c->workbuf); c->workbuf = 0; } diff --git a/nx/source/services/hid.c b/nx/source/services/hid.c index dabf742a..f0ebc327 100644 --- a/nx/source/services/hid.c +++ b/nx/source/services/hid.c @@ -2,7 +2,6 @@ #include "service_guard.h" #include #include -#include #include #include "kernel/shmem.h" #include "kernel/mutex.h" @@ -11,6 +10,7 @@ #include "services/hid.h" #include "runtime/hosversion.h" #include "runtime/diag.h" +#include "../runtime/alloc.h" static Service g_hidSrv; static Service g_hidIAppletResource; @@ -1410,7 +1410,7 @@ Result hidInitializeSevenSixAxisSensor(void) { if (R_FAILED(rc)) return rc; } - g_sevenSixAxisSensorBuffer = (u8*)memalign(0x1000, bufsize); + g_sevenSixAxisSensorBuffer = (u8*)__libnx_aligned_alloc(0x1000, bufsize); if (g_sevenSixAxisSensorBuffer == NULL) return MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); memset(g_sevenSixAxisSensorBuffer, 0, bufsize); @@ -1424,7 +1424,7 @@ Result hidInitializeSevenSixAxisSensor(void) { tmemClose(&g_sevenSixAxisSensorTmem0); tmemClose(&g_sevenSixAxisSensorTmem1); - free(g_sevenSixAxisSensorBuffer); + __libnx_free(g_sevenSixAxisSensorBuffer); g_sevenSixAxisSensorBuffer = NULL; } @@ -1444,7 +1444,7 @@ Result hidFinalizeSevenSixAxisSensor(void) { tmemClose(&g_sevenSixAxisSensorTmem0); tmemClose(&g_sevenSixAxisSensorTmem1); - free(g_sevenSixAxisSensorBuffer); + __libnx_free(g_sevenSixAxisSensorBuffer); g_sevenSixAxisSensorBuffer = NULL; return rc;