
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__,
return -1; }modestr);
- 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)