aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2016-09-06 15:38:55 +0200
committerPaolo Bonzini <pbonzini@redhat.com>2016-09-06 15:58:09 +0200
commitf980302461faad89a3fd1075e5c977c9f6f9d58e (patch)
tree65ec0bfb33668ff44b82929ff2e44be96d2abcc8
parent0b3fc2e09f09f13c79b4b7b04f8097ce9253b692 (diff)
downloadqboot-f980302461faad89a3fd1075e5c977c9f6f9d58e.zip
qboot-f980302461faad89a3fd1075e5c977c9f6f9d58e.tar.gz
qboot-f980302461faad89a3fd1075e5c977c9f6f9d58e.tar.bz2
use DMA to read fw_cfg file names
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--fw_cfg.c29
-rw-r--r--include/bswap.h5
2 files changed, 28 insertions, 6 deletions
diff --git a/fw_cfg.c b/fw_cfg.c
index 33b4003..660c00d 100644
--- a/fw_cfg.c
+++ b/fw_cfg.c
@@ -11,7 +11,8 @@
struct fw_cfg_file {
uint32_t size;
uint16_t select;
- char name[57];
+ uint16_t unused;
+ char name[56];
};
static int version;
@@ -30,20 +31,36 @@ void fw_cfg_setup(void)
filecnt = n;
files = malloc_fseg(sizeof(files[0]) * n);
+ fw_cfg_read(files, sizeof(files[0]) * n);
for (i = 0; i < n; i++) {
- files[i].size = fw_cfg_readl_be();
- files[i].select = fw_cfg_readw_be();
- fw_cfg_readw_be();
- fw_cfg_read(files[i].name, sizeof(files[i].name) - 1);
+ struct fw_cfg_file *f = &files[i];
+ f->size = bswap32(f->size);
+ f->select = bswap16(f->select);
}
}
+int filenamecmp(const char *a, const struct fw_cfg_file *f)
+{
+ int n = sizeof(f->name);
+ const char *b = f->name;
+ while (*a == *b) {
+ if (*a == '\0') {
+ break;
+ }
+ if (--n == 0) {
+ return *a;
+ }
+ ++a, ++b;
+ }
+ return *a - *b;
+}
+
int fw_cfg_file_id(char *name)
{
int i;
for (i = 0; i < filecnt; i++)
- if (!strcmp(name, files[i].name))
+ if (!filenamecmp(name, &files[i]))
return i;
return -1;
diff --git a/include/bswap.h b/include/bswap.h
index 2a72bd0..67b3c4f 100644
--- a/include/bswap.h
+++ b/include/bswap.h
@@ -1,6 +1,11 @@
#ifndef BSWAP_H
#define BSWAP_H 1
+static inline uint16_t bswap16(uint16_t x)
+{
+ return __builtin_bswap16(x);
+}
+
static inline uint32_t bswap32(uint32_t x)
{
return __builtin_bswap32(x);