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