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