1
0
mirror of https://github.com/libretro/RetroArch synced 2024-07-03 00:38:44 +00:00

[ORBIS] Use user_mem_sys library

This commit is contained in:
Francisco Javier Trujillo Mata 2021-10-12 21:40:15 +02:00
parent 8f81692b78
commit 05a03164bd
4 changed files with 6 additions and 442 deletions

View File

@ -16,8 +16,7 @@ PC_DEVELOPMENT_UDP_PORT = 18194
AUTH_INFO = 000000000000000000000000001C004000FF000000000080000000000000000000000000000000000000008000400040000000000000008000000000000000080040FFFF000000F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
OBJ += memory/ps4/user_mem.o \
deps/xxHash/xxhash.c \
OBJ += deps/xxHash/xxhash.c \
# input/drivers/ps4_input.o \
# input/drivers_joypad/ps4_joypad.o \
# audio/drivers/psp_audio.o \
@ -116,8 +115,8 @@ STRIP := $(PREFIX)strip
NM := $(PREFIX)nm
LD := clang
LIBDIRS += -L. -Lcores -Lmemory/ps4 -Lbuild -L$(ORBISDEV)/usr/lib
INCDIRS += -I. -Idefines -Imemory/ps4 -Ideps -Ideps/7zip -Ideps/libz -Ilibretro-common/include -Ideps/stb \
LIBDIRS += -L. -Lcores -Lbuild -L$(ORBISDEV)/usr/lib
INCDIRS += -I. -Idefines -Ideps -Ideps/7zip -Ideps/libz -Ilibretro-common/include -Ideps/stb \
-Ilibretro-common/include/compat/zlib -Ideps/rcheevos/include -I$(ORBISDEV)/usr/include -I$(ORBISDEV)/usr/include/c++/v1 -I$(ORBISDEV)/usr/include/orbis
ARCHFLAGS += --target=x86_64-scei-ps4 -DORBIS -D__PS4__ -D_BSD_SOURCE
@ -152,9 +151,9 @@ ifeq ($(WHOLE_ARCHIVE_LINK), 1)
endif
PS4_LIBS += -lkernel_stub -lSceLibcInternal_stub -lSceSysmodule_stub -lSceSystemService_stub -lSceNet_stub -lSceUserService_stub \
-lScePigletv2VSH_stub -lSceVideoOut_stub -lSceGnmDriver_stub -lorbisGl2 -lorbis -lScePad_stub -lSceAudioOut_stub \
-lSceIme_stub -lSceNetCtl_stub
PS4_LIBS += -luser_mem_sys -lkernel_stub -lSceLibcInternal_stub -lSceSysmodule_stub -lSceSystemService_stub -lSceNet_stub \
-lSceUserService_stub -lScePigletv2VSH_stub -lSceVideoOut_stub -lSceGnmDriver_stub -lorbisGl2 -lorbis -lScePad_stub \
-lSceAudioOut_stub -lSceIme_stub -lSceNetCtl_stub
ifeq ($(HAVE_STATIC_DUMMY),1)
LIBS := $(PS4_LIBS)

View File

