vgabios: Add wrapper functions for accessing standard VGA registers.
[seabios.git] / src / paravirt.c
index 308c809c3841bcbff3d9477ceba5bec0ba4fc845..9cf77def2892eb51ade6e445a7edb1706603631e 100644 (file)
@@ -338,26 +338,43 @@ u32 qemu_cfg_find_file(const char *name)
     return __cfg_next_prefix_file(name, strlen(name) + 1, 0);
 }
 
+static int
+__qemu_cfg_set_file(u32 select)
+{
+    if (!qemu_cfg_present || !select)
+        return -1;
+    if (select == ntohs(LastFile.select))
+        return 0;
+
+    u32 count;
+    qemu_cfg_read_entry(&count, QEMU_CFG_FILE_DIR, sizeof(count));
+    count = ntohl(count);
+    u32 e;
+    for (e = 0; e < count; e++) {
+        qemu_cfg_read((void*)&LastFile, sizeof(LastFile));
+        if (select == ntohs(LastFile.select))
+            return 0;
+    }
+    return -1;
+}
+
 int qemu_cfg_size_file(u32 select)
 {
-    if (select != ntohs(LastFile.select))
+    if (__qemu_cfg_set_file(select))
         return -1;
     return ntohl(LastFile.size);
 }
 
-
 const char* qemu_cfg_name_file(u32 select)
 {
-    if (select != ntohs(LastFile.select))
+    if (__qemu_cfg_set_file(select))
         return NULL;
     return LastFile.name;
 }
 
 int qemu_cfg_read_file(u32 select, void *dst, u32 maxlen)
 {
-    if (!qemu_cfg_present)
-        return -1;
-    if (!select || select != ntohs(LastFile.select))
+    if (__qemu_cfg_set_file(select))
         return -1;
     int len = qemu_cfg_size_file(select);
     if (len < 0 || len > maxlen)
@@ -365,3 +382,49 @@ int qemu_cfg_read_file(u32 select, void *dst, u32 maxlen)
     qemu_cfg_read_entry(dst, select, len);
     return len;
 }
+
+// Helper function to find, malloc_tmphigh, and copy a romfile.  This
+// function adds a trailing zero to the malloc'd copy.
+void *
+romfile_loadfile(const char *name, int *psize)
+{
+    u32 file = romfile_find(name);
+    if (!file)
+        return NULL;
+
+    int filesize = romfile_size(file);
+    if (!filesize)
+        return NULL;
+
+    char *data = malloc_tmphigh(filesize+1);
+    if (!data) {
+        warn_noalloc();
+        return NULL;
+    }
+
+    dprintf(5, "Copying romfile '%s' (len %d)\n", name, filesize);
+    romfile_copy(file, data, filesize);
+    if (psize)
+        *psize = filesize;
+    data[filesize] = '\0';
+    return data;
+}
+
+// Attempt to load an integer from the given file - return 'defval'
+// if unsuccesful.
+u64
+romfile_loadint(const char *name, u64 defval)
+{
+    u32 file = romfile_find(name);
+    if (!file)
+        return defval;
+
+    int filesize = romfile_size(file);
+    if (!filesize || filesize > sizeof(u64) || (filesize & (filesize-1)))
+        // Doesn't look like a valid integer.
+        return defval;
+
+    u64 val = 0;
+    romfile_copy(file, &val, sizeof(val));
+    return val;
+}