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