>From 675b9d0127968991b6f177ff34b09385b862e4aa Mon Sep 17 00:00:00 2001 From: Spencer Oliver <ntfr...@users.sourceforge.net> Date: Wed, 27 Jan 2010 21:26:21 +0000 Subject: [PATCH 2/2] ARM semihosting: win32 and cygwin fixes
Cygwin would fail to reopen a previously written file if the mode is not given. Simplified converting the open flags and made sure the win32 O_BINARY bit is set. Added define for systems that do not support O_BINARY. Signed-off-by: Spencer Oliver <ntfr...@users.sourceforge.net> --- src/helper/replacements.h | 6 ++++++ src/target/arm_semihosting.c | 36 +++++++++++++++++++++--------------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/helper/replacements.h b/src/helper/replacements.h index 2b3ea73..3598dd9 100644 --- a/src/helper/replacements.h +++ b/src/helper/replacements.h @@ -40,6 +40,12 @@ #define ENOTSUP 134 /* Not supported */ #endif +/* for systems that do not support O_BINARY + * linux being one of them */ +#ifndef O_BINARY +#define O_BINARY 0 +#endif + #ifndef HAVE_SYS_TIME_H #ifndef _TIMEVAL_DEFINED diff --git a/src/target/arm_semihosting.c b/src/target/arm_semihosting.c index 1d0acd6..be90702 100644 --- a/src/target/arm_semihosting.c +++ b/src/target/arm_semihosting.c @@ -2,6 +2,9 @@ * Copyright (C) 2009 by Marvell Technology Group Ltd. * * Written by Nicolas Pitre <n...@marvell.com> * * * + * Copyright (C) 2010 by Spencer Oliver * + * s...@spen-soft.co.uk * + * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * @@ -41,6 +44,20 @@ #include <helper/binarybuffer.h> #include <helper/log.h> +static int open_modeflags[12] = { + O_RDONLY, + O_RDONLY | O_BINARY, + O_RDWR, + O_RDWR | O_BINARY, + O_WRONLY | O_CREAT | O_TRUNC, + O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, + O_RDWR | O_CREAT | O_TRUNC, + O_RDWR | O_CREAT | O_TRUNC | O_BINARY, + O_WRONLY | O_CREAT | O_APPEND, + O_WRONLY | O_CREAT | O_APPEND | O_BINARY, + O_RDWR | O_CREAT | O_APPEND, + O_RDWR | O_CREAT | O_APPEND | O_BINARY +}; static int do_semihosting(struct target *target) { @@ -72,28 +89,17 @@ static int do_semihosting(struct target *target) uint32_t l = target_buffer_get_u32(target, params+8); if (l <= 255 && m <= 11) { uint8_t fn[256]; - int mode; retval = target_read_memory(target, a, 1, l, fn); if (retval != ERROR_OK) return retval; fn[l] = 0; - if (m & 0x2) - mode = O_RDWR; - else if (m & 0xc) - mode = O_WRONLY; - else - mode = O_RDONLY; - if (m >= 8) - mode |= O_CREAT|O_APPEND; - else if (m >= 4) - mode |= O_CREAT|O_TRUNC; if (strcmp((char *)fn, ":tt") == 0) { - if ((mode & 3) == 0) - result = dup(0); + if (m < 4) + result = STDIN_FILENO; else - result = dup(1); + result = STDOUT_FILENO; } else - result = open((char *)fn, mode); + result = open((char *)fn, open_modeflags[m], 0644); armv4_5->semihosting_errno = errno; } else { result = -1; -- 1.6.5.1.1367.gcd48
_______________________________________________ Openocd-development mailing list Openocd-development@lists.berlios.de https://lists.berlios.de/mailman/listinfo/openocd-development