22#define XELL_FOOTER_OFFSET (256*1024-16)
23#define XELL_FOOTER_LENGTH 16
24#define XELL_FOOTER "xxxxxxxxxxxxxxxx"
30static void xenon_exit(
int status);
31static void *xenon_sbrk(
struct _reent *
ptr, ptrdiff_t incr);
32static int xenon_gettimeofday(
struct _reent *
ptr,
struct timeval *tp,
struct timezone *tz);
33static void xenon_malloc_unlock(
struct _reent *_r);
34static void xenon_malloc_lock(
struct _reent *_r);
38extern void return_to_xell(
unsigned int nand_addr,
unsigned int phy_loading_addr);
58#define RTC_BASE 1005782400UL
60static int xenon_gettimeofday(
struct _reent *
ptr,
struct timeval *tp,
struct timezone *tz) {
61 unsigned char msg[16] = {0x04};
77 tp->tv_sec = (time.t / 1000) +
RTC_BASE;
78 tp->tv_usec = (time.t % 1000) * 1000;
83static void *xenon_sbrk(
struct _reent *
ptr, ptrdiff_t incr) {
104static void xenon_exit(
int status) {
115 sprintf(s,
"[Exit] with code %d\n",
status);
118 for (i = 0; i < 6; ++i) {
120 sprintf(s,
"Thread %d is still running !\n", i);
129 sprintf(s,
"Can't reload Xell, looping...");
132 sprintf(s,
"Reloading Xell...");
140 sprintf(s,
"Failed to load Xell, rebooting in 10 seconds...");
150static unsigned int __attribute__((aligned(128))) malloc_spinlock = 0;
151static
unsigned int __attribute__((aligned(128))) safety_spinlock = 0;
152static volatile
int lockcount = 0;
153static volatile
unsigned int lockowner = -1;
155static
void xenon_malloc_lock(struct _reent *_r) {
156 lock(&safety_spinlock);
159 unsigned int llo=lockowner;
166 if (llc == 0 || llo != pir_)
168 lock(&malloc_spinlock);
170 lock(&safety_spinlock);
179 lock(&safety_spinlock);
187static void xenon_malloc_unlock(
struct _reent *_r) {
188 lock(&safety_spinlock);
191 unsigned int llo=lockowner;
void lock(unsigned int *lock)
void unlock(unsigned int *lock)
void data_breakpoint(void *address, int on_read, int on_write)
unsigned int __mf_uintptr_t __attribute__((__mode__(__pointer__)))
void(* malloc_lock)(struct _reent *ptr)
void(* malloc_unlock)(struct _reent *ptr)
int xenon_is_thread_task_running(int thread)
void xenon_set_single_thread_mode()
void xenon_smc_send_message(const unsigned char *msg)
void xenon_smc_power_reboot(void)
int xenon_smc_receive_response(unsigned char *msg)
void return_to_xell(unsigned int nand_addr, unsigned int phy_loading_addr)
#define XELL_FOOTER_LENGTH
void try_return_to_xell(unsigned int nand_addr, unsigned int phy_loading_addr)
ssize_t vfs_console_write(struct _reent *r, int fd, const char *src, size_t len)
#define XELL_FOOTER_OFFSET
uint8_t u8
8bit unsigned integer