forked from len0rd/rockbox
load_code: Get rid of win32 specific code in favor SDL_LoadFunction & friends APIs.
Refactor native/hosted implementation seperation while at it (no wrappers starting with _ anymore). Change-Id: If68ae89700443bb3be483c1cace3d6739409560a
This commit is contained in:
parent
3f72ba0e3f
commit
3f365fc06b
5 changed files with 90 additions and 134 deletions
|
@ -7,7 +7,6 @@ backlight.c
|
||||||
buflib.c
|
buflib.c
|
||||||
core_alloc.c
|
core_alloc.c
|
||||||
general.c
|
general.c
|
||||||
load_code.c
|
|
||||||
powermgmt.c
|
powermgmt.c
|
||||||
#if (CONFIG_PLATFORM & PLATFORM_HOSTED)
|
#if (CONFIG_PLATFORM & PLATFORM_HOSTED)
|
||||||
|
|
||||||
|
@ -32,6 +31,7 @@ logf.c
|
||||||
#endif /* ROCKBOX_HAS_LOGF */
|
#endif /* ROCKBOX_HAS_LOGF */
|
||||||
kernel.c
|
kernel.c
|
||||||
#if (CONFIG_PLATFORM & PLATFORM_NATIVE)
|
#if (CONFIG_PLATFORM & PLATFORM_NATIVE)
|
||||||
|
load_code.c
|
||||||
#ifdef RB_PROFILE
|
#ifdef RB_PROFILE
|
||||||
profile.c
|
profile.c
|
||||||
#endif /* RB_PROFILE */
|
#endif /* RB_PROFILE */
|
||||||
|
|
|
@ -25,10 +25,11 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
extern void *lc_open(const char *filename, unsigned char *buf, size_t buf_size);
|
||||||
|
|
||||||
#if (CONFIG_PLATFORM & PLATFORM_NATIVE)
|
#if (CONFIG_PLATFORM & PLATFORM_NATIVE)
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
|
||||||
extern void *lc_open(const char *filename, unsigned char *buf, size_t buf_size);
|
|
||||||
/* header is always at the beginning of the blob, and handle actually points
|
/* header is always at the beginning of the blob, and handle actually points
|
||||||
* to the start of the blob (the header is there) */
|
* to the start of the blob (the header is there) */
|
||||||
static inline void *lc_open_from_mem(void* addr, size_t blob_size)
|
static inline void *lc_open_from_mem(void* addr, size_t blob_size)
|
||||||
|
@ -44,23 +45,10 @@ static inline void lc_close(void *handle) { (void)handle; }
|
||||||
|
|
||||||
#elif (CONFIG_PLATFORM & PLATFORM_HOSTED)
|
#elif (CONFIG_PLATFORM & PLATFORM_HOSTED)
|
||||||
|
|
||||||
/* don't call these directly for loading code
|
extern void *lc_open_from_mem(void* addr, size_t blob_size);
|
||||||
* they're to be wrapped by platform specific functions */
|
|
||||||
#ifdef WIN32
|
|
||||||
/* windows' LoadLibrary can only handle ucs2, no utf-8 */
|
|
||||||
#define _lc_open_char wchar_t
|
|
||||||
#else
|
|
||||||
#define _lc_open_char char
|
|
||||||
#endif
|
|
||||||
extern void *_lc_open(const _lc_open_char *filename, unsigned char *buf, size_t buf_size);
|
|
||||||
extern void *_lc_get_header(void *handle);
|
|
||||||
extern void _lc_close(void *handle);
|
|
||||||
|
|
||||||
extern void *lc_open(const char *filename, unsigned char *buf, size_t buf_size);
|
|
||||||
extern void *lc_open_from_mem(void *addr, size_t blob_size);
|
|
||||||
extern void *lc_get_header(void *handle);
|
extern void *lc_get_header(void *handle);
|
||||||
extern void lc_close(void *handle);
|
extern void lc_close(void *handle);
|
||||||
extern const char* lc_last_error(void);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* this struct needs to be the first part of other headers
|
/* this struct needs to be the first part of other headers
|
||||||
|
|
|
@ -25,8 +25,6 @@
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "load_code.h"
|
#include "load_code.h"
|
||||||
|
|
||||||
#if (CONFIG_PLATFORM & PLATFORM_NATIVE)
|
|
||||||
|
|
||||||
/* load binary blob from disk to memory, returning a handle */
|
/* load binary blob from disk to memory, returning a handle */
|
||||||
void * lc_open(const char *filename, unsigned char *buf, size_t buf_size)
|
void * lc_open(const char *filename, unsigned char *buf, size_t buf_size)
|
||||||
{
|
{
|
||||||
|
@ -97,105 +95,3 @@ error_fd:
|
||||||
error:
|
error:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif (CONFIG_PLATFORM & PLATFORM_HOSTED)
|
|
||||||
/* libdl wrappers */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
/* win32 */
|
|
||||||
#include <windows.h>
|
|
||||||
#define dlopen(_x_, _y_) LoadLibraryW(_x_)
|
|
||||||
#define dlsym(_x_, _y_) (void *)GetProcAddress(_x_, _y_)
|
|
||||||
#define dlclose(_x_) FreeLibrary(_x_)
|
|
||||||
static inline char *_dlerror(void)
|
|
||||||
{
|
|
||||||
static char err_buf[64];
|
|
||||||
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), 0,
|
|
||||||
err_buf, sizeof(err_buf), NULL);
|
|
||||||
return err_buf;
|
|
||||||
}
|
|
||||||
#define dlerror _dlerror
|
|
||||||
#else
|
|
||||||
/* unix */
|
|
||||||
#include <dlfcn.h>
|
|
||||||
#endif
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "rbpaths.h"
|
|
||||||
#include "general.h"
|
|
||||||
|
|
||||||
void * _lc_open(const _lc_open_char *filename, unsigned char *buf, size_t buf_size)
|
|
||||||
{
|
|
||||||
(void)buf;
|
|
||||||
(void)buf_size;
|
|
||||||
return dlopen(filename, RTLD_NOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *lc_open_from_mem(void *addr, size_t blob_size)
|
|
||||||
{
|
|
||||||
#ifndef SIMULATOR
|
|
||||||
(void)addr;
|
|
||||||
(void)blob_size;
|
|
||||||
/* we don't support loading code from memory on application builds,
|
|
||||||
* it doesn't make sense (since it means writing the blob to disk again and
|
|
||||||
* then falling back to load from disk) and requires the ability to write
|
|
||||||
* to an executable directory */
|
|
||||||
return NULL;
|
|
||||||
#else
|
|
||||||
/* support it in the sim for the sake of simulating */
|
|
||||||
int fd, i;
|
|
||||||
char temp_filename[MAX_PATH];
|
|
||||||
|
|
||||||
/* We have to create the dynamic link library file from ram so we
|
|
||||||
can simulate the codec loading. With voice and crossfade,
|
|
||||||
multiple codecs may be loaded at the same time, so we need
|
|
||||||
to find an unused filename */
|
|
||||||
for (i = 0; i < 10; i++)
|
|
||||||
{
|
|
||||||
snprintf(temp_filename, sizeof(temp_filename),
|
|
||||||
ROCKBOX_DIR "/libtemp_binary_%d.dll", i);
|
|
||||||
fd = open(temp_filename, O_WRONLY|O_CREAT|O_TRUNC, 0700);
|
|
||||||
if (fd >= 0)
|
|
||||||
break; /* Created a file ok */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fd < 0)
|
|
||||||
{
|
|
||||||
DEBUGF("open failed\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (write(fd, addr, blob_size) < (ssize_t)blob_size)
|
|
||||||
{
|
|
||||||
DEBUGF("Write failed\n");
|
|
||||||
close(fd);
|
|
||||||
remove(temp_filename);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
close(fd);
|
|
||||||
return lc_open(temp_filename, NULL, 0);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void *_lc_get_header(void *handle)
|
|
||||||
{
|
|
||||||
char *ret = dlsym(handle, "__header");
|
|
||||||
if (ret == NULL)
|
|
||||||
ret = dlsym(handle, "___header");
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _lc_close(void *handle)
|
|
||||||
{
|
|
||||||
if (handle)
|
|
||||||
dlclose(handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *lc_last_error(void)
|
|
||||||
{
|
|
||||||
return dlerror();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -20,24 +20,44 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <string.h> /* size_t */
|
#include <string.h> /* size_t */
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include "debug.h"
|
||||||
#include "load_code.h"
|
#include "load_code.h"
|
||||||
|
|
||||||
/* unix specific because WIN32 wants UCS instead of UTF-8, so filenames
|
|
||||||
* need to be converted */
|
|
||||||
|
|
||||||
/* plain wrappers , nothing to do */
|
|
||||||
void *lc_open(const char *filename, unsigned char *buf, size_t buf_size)
|
void *lc_open(const char *filename, unsigned char *buf, size_t buf_size)
|
||||||
{
|
{
|
||||||
return _lc_open(filename, buf, buf_size);
|
(void)buf;
|
||||||
|
(void)buf_size;
|
||||||
|
void *handle = dlopen(filename, RTLD_NOW);
|
||||||
|
if (handle == NULL)
|
||||||
|
{
|
||||||
|
DEBUGF("failed to load %s\n", filename);
|
||||||
|
DEBUGF("lc_open(%s): %s\n", filename, dlerror());
|
||||||
|
}
|
||||||
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *lc_get_header(void *handle)
|
void *lc_get_header(void *handle)
|
||||||
{
|
{
|
||||||
return _lc_get_header(handle);
|
char *ret = dlsym(handle, "__header");
|
||||||
|
if (ret == NULL)
|
||||||
|
ret = dlsym(handle, "___header");
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lc_close(void *handle)
|
void lc_close(void *handle)
|
||||||
{
|
{
|
||||||
_lc_close(handle);
|
dlclose(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *lc_open_from_mem(void *addr, size_t blob_size)
|
||||||
|
{
|
||||||
|
(void)addr;
|
||||||
|
(void)blob_size;
|
||||||
|
/* we don't support loading code from memory on application builds,
|
||||||
|
* it doesn't make sense (since it means writing the blob to disk again and
|
||||||
|
* then falling back to load from disk) and requires the ability to write
|
||||||
|
* to an executable directory */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
|
@ -584,27 +584,79 @@ int sim_fsync(int fd)
|
||||||
|
|
||||||
#ifndef __PCTOOL__
|
#ifndef __PCTOOL__
|
||||||
|
|
||||||
|
#include <SDL_loadso.h>
|
||||||
void *lc_open(const char *filename, unsigned char *buf, size_t buf_size)
|
void *lc_open(const char *filename, unsigned char *buf, size_t buf_size)
|
||||||
{
|
{
|
||||||
const char *sim_path = get_sim_pathname(filename);
|
(void)buf;
|
||||||
void *handle = _lc_open(UTF8_TO_OS(sim_path), buf, buf_size);
|
(void)buf_size;
|
||||||
|
void *handle = SDL_LoadObject(get_sim_pathname(filename));
|
||||||
if (handle == NULL)
|
if (handle == NULL)
|
||||||
{
|
{
|
||||||
DEBUGF("failed to load %s\n", filename);
|
DEBUGF("failed to load %s\n", filename);
|
||||||
DEBUGF("lc_open(%s): %s\n", filename, lc_last_error());
|
DEBUGF("lc_open(%s): %s\n", filename, SDL_GetError());
|
||||||
}
|
}
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *lc_get_header(void *handle)
|
void *lc_get_header(void *handle)
|
||||||
{
|
{
|
||||||
return _lc_get_header(handle);
|
char *ret = SDL_LoadFunction(handle, "__header");
|
||||||
|
if (ret == NULL)
|
||||||
|
ret = SDL_LoadFunction(handle, "___header");
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lc_close(void *handle)
|
void lc_close(void *handle)
|
||||||
{
|
{
|
||||||
_lc_close(handle);
|
SDL_UnloadObject(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *lc_open_from_mem(void *addr, size_t blob_size)
|
||||||
|
{
|
||||||
|
#ifndef SIMULATOR
|
||||||
|
(void)addr;
|
||||||
|
(void)blob_size;
|
||||||
|
/* we don't support loading code from memory on application builds,
|
||||||
|
* it doesn't make sense (since it means writing the blob to disk again and
|
||||||
|
* then falling back to load from disk) and requires the ability to write
|
||||||
|
* to an executable directory */
|
||||||
|
return NULL;
|
||||||
|
#else
|
||||||
|
/* support it in the sim for the sake of simulating */
|
||||||
|
int fd, i;
|
||||||
|
char temp_filename[MAX_PATH];
|
||||||
|
|
||||||
|
/* We have to create the dynamic link library file from ram so we
|
||||||
|
can simulate the codec loading. With voice and crossfade,
|
||||||
|
multiple codecs may be loaded at the same time, so we need
|
||||||
|
to find an unused filename */
|
||||||
|
for (i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
snprintf(temp_filename, sizeof(temp_filename),
|
||||||
|
ROCKBOX_DIR "/libtemp_binary_%d.dll", i);
|
||||||
|
fd = open(temp_filename, O_WRONLY|O_CREAT|O_TRUNC, 0700);
|
||||||
|
if (fd >= 0)
|
||||||
|
break; /* Created a file ok */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fd < 0)
|
||||||
|
{
|
||||||
|
DEBUGF("open failed\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (write(fd, addr, blob_size) < (ssize_t)blob_size)
|
||||||
|
{
|
||||||
|
DEBUGF("Write failed\n");
|
||||||
|
close(fd);
|
||||||
|
remove(temp_filename);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return lc_open(temp_filename, NULL, 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __PCTOOL__ */
|
#endif /* __PCTOOL__ */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue