From: Spencer O. <nt...@us...> - 2010-01-28 22:07:37
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Main OpenOCD repository". The branch, master has been updated via 75cfda4cd1fe057f0557bd86963a71e530edd584 (commit) via 465a06dfdc6c5d4af377dac7b9d71845cb0dc034 (commit) from 3172be80a3e14f4c8c3628a37db348c04fd60fc4 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 75cfda4cd1fe057f0557bd86963a71e530edd584 Author: Spencer Oliver <nt...@us...> Date: Thu Jan 28 21:05:09 2010 +0000 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 <nt...@us...> 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..8db60a5 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 <ni...@ma...> * * * + * Copyright (C) 2010 by Spencer Oliver * + * sp...@sp... * + * * * 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,21 @@ 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 = dup(STDIN_FILENO); else - result = dup(1); - } else - result = open((char *)fn, mode); + result = dup(STDOUT_FILENO); + } else { + /* cygwin requires the permission setting + * otherwise it will fail to reopen a previously + * written file */ + result = open((char *)fn, open_modeflags[m], 0644); + } armv4_5->semihosting_errno = errno; } else { result = -1; commit 465a06dfdc6c5d4af377dac7b9d71845cb0dc034 Author: Spencer Oliver <nt...@us...> Date: Wed Jan 27 21:20:18 2010 +0000 ARM semihosting: fix writing to stdout SYS_FLEN would be called before a write on a descriptor to check its size. Currently lseek would fail with -1 when given the stdout/stderr descriptor. Changing to use fstat seems to be the standard way of handling this. Signed-off-by: Spencer Oliver <nt...@us...> diff --git a/src/helper/system.h b/src/helper/system.h index 169df1c..af19d01 100644 --- a/src/helper/system.h +++ b/src/helper/system.h @@ -50,6 +50,8 @@ #ifdef _WIN32 #include <winsock2.h> #include <ws2tcpip.h> +#include <sys/types.h> +#include <sys/stat.h> #endif // --- platform specific headers --- diff --git a/src/target/arm_semihosting.c b/src/target/arm_semihosting.c index f4244c8..1d0acd6 100644 --- a/src/target/arm_semihosting.c +++ b/src/target/arm_semihosting.c @@ -230,18 +230,14 @@ static int do_semihosting(struct target *target) return retval; else { int fd = target_buffer_get_u32(target, params+0); - off_t cur = lseek(fd, 0, SEEK_CUR); - if (cur == (off_t)-1) { + struct stat buf; + result = fstat(fd, &buf); + if (result == -1) { armv4_5->semihosting_errno = errno; result = -1; break; } - result = lseek(fd, 0, SEEK_END); - armv4_5->semihosting_errno = errno; - if (lseek(fd, cur, SEEK_SET) == (off_t)-1) { - armv4_5->semihosting_errno = errno; - result = -1; - } + result = buf.st_size; } break; ----------------------------------------------------------------------- Summary of changes: src/helper/replacements.h | 6 ++++ src/helper/system.h | 2 + src/target/arm_semihosting.c | 54 +++++++++++++++++++++++------------------ 3 files changed, 38 insertions(+), 24 deletions(-) hooks/post-receive -- Main OpenOCD repository |