diff options
author | Hans-Peter Nilsson <hp@axis.com> | 2009-01-03 18:37:31 +0000 |
---|---|---|
committer | Hans-Peter Nilsson <hp@axis.com> | 2009-01-03 18:37:31 +0000 |
commit | e7fcaaa45eae79db8de22bf7b07bad159de9c3c6 (patch) | |
tree | 5c9bde30aa19bc53ee11408d30936c7c6f94a60d /sim | |
parent | e1c37eb57ebf5a431a508918321a1f07fc3025ac (diff) | |
download | binutils-gdb-e7fcaaa45eae79db8de22bf7b07bad159de9c3c6.tar.gz |
* cris/traps.c (TARGET_SYS_access, TARGET_R_OK, TARGET_W_OK)
(TARGET_X_OK, TARGET_F_OK): Define.
(cris_break_13_handler) <case TARGET_SYS_access>: New case.
Diffstat (limited to 'sim')
-rw-r--r-- | sim/ChangeLog | 4 | ||||
-rw-r--r-- | sim/cris/traps.c | 57 |
2 files changed, 61 insertions, 0 deletions
diff --git a/sim/ChangeLog b/sim/ChangeLog index 0e777db7775..90cc95f6b74 100644 --- a/sim/ChangeLog +++ b/sim/ChangeLog @@ -1,5 +1,9 @@ 2009-01-03 Hans-Peter Nilsson <hp@axis.com> + * cris/traps.c (TARGET_SYS_access, TARGET_R_OK, TARGET_W_OK) + (TARGET_X_OK, TARGET_F_OK): Define. + (cris_break_13_handler) <case TARGET_SYS_access>: New case. + * cris/semcrisv32f-switch.c: Regenerate. 2008-12-30 Hans-Peter Nilsson <hp@axis.com> diff --git a/sim/cris/traps.c b/sim/cris/traps.c index 044d6c67ad7..afe5bfb12a3 100644 --- a/sim/cris/traps.c +++ b/sim/cris/traps.c @@ -65,6 +65,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #define TARGET_SYS_time 13 #define TARGET_SYS_lseek 19 #define TARGET_SYS_getpid 20 +#define TARGET_SYS_access 33 #define TARGET_SYS_kill 37 #define TARGET_SYS_rename 38 #define TARGET_SYS_pipe 42 @@ -244,6 +245,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* From linux/limits.h. */ #define TARGET_PIPE_BUF 4096 +/* From unistd.h. */ +#define TARGET_R_OK 4 +#define TARGET_W_OK 2 +#define TARGET_X_OK 1 +#define TARGET_F_OK 0 + static const char stat_map[] = "st_dev,2:space,10:space,4:st_mode,4:st_nlink,4:st_uid,4" ":st_gid,4:st_rdev,2:space,10:st_size,8:st_blksize,4:st_blocks,4" @@ -2648,6 +2655,56 @@ cris_break_13_handler (SIM_CPU *current_cpu, USI callnum, USI arg1, break; } + case TARGET_SYS_access: + { + SI path = arg1; + SI mode = arg2; + char *pbuf = xmalloc (SIM_PATHMAX); + int i; + int o = 0; + int hmode = 0; + + if (sim_core_read_unaligned_1 (current_cpu, pc, 0, path) == '/') + { + strcpy (pbuf, simulator_sysroot); + o += strlen (simulator_sysroot); + } + + for (i = 0; i + o < SIM_PATHMAX; i++) + { + pbuf[i + o] + = sim_core_read_unaligned_1 (current_cpu, pc, 0, path + i); + if (pbuf[i + o] == 0) + break; + } + + if (i + o == SIM_PATHMAX) + { + retval = -cb_host_to_target_errno (cb, ENAMETOOLONG); + break; + } + + /* Assert that we don't get calls for files for which we + don't have support. */ + if (strncmp (pbuf + strlen (simulator_sysroot), + "/proc/", 6) == 0) + abort (); +#define X_AFLAG(x) if (mode & TARGET_ ## x) hmode |= x + X_AFLAG (R_OK); + X_AFLAG (W_OK); + X_AFLAG (X_OK); + X_AFLAG (F_OK); +#undef X_AFLAG + + if (access (pbuf, hmode) != 0) + retval = -cb_host_to_target_errno (cb, errno); + else + retval = 0; + + free (pbuf); + break; + } + case TARGET_SYS_readlink: { SI path = arg1; |