00001
00022 #include "sparcv8_syscall.H"
00023
00024 #define writeReg(addr, val) REGS[addr] = (addr)? ac_word(val) : 0
00025 #define readReg(addr) REGS[addr]
00026
00027
00028 using namespace sparcv8_parms;
00029
00030 void sparcv8_syscall::get_buffer(int argn, unsigned char* buf, unsigned int size)
00031 {
00032 unsigned int addr = readReg(8+argn);
00033
00034 for (unsigned int i = 0; i<size; i++, addr++) {
00035 buf[i] = DM.read_byte(addr);
00036 }
00037 }
00038
00039 void sparcv8_syscall::set_buffer(int argn, unsigned char* buf, unsigned int size)
00040 {
00041 unsigned int addr = readReg(8+argn);
00042
00043 for (unsigned int i = 0; i<size; i++, addr++) {
00044 DM.write_byte(addr, buf[i]);
00045 }
00046 }
00047
00048 void sparcv8_syscall::set_buffer_noinvert(int argn, unsigned char* buf, unsigned int size)
00049 {
00050 unsigned int addr = readReg(8+argn);
00051
00052 for (unsigned int i = 0; i<size; i+=4, addr+=4) {
00053 DM.write(addr, *(unsigned int *) &buf[i]);
00054 }
00055 }
00056
00057 int sparcv8_syscall::get_int(int argn)
00058 {
00059 return readReg(8+argn);
00060 }
00061
00062 void sparcv8_syscall::set_int(int argn, int val)
00063 {
00064 writeReg(8+argn, val);
00065 }
00066
00067 void sparcv8_syscall::return_from_syscall()
00068 {
00069
00070 npc = readReg(15) + 8;
00071 ac_pc = npc;
00072 npc += 4;
00073 }
00074
00075 void sparcv8_syscall::set_prog_args(int argc, char **argv)
00076 {
00077 int i, j, base;
00078
00079 unsigned int ac_argv[30];
00080 char ac_argstr[512];
00081
00082 base = AC_RAM_END - 512;
00083 for (i=0, j=0; i<argc; i++) {
00084 int len = strlen(argv[i]) + 1;
00085 ac_argv[i] = base + j;
00086 memcpy(&ac_argstr[j], argv[i], len);
00087 j += len;
00088 }
00089
00090
00091 writeReg(14, AC_RAM_END-512);
00092 set_buffer(6, (unsigned char*) ac_argstr, 512);
00093
00094
00095 writeReg(14, AC_RAM_END-512-120);
00096 set_buffer_noinvert(6, (unsigned char*) ac_argv, 120);
00097
00098
00099 writeReg(8, argc);
00100
00101
00102 writeReg(9, AC_RAM_END-512-120);
00103 }