/***********************************************************************
* make temp syscall by symbol
***********************************************************************/
static void make_sc(int32_t symbol)
{
lv2_poke(CODE, (uint64_t)(0x48000000 | ((symbol - CODE) & 0x3FFFFFC)) <<32); // build b instruction
lv2_poke(ENTRY, CODE);
lv2_poke(SC_TBL + (SC_NR * 8), ENTRY);
sys_timer_usleep(1);
}
/***********************************************************************
* kill temp syscall
***********************************************************************/
static void kill_sc(void)
{
lv2_poke(CODE, 0);
lv2_poke(ENTRY, 0);
lv2_poke(SC_TBL + (SC_NR * 8), 0);
sys_timer_usleep(1);
}
/***********************************************************************
* a example
***********************************************************************/
int32_t lv2_strlen(const char *str)
{
make_sc(0x4D668);
system_call_1(SC_NR, (uint64_t)(uint32_t)str);
int32_t ret = (int32_t)p1;
kill_sc();
return ret;
}