diff options
author | Mike Frysinger <vapier@gentoo.org> | 2015-04-21 02:30:21 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2015-04-21 03:10:16 -0400 |
commit | 767e68f1b93be396e0cf1296a11584dd725b9569 (patch) | |
tree | 70b6bc3952f2368fd0b582e8fe72a4b799348603 /sim/mcore | |
parent | 248d23e82bc9430cdb6424a5b6b48999cf4001db (diff) | |
download | gdb-767e68f1b93be396e0cf1296a11584dd725b9569.zip gdb-767e68f1b93be396e0cf1296a11584dd725b9569.tar.gz gdb-767e68f1b93be396e0cf1296a11584dd725b9569.tar.bz2 |
sim: mcore: switch to common syscall handling
Now that libgloss has a header tracking the syscalls for this arch, we
can update the database to include it for the symbolic constants/maps.
Then we can switch the mcore syscall callbacks over to the common ones.
Diffstat (limited to 'sim/mcore')
-rw-r--r-- | sim/mcore/ChangeLog | 7 | ||||
-rw-r--r-- | sim/mcore/Makefile.in | 3 | ||||
-rw-r--r-- | sim/mcore/interp.c | 167 |
3 files changed, 37 insertions, 140 deletions
diff --git a/sim/mcore/ChangeLog b/sim/mcore/ChangeLog index 915cc28..6f49fec 100644 --- a/sim/mcore/ChangeLog +++ b/sim/mcore/ChangeLog @@ -1,3 +1,10 @@ +2015-04-21 Mike Frysinger <vapier@gentoo.org> + + * Makefile.in (NL_TARGET): Define. + * interp.c (NUM_ELEM, opened, log_open, log_close, is_opened): Delete. + (syscall_read_mem, syscall_write_mem): New functions. + (handle_trap1): Delete entire body. Replace with call to cb_syscall. + 2015-04-18 Mike Frysinger <vapier@gentoo.org> * sim-main.h (SIM_CPU): Delete. diff --git a/sim/mcore/Makefile.in b/sim/mcore/Makefile.in index 407b600..1b697cd 100644 --- a/sim/mcore/Makefile.in +++ b/sim/mcore/Makefile.in @@ -15,6 +15,9 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. +# This selects the bfin newlib/libgloss syscall definitions. +NL_TARGET = -DNL_TARGET_mcore + ## COMMON_PRE_CONFIG_FRAG SIM_OBJS = \ diff --git a/sim/mcore/interp.c b/sim/mcore/interp.c index 54d628c..b7810d2 100644 --- a/sim/mcore/interp.c +++ b/sim/mcore/interp.c @@ -33,10 +33,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "sim-base.h" #include "sim-options.h" -#ifndef NUM_ELEM -#define NUM_ELEM(A) (sizeof (A) / sizeof (A)[0]) -#endif - #define target_big_endian (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN) @@ -430,158 +426,49 @@ set_initial_gprs (SIM_CPU *scpu) cpu.gr[PARM4] = cpu.gr[0]; } -/* Functions so that trapped open/close don't interfere with the - parent's functions. We say that we can't close the descriptors - that we didn't open. exit() and cleanup() get in trouble here, - to some extent. That's the price of emulation. */ +/* Read/write functions for system call interface. */ -unsigned char opened[100]; - -static void -log_open (int fd) -{ - if (fd < 0 || fd > NUM_ELEM (opened)) - return; - - opened[fd] = 1; -} - -static void -log_close (int fd) +static int +syscall_read_mem (host_callback *cb, struct cb_syscall *sc, + unsigned long taddr, char *buf, int bytes) { - if (fd < 0 || fd > NUM_ELEM (opened)) - return; - - opened[fd] = 0; + memcpy (buf, cpu.mem + taddr, bytes); + return bytes; } static int -is_opened (int fd) +syscall_write_mem (host_callback *cb, struct cb_syscall *sc, + unsigned long taddr, const char *buf, int bytes) { - if (fd < 0 || fd > NUM_ELEM (opened)) - return 0; - - return opened[fd]; + memcpy (cpu.mem + taddr, buf, bytes); + return bytes; } +/* Simulate a monitor trap. */ + static void handle_trap1 (SIM_DESC sd) { - unsigned long a[3]; - host_callback *callback = STATE_CALLBACK (sd); - - switch ((unsigned long) (cpu.gr [TRAPCODE])) - { - case 3: - a[0] = (unsigned long) (cpu.gr[PARM1]); - a[1] = (unsigned long) (cpu.mem + cpu.gr[PARM2]); - a[2] = (unsigned long) (cpu.gr[PARM3]); - cpu.gr[RET1] = callback->read (callback, a[0], (char *) a[1], a[2]); - break; - - case 4: - a[0] = (unsigned long) (cpu.gr[PARM1]); - a[1] = (unsigned long) (cpu.mem + cpu.gr[PARM2]); - a[2] = (unsigned long) (cpu.gr[PARM3]); - cpu.gr[RET1] = (int)callback->write (callback, a[0], (char *) a[1], a[2]); - break; - - case 5: - a[0] = (unsigned long) (cpu.mem + cpu.gr[PARM1]); - a[1] = (unsigned long) (cpu.gr[PARM2]); - /* a[2] = (unsigned long) (cpu.gr[PARM3]); */ - cpu.gr[RET1] = callback->open (callback, (char *) a[0], a[1]); - log_open (cpu.gr[RET1]); - break; - - case 6: - a[0] = (unsigned long) (cpu.gr[PARM1]); - /* Watch out for debugger's files. */ - if (is_opened (a[0])) - { - log_close (a[0]); - cpu.gr[RET1] = callback->close (callback, a[0]); - } - else - { - /* Don't let him close it. */ - cpu.gr[RET1] = (-1); - } - break; + host_callback *cb = STATE_CALLBACK (sd); + CB_SYSCALL sc; - case 9: - a[0] = (unsigned long) (cpu.mem + cpu.gr[PARM1]); - a[1] = (unsigned long) (cpu.mem + cpu.gr[PARM2]); - cpu.gr[RET1] = link ((char *) a[0], (char *) a[1]); - break; + CB_SYSCALL_INIT (&sc); - case 10: - a[0] = (unsigned long) (cpu.mem + cpu.gr[PARM1]); - cpu.gr[RET1] = callback->unlink (callback, (char *) a[0]); - break; + sc.func = cpu.gr[TRAPCODE]; + sc.arg1 = cpu.gr[PARM1]; + sc.arg2 = cpu.gr[PARM2]; + sc.arg3 = cpu.gr[PARM3]; + sc.arg4 = cpu.gr[PARM4]; - case 13: - /* handle time(0) vs time(&var) */ - a[0] = (unsigned long) (cpu.gr[PARM1]); - if (a[0]) - a[0] += (unsigned long) cpu.mem; - cpu.gr[RET1] = callback->time (callback, (time_t *) a[0]); - break; + sc.p1 = (PTR) sd; + sc.p2 = (PTR) STATE_CPU (sd, 0); + sc.read_mem = syscall_read_mem; + sc.write_mem = syscall_write_mem; - case 19: - a[0] = (unsigned long) (cpu.gr[PARM1]); - a[1] = (unsigned long) (cpu.gr[PARM2]); - a[2] = (unsigned long) (cpu.gr[PARM3]); - cpu.gr[RET1] = callback->lseek (callback, a[0], a[1], a[2]); - break; - - case 33: - a[0] = (unsigned long) (cpu.mem + cpu.gr[PARM1]); - a[1] = (unsigned long) (cpu.gr[PARM2]); - cpu.gr[RET1] = access ((char *) a[0], a[1]); - break; - - case 43: - a[0] = (unsigned long) (cpu.mem + cpu.gr[PARM1]); -#if 0 - cpu.gr[RET1] = times ((char *)a[0]); -#else - { - /* Give him simulated cycles for utime - and an instruction count for stime. */ - struct tms - { - time_t tms_utime; - time_t tms_stime; - time_t tms_cutime; - time_t tms_cstime; - } t; + cb_syscall (cb, &sc); - t.tms_utime = cpu.asregs.cycles; - t.tms_stime = cpu.asregs.insts; - t.tms_cutime = t.tms_utime; - t.tms_cstime = t.tms_stime; - - memcpy ((struct tms *)(a[0]), &t, sizeof (t)); - - cpu.gr[RET1] = cpu.asregs.cycles; - } -#endif - break; - - case 69: - /* Historically this was sbrk(), but no one used it, and the - implementation didn't actually work, so it's a stub now. */ - a[0] = (unsigned long) (cpu.gr[PARM1]); - cpu.gr[RET1] = -1; - break; - - default: - if (issue_messages) - fprintf (stderr, "WARNING: sys call %d unimplemented\n", - cpu.gr[TRAPCODE]); - break; - } + /* XXX: We don't pass back the actual errno value. */ + cpu.gr[RET1] = sc.result; } static void |