mirror of https://github.com/m-labs/artiq.git
100 lines
2.8 KiB
C
100 lines
2.8 KiB
C
#include <string.h>
|
|
|
|
#include "elf_loader.h"
|
|
#include "comm.h"
|
|
#include "gpio.h"
|
|
#include "rtio.h"
|
|
#include "dds.h"
|
|
#include "exceptions.h"
|
|
#include "services.h"
|
|
|
|
static const struct symbol syscalls[] = {
|
|
{"rpc", comm_rpc},
|
|
{"gpio_set", gpio_set},
|
|
{"rtio_oe", rtio_oe},
|
|
{"rtio_set", rtio_set},
|
|
{"rtio_replace", rtio_replace},
|
|
{"rtio_sync", rtio_sync},
|
|
{"rtio_get_counter", rtio_get_counter},
|
|
{"rtio_get", rtio_get},
|
|
{"rtio_pileup_count", rtio_pileup_count},
|
|
{"dds_phase_clear_en", dds_phase_clear_en},
|
|
{"dds_program", dds_program},
|
|
{NULL, NULL}
|
|
};
|
|
|
|
static const struct symbol eh[] = {
|
|
{"setjmp", exception_setjmp},
|
|
{"push", exception_push},
|
|
{"pop", exception_pop},
|
|
{"getid", exception_getid},
|
|
{"raise", exception_raise},
|
|
{NULL, NULL}
|
|
};
|
|
|
|
#pragma GCC diagnostic push
|
|
#pragma GCC diagnostic ignored "-Wimplicit-int"
|
|
extern __divsi3, __modsi3, __ledf2, __gedf2, __unorddf2, __eqdf2, __ltdf2,
|
|
__nedf2, __gtdf2, __negsf2, __negdf2, __addsf3, __subsf3, __mulsf3,
|
|
__divsf3, __lshrdi3, __muldi3, __divdi3, __ashldi3, __ashrdi3,
|
|
__udivmoddi4, __floatsisf, __floatunsisf, __fixsfsi, __fixunssfsi,
|
|
__adddf3, __subdf3, __muldf3, __divdf3, __floatsidf, __floatunsidf,
|
|
__floatdidf, __fixdfsi, __fixunsdfsi, __clzsi2, __ctzsi2, __udivdi3,
|
|
__umoddi3, __moddi3;
|
|
#pragma GCC diagnostic pop
|
|
|
|
static const struct symbol compiler_rt[] = {
|
|
{"divsi3", &__divsi3},
|
|
{"modsi3", &__modsi3},
|
|
{"ledf2", &__ledf2},
|
|
{"gedf2", &__gedf2},
|
|
{"unorddf2", &__unorddf2},
|
|
{"eqdf2", &__eqdf2},
|
|
{"ltdf2", &__ltdf2},
|
|
{"nedf2", &__nedf2},
|
|
{"gtdf2", &__gtdf2},
|
|
{"negsf2", &__negsf2},
|
|
{"negdf2", &__negdf2},
|
|
{"addsf3", &__addsf3},
|
|
{"subsf3", &__subsf3},
|
|
{"mulsf3", &__mulsf3},
|
|
{"divsf3", &__divsf3},
|
|
{"lshrdi3", &__lshrdi3},
|
|
{"muldi3", &__muldi3},
|
|
{"divdi3", &__divdi3},
|
|
{"ashldi3", &__ashldi3},
|
|
{"ashrdi3", &__ashrdi3},
|
|
{"udivmoddi4", &__udivmoddi4},
|
|
{"floatsisf", &__floatsisf},
|
|
{"floatunsisf", &__floatunsisf},
|
|
{"fixsfsi", &__fixsfsi},
|
|
{"fixunssfsi", &__fixunssfsi},
|
|
{"adddf3", &__adddf3},
|
|
{"subdf3", &__subdf3},
|
|
{"muldf3", &__muldf3},
|
|
{"divdf3", &__divdf3},
|
|
{"floatsidf", &__floatsidf},
|
|
{"floatunsidf", &__floatunsidf},
|
|
{"floatdidf", &__floatdidf},
|
|
{"fixdfsi", &__fixdfsi},
|
|
{"fixunsdfsi", &__fixunsdfsi},
|
|
{"clzsi2", &__clzsi2},
|
|
{"ctzsi2", &__ctzsi2},
|
|
{"udivdi3", &__udivdi3},
|
|
{"umoddi3", &__umoddi3},
|
|
{"moddi3", &__moddi3},
|
|
{NULL, NULL}
|
|
};
|
|
|
|
void *resolve_service_symbol(const char *name)
|
|
{
|
|
if(strncmp(name, "__", 2) != 0)
|
|
return NULL;
|
|
name += 2;
|
|
if(strncmp(name, "syscall_", 8) == 0)
|
|
return find_symbol(syscalls, name + 8);
|
|
if(strncmp(name, "eh_", 3) == 0)
|
|
return find_symbol(eh, name + 3);
|
|
return find_symbol(compiler_rt, name);
|
|
}
|