Home | History | Annotate | Download | only in stubs
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <stdint.h>
      4 
      5 // --------------
      6 // Register Usage
      7 // --------------
      8 // $0       zero
      9 // $1       at
     10 // $2-$3    function return value registers
     11 // $4-$7    function argument registers
     12 // $8-$15   temporary
     13 // $16-$23  saved register
     14 // $24-$25  temporary
     15 // $26-$27  os kernel
     16 // $28      global pointer
     17 // $29      stack pointer
     18 // $30      saved register
     19 // $31      return addres reigster
     20 
     21 // --------------------
     22 // Instruction Encoding
     23 // --------------------
     24 // lui: 0011 1100 000t tttt iiii iiii iiii iiii
     25 // ori: 0011 01ss ssst tttt iiii iiii iiii iiii
     26 // jr:  0000 00ss sss0 0000 0000 0000 0000 1000
     27 // nop:  0000 0000 0000 0000 0000 0000 0000 0000
     28 
     29 uint32_t stub[] = {
     30   0x3c190000ul,
     31   0x37390000ul,
     32   0x03200008ul,
     33   0x00000000ul
     34 };
     35 
     36 int test() {
     37   printf("hello world!\n");
     38   return 5;
     39 }
     40 
     41 int main() {
     42   int (*f)() = (int (*)())stub;
     43   stub[0] |= (((uint32_t)(uintptr_t)test) >> 16) & 0xffff;
     44   stub[1] |= (((uint32_t)(uintptr_t)test)) & 0xffff;
     45 
     46   printf("return = %d\n", f());
     47   return EXIT_SUCCESS;
     48 }
     49