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