@ -1,223 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <defines/ps4_defines.h>
#include "user_mem.h"
#include <orbis/libSceLibcInternal.h>
#include <orbis/libkernel.h>
static OrbisMspace s_mspace = 0;
static OrbisMallocManagedSize s_mmsize;
static void *s_mem_start = 0;
static size_t s_mem_size = MEM_SIZE;
int malloc_init(void)
{
int res;
if (s_mspace)
return 0;
res = sceKernelReserveVirtualRange(&s_mem_start, MEM_SIZE, 0, MEM_ALIGN);
if (res < 0)
return 1;
res = sceKernelMapNamedSystemFlexibleMemory(&s_mem_start, MEM_SIZE, SCE_KERNEL_PROT_CPU_RW, SCE_KERNEL_MAP_FIXED, "User Mem");
if (res < 0)
return 1;
s_mspace = sceLibcMspaceCreate("User Mspace", s_mem_start, s_mem_size, 0);
if (!s_mspace)
return 1;
s_mmsize.sz = sizeof(s_mmsize);
s_mmsize.ver = 1;
res = sceLibcMspaceMallocStatsFast(s_mspace, &s_mmsize);
return 0;
}
int malloc_finalize(void)
{
int res;
if (s_mspace)
{
res = sceLibcMspaceDestroy(s_mspace);
if (res != 0)
return 1;
}
res = sceKernelReleaseFlexibleMemory(s_mem_start, s_mem_size);
if (res < 0)
return 1;
res = sceKernelMunmap(s_mem_start, s_mem_size);
if (res < 0)
return 1;
return 0;
}
void *malloc(size_t size)
{
if (!s_mspace)
malloc_init();
return sceLibcMspaceMalloc(s_mspace, size);
}
void free(void *ptr)
{
if (!ptr || !s_mspace)
return;
sceLibcMspaceFree(s_mspace, ptr);
}
void *calloc(size_t nelem, size_t size)
{
if (!s_mspace)
malloc_init();
return sceLibcMspaceCalloc(s_mspace, nelem, size);
}
void *realloc(void *ptr, size_t size)
{
if (!s_mspace)
malloc_init();
return sceLibcMspaceRealloc(s_mspace, ptr, size);
}
void *memalign(size_t boundary, size_t size)
{
if (!s_mspace)
malloc_init();
return sceLibcMspaceMemalign(s_mspace, boundary, size);
}
int posix_memalign(void **ptr, size_t boundary, size_t size)
{
if (!s_mspace)
malloc_init();
return sceLibcMspacePosixMemalign(s_mspace, ptr, boundary, size);
}
void *reallocalign(void *ptr, size_t size, size_t boundary)
{
if (!s_mspace)
malloc_init();
return sceLibcMspaceReallocalign(s_mspace, ptr, boundary, size);
}
int malloc_stats(OrbisMallocManagedSize *mmsize)
{
if (!s_mspace)
malloc_init();
return sceLibcMspaceMallocStats(s_mspace, mmsize);
}
int malloc_stats_fast(OrbisMallocManagedSize *mmsize)
{
if (!s_mspace)
malloc_init();
return sceLibcMspaceMallocStatsFast(s_mspace, mmsize);
}
size_t malloc_usable_size(void *ptr)
{
if (!ptr)
return 0;
return sceLibcMspaceMallocUsableSize(ptr);
}
int vasprintf(char **bufp, const char *format, va_list ap)
{
va_list ap1;
int bytes;
char *p;
va_copy(ap1, ap);
bytes = vsnprintf(NULL, 0, format, ap1) + 1;
va_end(ap1);
*bufp = p = malloc(bytes);
if (!p)
return -1;
return vsnprintf(p, bytes, format, ap);
}
int asprintf(char **bufp, const char *format, ...)
{
va_list ap, ap1;
int rv;
int bytes;
char *p;
va_start(ap, format);
va_copy(ap1, ap);
bytes = vsnprintf(NULL, 0, format, ap1) + 1;
va_end(ap1);
*bufp = p = malloc(bytes);
if (!p)
return -1;
rv = vsnprintf(p, bytes, format, ap);
va_end(ap);
return rv;
}
char *strdup(const char *s)
{
size_t len = strlen(s) + 1;
void *new_s = malloc(sizeof(char) * len);
if (!new_s)
return NULL;
return (char *)memcpy(new_s, s, len);
}
char *strndup(const char *s, size_t n)
{
if (!s)
return NULL;
char *result;
size_t len = strnlen(s, n);
result = (char *)malloc(sizeof(char) * (len + 1));
if (!result)
return 0;
result[len] = '\0';
return (char *)memcpy(result, s, len);
}
void get_user_mem_size(size_t *max_mem, size_t *cur_mem)
{
int res;
size_t size;
s_mmsize.sz = sizeof(s_mmsize);
s_mmsize.ver = 1;
res = sceLibcMspaceMallocStatsFast(s_mspace, &s_mmsize);
*max_mem += s_mmsize.curSysSz;
*cur_mem += s_mmsize.curSysSz - s_mmsize.curUseSz;
}

View File

