]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
arm: smh: Use numeric modes for smh_open
authorSean Anderson <sean.anderson@seco.com>
Tue, 22 Mar 2022 20:59:15 +0000 (16:59 -0400)
committerTom Rini <trini@konsulko.com>
Fri, 1 Apr 2022 19:03:13 +0000 (15:03 -0400)
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>
arch/arm/lib/semihosting.c
include/semihosting.h

index c38892fdd88822df46d99711e73802919b5cccc3..b983cc39352242d5b475a21bea0dda6a0b9b4042 100644 (file)
@@ -22,9 +22,6 @@
 #define SYSREAD                0x06
 #define SYSFLEN                0x0C
 
-#define MODE_READ      0x0
-#define MODE_READBIN   0x1
-
 /*
  * 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
  * 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;
-       unsigned long mode;
        struct smh_open_s {
                const char *fname;
                unsigned long mode;
                size_t len;
        } open;
 
-       debug("%s: file \'%s\', mode \'%s\'\n", __func__, fname, modestr);
-
-       /* 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;
-       }
+       debug("%s: file \'%s\', mode \'%u\'\n", __func__, fname, mode);
 
        open.fname = fname;
        open.len = strlen(fname);
@@ -155,7 +140,7 @@ static int smh_load_file(const char * const name, ulong load_addr,
        long len;
        long ret;
 
-       fd = smh_open(name, "rb");
+       fd = smh_open(name, MODE_READ | MODE_BINARY);
        if (fd == -1)
                return -1;
 
index 384386304650e137aaf2edbaf74864f2676a17b7..cf54819192b0a6b0f0f348483a0126860cf86bfa 100644 (file)
@@ -6,7 +6,30 @@
 #ifndef _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_close(long fd);
 long smh_flen(long fd);