main.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include <stdint.h>
  2. #include <stddef.h>
  3. #include <stdlib.h>
  4. #include <syscall.h>
  5. #include <syscall_nums.h>
  6. DEFN_SYSCALL1(exit, 0, int);
  7. DEFN_SYSCALL1(print, 1, const char *);
  8. DEFN_SYSCALL2(gettimeofday, 6, void *, void *);
  9. DEFN_SYSCALL3(execve, 7, char *, char **, char **);
  10. DEFN_SYSCALL1(sbrk, 10, int);
  11. DEFN_SYSCALL0(getgraphicsaddress, 11);
  12. DEFN_SYSCALL1(setgraphicsoffset, 16, int);
  13. DEFN_SYSCALL1(wait, 17, unsigned int);
  14. DEFN_SYSCALL0(getgraphicswidth, 18);
  15. DEFN_SYSCALL0(getgraphicsheight, 19);
  16. DEFN_SYSCALL0(getgraphicsdepth, 20);
  17. DEFN_SYSCALL0(mkpipe, 21);
  18. DEFN_SYSCALL1(kernel_string_XXX, 25, char *);
  19. DEFN_SYSCALL0(reboot, 26);
  20. DEFN_SYSCALL3(readdir, 27, int, int, void *);
  21. DEFN_SYSCALL3(clone, 30, uintptr_t, uintptr_t, void *);
  22. DEFN_SYSCALL0(mousedevice, 33);
  23. DEFN_SYSCALL2(mkdir, 34, char *, unsigned int);
  24. DEFN_SYSCALL2(shm_obtain, 35, char *, size_t *);
  25. DEFN_SYSCALL1(shm_release, 36, char *);
  26. DEFN_SYSCALL2(share_fd, 39, int, int);
  27. DEFN_SYSCALL1(get_fd, 40, int);
  28. DEFN_SYSCALL0(gettid, 41);
  29. DEFN_SYSCALL2(system_function, 43, int, char **);
  30. DEFN_SYSCALL1(open_serial, 44, int);
  31. DEFN_SYSCALL2(sleepabs, 45, unsigned long, unsigned long);
  32. DEFN_SYSCALL3(ioctl, 47, int, int, void *);
  33. DEFN_SYSCALL2(access, 48, char *, int);
  34. DEFN_SYSCALL2(stat, 49, char *, void *);
  35. DEFN_SYSCALL3(waitpid, 53, int, int *, int);
  36. DEFN_SYSCALL5(mount, SYS_MOUNT, char *, char *, char *, unsigned long, void *);
  37. DEFN_SYSCALL2(lstat, SYS_LSTAT, char *, void *);
  38. extern void _init();
  39. extern void _fini();
  40. char ** environ = NULL;
  41. int _environ_size = 0;
  42. char * _argv_0 = NULL;
  43. char ** __argv = NULL;
  44. extern char ** __get_argv(void) {
  45. return __argv;
  46. }
  47. extern void __stdio_init_buffers(void);
  48. void _exit(int val){
  49. _fini();
  50. syscall_exit(val);
  51. __builtin_unreachable();
  52. }
  53. __attribute__((constructor))
  54. static void _libc_init(void) {
  55. __stdio_init_buffers();
  56. unsigned int x = 0;
  57. unsigned int nulls = 0;
  58. for (x = 0; 1; ++x) {
  59. if (!__get_argv()[x]) {
  60. ++nulls;
  61. if (nulls == 2) {
  62. break;
  63. }
  64. continue;
  65. }
  66. if (nulls == 1) {
  67. environ = &__get_argv()[x];
  68. break;
  69. }
  70. }
  71. if (!environ) {
  72. environ = malloc(sizeof(char *) * 4);
  73. environ[0] = NULL;
  74. environ[1] = NULL;
  75. environ[2] = NULL;
  76. environ[3] = NULL;
  77. _environ_size = 4;
  78. } else {
  79. /* Find actual size */
  80. int size = 0;
  81. char ** tmp = environ;
  82. while (*tmp) {
  83. size++;
  84. tmp++;
  85. }
  86. if (size < 4) {
  87. _environ_size = 4;
  88. } else {
  89. /* Multiply by two */
  90. _environ_size = size * 2;
  91. }
  92. char ** new_environ = malloc(sizeof(char*) * _environ_size);
  93. int i = 0;
  94. while (i < _environ_size && environ[i]) {
  95. new_environ[i] = environ[i];
  96. i++;
  97. }
  98. while (i < _environ_size) {
  99. new_environ[i] = NULL;
  100. i++;
  101. }
  102. environ = new_environ;
  103. }
  104. _argv_0 = __get_argv()[0];
  105. }
  106. void pre_main(int (*main)(int,char**), int argc, char * argv[]) {
  107. if (!__get_argv()) {
  108. /* Statically loaded, must set __argv so __get_argv() works */
  109. __argv = argv;
  110. }
  111. _init();
  112. exit(main(argc, argv));
  113. }