@ -1,37 +0,0 @@
#ifndef _USER_MEM_H
#define _USER_MEM_H
#define MEM_SIZE (0xA0000000) /* 2600 MiB */
#define MEM_ALIGN (16UL * 1024)
#if defined(__cplusplus)
extern "C" {
#endif
int malloc_init(void);
int malloc_finalize(void);
char *strdup(const char *s);
char *strndup(const char *s, size_t n);
int asprintf(char **bufp, const char *format, ...);
int vasprintf(char **bufp, const char *format, va_list ap);
void get_user_mem_size(size_t *max_mem, size_t *cur_mem);
#if defined(__cplusplus)
}
#endif
#if defined(__cplusplus)
void *user_new(std::size_t size) throw(std::bad_alloc);
void *user_new(std::size_t size, const std::nothrow_t& x) throw();
void *user_new_array(std::size_t size) throw(std::bad_alloc);
void *user_new_array(std::size_t size, const std::nothrow_t& x) throw();
void user_delete(void *ptr) throw();
void user_delete(void *ptr, const std::nothrow_t& x) throw();
void user_delete_array(void *ptr) throw();
void user_delete_array(void *ptr, const std::nothrow_t& x) throw();
#if (__cplusplus >= 201402L) // C++14
void user_delete(void *ptr, std::size_t size) throw();
void user_delete(void *ptr, std::size_t size, const std::nothrow_t& x) throw();
void user_delete_array(void *ptr, std::size_t size) throw();
void user_delete_array(void *ptr, std::size_t size, const std::nothrow_t& x) throw();
#endif // __cplusplus >= 201402L
#endif // __cplusplus
#endif // _USER_MEM_H

View File

@ -1,175 +0,0 @@
#include <new>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
#include <memory>
#include <algorithm>
#include <sstream>
#include <defines/ps4_defines.h>
#include "user_mem.h"
void *user_new(std::size_t size) throw(std::bad_alloc)
{
void *ptr;
if (size == 0)
size = 1;
while ((ptr = (void *)malloc(size)) == NULL)
{
std::new_handler handler = std::get_new_handler();
if (!handler)
throw std::bad_alloc();
else
(*handler)();
}
return ptr;
}
void *user_new(std::size_t size, const std::nothrow_t& x) throw()
{
void *ptr;
(void)x;
if (size == 0)
size = 1;
while ((ptr = (void *)malloc(size)) == NULL)
{
std::new_handler handler = std::get_new_handler();
if (!handler)
return NULL;
try
{
(*handler)();
}
catch (std::bad_alloc)
{
return NULL;
}
}
return ptr;
}
void *user_new_array(std::size_t size) throw(std::bad_alloc)
{
return user_new(size);
}
void *user_new_array(std::size_t size, const std::nothrow_t& x) throw()
{
return user_new(size, x);
}
void user_delete(void *ptr) throw()
{
if (ptr != NULL)
free(ptr);
}
void user_delete(void *ptr, const std::nothrow_t& x) throw()
{
(void)x;
if (ptr != NULL)
free(ptr);
}
void user_delete_array(void *ptr) throw()
{
user_delete(ptr);
}
void user_delete_array(void *ptr, const std::nothrow_t& x) throw()
{
user_delete(ptr, x);
}
void *operator new(std::size_t size) throw(std::bad_alloc)
{
return user_new(size);
}
void *operator new(std::size_t size, const std::nothrow_t& x) throw()
{
return user_new(size, x);
}
void *operator new[](std::size_t size) throw(std::bad_alloc)
{
return user_new_array(size);
}
void *operator new[](std::size_t size, const std::nothrow_t& x) throw()
{
return user_new_array(size, x);
}
void operator delete(void *ptr) throw()
{
user_delete(ptr);
}
void operator delete(void *ptr, const std::nothrow_t& x) throw()
{
user_delete(ptr, x);
}
void operator delete[](void *ptr) throw()
{
user_delete_array(ptr);
}
void operator delete[](void *ptr, const std::nothrow_t& x) throw()
{
user_delete_array(ptr, x);
}
#if (__cplusplus >= 201402L) // C++14
void user_delete(void *ptr, std::size_t size) throw()
{
(void)size;
if (ptr != NULL)
free(ptr);
}
void user_delete(void *ptr, std::size_t size, const std::nothrow_t& x) throw()
{
(void)x;
if (ptr != NULL)
free(ptr);
}
void user_delete_array(void *ptr, std::size_t size) throw()
{
user_delete(ptr, size);
}
void user_delete_array(void *ptr, std::size_t size, const std::nothrow_t& x) throw()
{
user_delete(ptr, size, x);
}
void operator delete(void *ptr, std::size_t size) throw()
{
user_delete(ptr, size);
}
void operator delete(void *ptr, std::size_t size, const std::nothrow_t& x) throw()
{
user_delete(ptr, size, x);
}
void operator delete[](void *ptr, std::size_t size) throw()
{
user_delete_array(ptr, size);
}
void operator delete[](void *ptr, std::size_t size, const std::nothrow_t& x) throw()
{
user_delete_array(ptr, size, x);
}
#endif // C++14