1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-10-01 15:31:27 +02:00

arm: smh: Use numeric modes for smh_open

There's no point in using string constants for smh_open if we are just
going to have to parse them. Instead, use numeric modes. The user needs
to be a bit careful with these, since they are much closer semantically
to string modes used by fopen(3) than the numeric modes used with
open(2).

Signed-off-by: Sean Anderson <sean.anderson@seco.com>
This commit is contained in:
Sean Anderson
2022-03-22 16:59:15 -04:00
committed by Tom Rini
parent b10f724807
commit eff77c3a24
2 changed files with 27 additions and 19 deletions

View File

@@ -22,9 +22,6 @@
#define SYSREAD 0x06 #define SYSREAD 0x06
#define SYSFLEN 0x0C #define SYSFLEN 0x0C
#define MODE_READ 0x0
#define MODE_READBIN 0x1
/* /*
* Call the handler * Call the handler
*/ */
@@ -46,28 +43,16 @@ static noinline long smh_trap(unsigned int sysnum, void *addr)
* Open a file on the host. Mode is "r" or "rb" currently. Returns a file * Open a file on the host. Mode is "r" or "rb" currently. Returns a file
* descriptor or -1 on error. * descriptor or -1 on error.
*/ */
long smh_open(const char *fname, char *modestr) long smh_open(const char *fname, enum smh_open_mode mode)
{ {
long fd; long fd;
unsigned long mode;
struct smh_open_s { struct smh_open_s {
const char *fname; const char *fname;
unsigned long mode; unsigned long mode;
size_t len; size_t len;
} open; } open;
debug("%s: file \'%s\', mode \'%s\'\n", __func__, fname, modestr); debug("%s: file \'%s\', mode \'%u\'\n", __func__, fname, mode);
/* Check the file mode */
if (!(strcmp(modestr, "r"))) {
mode = MODE_READ;
} else if (!(strcmp(modestr, "rb"))) {
mode = MODE_READBIN;
} else {
printf("%s: ERROR mode \'%s\' not supported\n", __func__,
modestr);
return -1;
}
open.fname = fname; open.fname = fname;
open.len = strlen(fname); open.len = strlen(fname);
@@ -155,7 +140,7 @@ static int smh_load_file(const char * const name, ulong load_addr,
long len; long len;
long ret; long ret;
fd = smh_open(name, "rb"); fd = smh_open(name, MODE_READ | MODE_BINARY);
if (fd == -1) if (fd == -1)
return -1; return -1;

View File

@@ -6,7 +6,30 @@
#ifndef _SEMIHOSTING_H #ifndef _SEMIHOSTING_H
#define _SEMIHOSTING_H #define _SEMIHOSTING_H
long smh_open(const char *fname, char *modestr); /**
* enum smh_open_mode - Numeric file modes for use with smh_open()
* MODE_READ: 'r'
* MODE_BINARY: 'b'
* MODE_PLUS: '+'
* MODE_WRITE: 'w'
* MODE_APPEND: 'a'
*
* These modes represent the mode string used by fopen(3) in a form which can
* be passed to smh_open(). These do NOT correspond directly to %O_RDONLY,
* %O_CREAT, etc; see fopen(3) for details. In particular, @MODE_PLUS
* effectively results in adding %O_RDWR, and @MODE_WRITE will add %O_TRUNC.
* For compatibility, @MODE_BINARY should be added when opening non-text files
* (such as images).
*/
enum smh_open_mode {
MODE_READ = 0x0,
MODE_BINARY = 0x1,
MODE_PLUS = 0x2,
MODE_WRITE = 0x4,
MODE_APPEND = 0x8,
};
long smh_open(const char *fname, enum smh_open_mode mode);
long smh_read(long fd, void *memp, size_t len); long smh_read(long fd, void *memp, size_t len);
long smh_close(long fd); long smh_close(long fd);
long smh_flen(long fd); long smh_flen(long fd);