Message ID | 1416479131-27853-1-git-send-email-linus.walleij@linaro.org |
---|---|
State | Superseded |
Delegated to: | Albert ARIBAUD |
Headers | show |
Acked-by: Steve Rae <srae@broadcom.com> On 14-11-20 02:25 AM, Linus Walleij wrote: > By rearranging the functions in the semihosting code we can > avoid forward-declaration of the internal static functions. > This puts the stuff in a logical order: read/open/close/len > and then higher-order functions follow at the end. > > Cc: Darwin Rambo <drambo@broadcom.com> > Cc: AKASHI Takahiro <takahiro.akashi@linaro.org> > Cc: Mark Hambleton <mark.hambleton@arm.com> > Cc: Tom Rini <trini@ti.com> > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > --- > arch/arm/lib/semihosting.c | 173 ++++++++++++++++++++++----------------------- > 1 file changed, 84 insertions(+), 89 deletions(-) > > diff --git a/arch/arm/lib/semihosting.c b/arch/arm/lib/semihosting.c > index 6e1b2d182eca..2eacbacfde0f 100644 > --- a/arch/arm/lib/semihosting.c > +++ b/arch/arm/lib/semihosting.c > @@ -23,11 +23,6 @@ > #define MODE_READ 0x0 > #define MODE_READBIN 0x1 > > -static long smh_read(long fd, void *memp, size_t len); > -static long smh_open(const char *fname, char *modestr); > -static long smh_close(long fd); > -static long smh_len_fd(long fd); > - > /* > * Call the handler > */ > @@ -44,60 +39,43 @@ static long smh_trap(unsigned int sysnum, void *addr) > } > > /* > - * Open, load a file into memory, and close it. Check that the available space > - * is sufficient to store the entire file. Return the bytes actually read from > - * the file as seen by the read function. The verbose flag enables some extra > - * printing of successful read status. > + * Open a file on the host. Mode is "r" or "rb" currently. Returns a file > + * descriptor or -1 on error. > */ > -int smh_load(const char *fname, void *memp, int avail, int verbose) > +static long smh_open(const char *fname, char *modestr) > { > - long ret; > long fd; > - size_t len; > - > - ret = -1; > - > - debug("%s: fname \'%s\', avail %u, memp %p\n", __func__, fname, > - avail, memp); > - > - /* Open the file */ > - fd = smh_open(fname, "rb"); > - if (fd == -1) > - return -1; > + unsigned long mode; > + struct smh_open_s { > + const char *fname; > + unsigned long mode; > + size_t len; > + } open; > > - /* Get the file length */ > - ret = smh_len_fd(fd); > - if (ret == -1) { > - smh_close(fd); > - return -1; > - } > + debug("%s: file \'%s\', mode \'%s\'\n", __func__, fname, modestr); > > - /* Check that the file will fit in the supplied buffer */ > - if (ret > avail) { > - printf("%s: ERROR ret %ld, avail %u\n", __func__, ret, > - avail); > - smh_close(fd); > + /* 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; > } > > - len = ret; > - > - /* Read the file into the buffer */ > - ret = smh_read(fd, memp, len); > - if (ret == 0) { > - /* Print successful load information if requested */ > - if (verbose) { > - printf("\n%s\n", fname); > - printf(" 0x%8p dest\n", memp); > - printf(" 0x%08lx size\n", len); > - printf(" 0x%08x avail\n", avail); > - } > - } > + open.fname = fname; > + open.len = strlen(fname); > + open.mode = mode; > > - /* Close the file */ > - smh_close(fd); > + /* Open the file on the host */ > + fd = smh_trap(SYSOPEN, &open); > + if (fd == -1) > + printf("%s: ERROR fd %ld for file \'%s\'\n", __func__, fd, > + fname); > > - return ret; > + return fd; > } > > /* > @@ -135,46 +113,6 @@ static long smh_read(long fd, void *memp, size_t len) > } > > /* > - * Open a file on the host. Mode is "r" or "rb" currently. Returns a file > - * descriptor or -1 on error. > - */ > -static long smh_open(const char *fname, char *modestr) > -{ > - 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; > - } > - > - open.fname = fname; > - open.len = strlen(fname); > - open.mode = mode; > - > - /* Open the file on the host */ > - fd = smh_trap(SYSOPEN, &open); > - if (fd == -1) > - printf("%s: ERROR fd %ld for file \'%s\'\n", __func__, fd, > - fname); > - > - return fd; > -} > - > -/* > * Close the file using the file descriptor > */ > static long smh_close(long fd) > @@ -207,6 +145,63 @@ static long smh_len_fd(long fd) > } > > /* > + * Open, load a file into memory, and close it. Check that the available space > + * is sufficient to store the entire file. Return the bytes actually read from > + * the file as seen by the read function. The verbose flag enables some extra > + * printing of successful read status. > + */ > +int smh_load(const char *fname, void *memp, int avail, int verbose) > +{ > + long ret; > + long fd; > + size_t len; > + > + ret = -1; > + > + debug("%s: fname \'%s\', avail %u, memp %p\n", __func__, fname, > + avail, memp); > + > + /* Open the file */ > + fd = smh_open(fname, "rb"); > + if (fd == -1) > + return -1; > + > + /* Get the file length */ > + ret = smh_len_fd(fd); > + if (ret == -1) { > + smh_close(fd); > + return -1; > + } > + > + /* Check that the file will fit in the supplied buffer */ > + if (ret > avail) { > + printf("%s: ERROR ret %ld, avail %u\n", __func__, ret, > + avail); > + smh_close(fd); > + return -1; > + } > + > + len = ret; > + > + /* Read the file into the buffer */ > + ret = smh_read(fd, memp, len); > + if (ret == 0) { > + /* Print successful load information if requested */ > + if (verbose) { > + printf("\n%s\n", fname); > + printf(" 0x%8p dest\n", memp); > + printf(" 0x%08lx size\n", len); > + printf(" 0x%08x avail\n", avail); > + } > + } > + > + /* Close the file */ > + smh_close(fd); > + > + return ret; > +} > + > +/* > * Get the file length from the filename > */ > long smh_len(const char *fname) >
diff --git a/arch/arm/lib/semihosting.c b/arch/arm/lib/semihosting.c index 6e1b2d182eca..2eacbacfde0f 100644 --- a/arch/arm/lib/semihosting.c +++ b/arch/arm/lib/semihosting.c @@ -23,11 +23,6 @@ #define MODE_READ 0x0 #define MODE_READBIN 0x1 -static long smh_read(long fd, void *memp, size_t len); -static long smh_open(const char *fname, char *modestr); -static long smh_close(long fd); -static long smh_len_fd(long fd); - /* * Call the handler */ @@ -44,60 +39,43 @@ static long smh_trap(unsigned int sysnum, void *addr) } /* - * Open, load a file into memory, and close it. Check that the available space - * is sufficient to store the entire file. Return the bytes actually read from - * the file as seen by the read function. The verbose flag enables some extra - * printing of successful read status. + * Open a file on the host. Mode is "r" or "rb" currently. Returns a file + * descriptor or -1 on error. */ -int smh_load(const char *fname, void *memp, int avail, int verbose) +static long smh_open(const char *fname, char *modestr) { - long ret; long fd; - size_t len; - - ret = -1; - - debug("%s: fname \'%s\', avail %u, memp %p\n", __func__, fname, - avail, memp); - - /* Open the file */ - fd = smh_open(fname, "rb"); - if (fd == -1) - return -1; + unsigned long mode; + struct smh_open_s { + const char *fname; + unsigned long mode; + size_t len; + } open; - /* Get the file length */ - ret = smh_len_fd(fd); - if (ret == -1) { - smh_close(fd); - return -1; - } + debug("%s: file \'%s\', mode \'%s\'\n", __func__, fname, modestr); - /* Check that the file will fit in the supplied buffer */ - if (ret > avail) { - printf("%s: ERROR ret %ld, avail %u\n", __func__, ret, - avail); - smh_close(fd); + /* 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; } - len = ret; - - /* Read the file into the buffer */ - ret = smh_read(fd, memp, len); - if (ret == 0) { - /* Print successful load information if requested */ - if (verbose) { - printf("\n%s\n", fname); - printf(" 0x%8p dest\n", memp); - printf(" 0x%08lx size\n", len); - printf(" 0x%08x avail\n", avail); - } - } + open.fname = fname; + open.len = strlen(fname); + open.mode = mode; - /* Close the file */ - smh_close(fd); + /* Open the file on the host */ + fd = smh_trap(SYSOPEN, &open); + if (fd == -1) + printf("%s: ERROR fd %ld for file \'%s\'\n", __func__, fd, + fname); - return ret; + return fd; } /* @@ -135,46 +113,6 @@ static long smh_read(long fd, void *memp, size_t len) } /* - * Open a file on the host. Mode is "r" or "rb" currently. Returns a file - * descriptor or -1 on error. - */ -static long smh_open(const char *fname, char *modestr) -{ - 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; - } - - open.fname = fname; - open.len = strlen(fname); - open.mode = mode; - - /* Open the file on the host */ - fd = smh_trap(SYSOPEN, &open); - if (fd == -1) - printf("%s: ERROR fd %ld for file \'%s\'\n", __func__, fd, - fname); - - return fd; -} - -/* * Close the file using the file descriptor */ static long smh_close(long fd) @@ -207,6 +145,63 @@ static long smh_len_fd(long fd) } /* + * Open, load a file into memory, and close it. Check that the available space + * is sufficient to store the entire file. Return the bytes actually read from + * the file as seen by the read function. The verbose flag enables some extra + * printing of successful read status. + */ +int smh_load(const char *fname, void *memp, int avail, int verbose) +{ + long ret; + long fd; + size_t len; + + ret = -1; + + debug("%s: fname \'%s\', avail %u, memp %p\n", __func__, fname, + avail, memp); + + /* Open the file */ + fd = smh_open(fname, "rb"); + if (fd == -1) + return -1; + + /* Get the file length */ + ret = smh_len_fd(fd); + if (ret == -1) { + smh_close(fd); + return -1; + } + + /* Check that the file will fit in the supplied buffer */ + if (ret > avail) { + printf("%s: ERROR ret %ld, avail %u\n", __func__, ret, + avail); + smh_close(fd); + return -1; + } + + len = ret; + + /* Read the file into the buffer */ + ret = smh_read(fd, memp, len); + if (ret == 0) { + /* Print successful load information if requested */ + if (verbose) { + printf("\n%s\n", fname); + printf(" 0x%8p dest\n", memp); + printf(" 0x%08lx size\n", len); + printf(" 0x%08x avail\n", avail); + } + } + + /* Close the file */ + smh_close(fd); + + return ret; +} + +/* * Get the file length from the filename */ long smh_len(const char *fname)
By rearranging the functions in the semihosting code we can avoid forward-declaration of the internal static functions. This puts the stuff in a logical order: read/open/close/len and then higher-order functions follow at the end. Cc: Darwin Rambo <drambo@broadcom.com> Cc: AKASHI Takahiro <takahiro.akashi@linaro.org> Cc: Mark Hambleton <mark.hambleton@arm.com> Cc: Tom Rini <trini@ti.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> --- arch/arm/lib/semihosting.c | 173 ++++++++++++++++++++++----------------------- 1 file changed, 84 insertions(+), 89 deletions(-)