summaryrefslogtreecommitdiff
path: root/driver/linkloader/tests/stubs/mips-stub.c
blob: ff34d03b029527889ac0d67ecec6ecbc1c1fb619 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

// --------------
// Register Usage
// --------------
// $0       zero
// $1       at
// $2-$3    function return value registers
// $4-$7    function argument registers
// $8-$15   temporary
// $16-$23  saved register
// $24-$25  temporary
// $26-$27  os kernel
// $28      global pointer
// $29      stack pointer
// $30      saved register
// $31      return addres reigster

// --------------------
// Instruction Encoding
// --------------------
// lui: 0011 1100 000t tttt iiii iiii iiii iiii
// ori: 0011 01ss ssst tttt iiii iiii iiii iiii
// jr:  0000 00ss sss0 0000 0000 0000 0000 1000
// nop:  0000 0000 0000 0000 0000 0000 0000 0000

uint32_t stub[] = {
  0x3c190000ul,
  0x37390000ul,
  0x03200008ul,
  0x00000000ul
};

int test() {
  printf("hello world!\n");
  return 5;
}

int main() {
  int (*f)() = (int (*)())stub;
  stub[0] |= (((uint32_t)(uintptr_t)test) >> 16) & 0xffff;
  stub[1] |= (((uint32_t)(uintptr_t)test)) & 0xffff;

  printf("return = %d\n", f());
  return EXIT_SUCCESS;
}