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 <ntfreak@users.sourceforge.net>
This commit is contained in:
Spencer Oliver 2010-01-28 21:05:09 +00:00
parent 465a06dfdc
commit 75cfda4cd1
2 changed files with 32 additions and 16 deletions

View File

@ -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

View File

@ -2,6 +2,9 @@
* Copyright (C) 2009 by Marvell Technology Group Ltd. *
* Written by Nicolas Pitre <nico@marvell.com> *
* *
* Copyright (C) 2010 by Spencer Oliver *
* spen@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,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;