qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: laurent@lvivier.info
To: aurelien@aurel32.net
Cc: blauwirbel@gmail.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [PATCH 0/2][RFC][PPC] openbios support
Date: Fri, 19 Dec 2008 11:55:45 +0100	[thread overview]
Message-ID: <11945563.15381229684145569.JavaMail.servlet@kundenserver> (raw)

[-- Attachment #1: Type: text/plain, Size: 992 bytes --]

>On Fri, Dec 19, 2008 at 09:54:54AM +0100, laurent@lvivier.info wrote:
>> >Laurent Vivier a écrit :
>> >> These two patches allows to load an openbios elf image instead of an
>> >> openhackware image.
>> >> 
>> >> [PATCH 1/2][RFC] Modify hw/ppc_oldword.c to use qemu_ram_alloc().
>> >> [PATCH 2/2][RFC] Load an OpenBios ELF image instead of OpenHackware 
>binary
>> >
>> >Great job! We are closer to get rid of OpenHackware.
>> >
>> >However I have tried those patches with the latest SVN from OpenBios,
>> >and I am unable to get the machine booting. Do we need other patches for
>> >OpenBios or QEMU? It would be nice to make them available, even if they
>> >are not ready for merge.
>> 
>> Yes, we need more patches:
>> 
>> - for qemu, an nvram cleanup I already sent some month ago, and a little PCI 
>cleanup patch.
>
>Could you please resent it? I will apply it if everything is ok.

Here it is.

Note that the NVRAM is stored into a file.

Regards,
Laurent

[-- Attachment #2: 0001-PowerMac-NVRAM-cleanup.patch --]
[-- Type: application/octet-stream, Size: 7403 bytes --]

>From 7d45ab963a98c4b26bd087dedd6714d9f3c2fd5e Mon Sep 17 00:00:00 2001
From: Laurent Vivier <Laurent@lvivier.info>
Date: Thu, 18 Dec 2008 22:08:00 +0100
Subject: [PATCH] PowerMac NVRAM cleanup

Signed-off-by: Laurent Vivier <Laurent@lvivier.info>
---
 hw/mac_nvram.c    |  122 ++++++++++++++++++++++++++++++++++++++++++-----------
 hw/ppc_mac.h      |    4 +-
 hw/ppc_oldworld.c |    4 +-
 3 files changed, 101 insertions(+), 29 deletions(-)

diff --git a/hw/mac_nvram.c b/hw/mac_nvram.c
index f608ace..95b249e 100644
--- a/hw/mac_nvram.c
+++ b/hw/mac_nvram.c
@@ -23,12 +23,17 @@
  * THE SOFTWARE.
  */
 #include "hw.h"
+#include "firmware_abi.h"
 #include "ppc_mac.h"
 
+#define DEF_SYSTEM_SIZE 0xc10
+
 struct MacIONVRAMState {
+    target_phys_addr_t mem_base;
     target_phys_addr_t size;
+    QEMUFile *file;
     int mem_index;
-    uint8_t data[0x2000];
+    uint8_t data[NVRAM_SIZE];
 };
 
 /* Direct access to NVRAM */
@@ -38,7 +43,7 @@ uint32_t macio_nvram_read (void *opaque, uint32_t addr)
     uint32_t ret;
 
     //    printf("%s: %p addr %04x\n", __func__, s, addr);
-    if (addr < 0x2000)
+    if (addr < NVRAM_SIZE)
         ret = s->data[addr];
     else
         ret = -1;
@@ -51,7 +56,7 @@ void macio_nvram_write (void *opaque, uint32_t addr, uint32_t val)
     MacIONVRAMState *s = opaque;
 
     //    printf("%s: %p addr %04x val %02x\n", __func__, s, addr, val);
-    if (addr < 0x2000)
+    if (addr < NVRAM_SIZE)
         s->data[addr] = val;
 }
 
@@ -61,9 +66,14 @@ static void macio_nvram_writeb (void *opaque,
 {
     MacIONVRAMState *s = opaque;
 
-    addr = (addr >> 4) & 0x1fff;
+    addr = (addr >> 4) & (NVRAM_SIZE-1);
     s->data[addr] = value;
     //    printf("macio_nvram_writeb %04x = %02x\n", addr, value);
+    if (s->file) {
+        qemu_fseek(s->file, addr, SEEK_SET);
+        qemu_put_byte(s->file, value);
+        qemu_fflush(s->file);
+    }
 }
 
 static uint32_t macio_nvram_readb (void *opaque, target_phys_addr_t addr)
@@ -71,7 +81,7 @@ static uint32_t macio_nvram_readb (void *opaque, target_phys_addr_t addr)
     MacIONVRAMState *s = opaque;
     uint32_t value;
 
-    addr = (addr >> 4) & 0x1fff;
+    addr = (addr >> 4) & (NVRAM_SIZE-1);
     value = s->data[addr];
     //    printf("macio_nvram_readb %04x = %02x\n", addr, value);
 
@@ -90,17 +100,32 @@ static CPUReadMemoryFunc *nvram_read[] = {
     &macio_nvram_readb,
 };
 
-MacIONVRAMState *macio_nvram_init (int *mem_index, target_phys_addr_t size)
+MacIONVRAMState *macio_nvram_init (int *mem_index, const char *filename)
 {
     MacIONVRAMState *s;
+    QEMUFile *file;
 
     s = qemu_mallocz(sizeof(MacIONVRAMState));
     if (!s)
         return NULL;
-    s->size = size;
+    s->size = NVRAM_SIZE << 4;
     s->mem_index = cpu_register_io_memory(0, nvram_read, nvram_write, s);
     *mem_index = s->mem_index;
 
+    /* Read current file */
+    file = qemu_fopen(filename, "rb");
+    if (file) {
+        /* Read nvram contents */
+        qemu_get_buffer(file, s->data, s->size >> 4);
+        qemu_fclose(file);
+    }
+    s->file = qemu_fopen(filename, "wb");
+    if (s->file) {
+        /* Write back contents, as 'wb' mode cleaned the file */
+        qemu_put_buffer(s->file, s->data, s->size >> 4);
+        qemu_fflush(s->file);
+    }
+
     return s;
 }
 
@@ -112,26 +137,73 @@ void macio_nvram_map (void *opaque, target_phys_addr_t mem_base)
     cpu_register_physical_memory(mem_base, s->size, s->mem_index);
 }
 
-static uint8_t nvram_chksum (const uint8_t *buf, int n)
+static void nvram_set_header(MacIONVRAMState *nvr,
+                             uint32_t addr,
+                             uint8_t signature,
+                             uint16_t size,
+                             const char* name)
+{
+    struct OpenBIOS_nvpart_v1 *nvpart = (struct OpenBIOS_nvpart_v1 *)(nvr->data + addr);
+
+    memset(nvpart, 0, sizeof(*nvpart));
+    nvpart->signature = signature;
+    strncpy(nvpart->name, name, sizeof(nvpart->name));
+    OpenBIOS_finish_partition(nvpart, size);
+}
+
+static void create_free_part(MacIONVRAMState *nvr, uint32_t addr, int size )
+{
+    nvram_set_header(nvr, addr, OPENBIOS_PART_FREE, size, "777777777777");
+}
+
+static int
+next_nvpart(MacIONVRAMState *nvr, uint32_t *addr, uint32_t end)
+{
+    struct OpenBIOS_nvpart_v1 *nvpart = (struct OpenBIOS_nvpart_v1 *)(nvr->data + *addr);
+    int len;
+
+    len = be16_to_cpu(nvpart->len);
+    if (len == 0)
+        return 1;
+
+    *addr = (*addr) + len;
+    if( *addr < end )
+           return 1;
+   if( *addr == end )
+           return 0;
+   return -1;
+}
+
+static int create_nv_part(MacIONVRAMState *nvr, uint32_t base, int max_size,
+                          int signature, const char *name, int size )
 {
-    int sum, i;
-    sum = 0;
-    for(i = 0; i < n; i++)
-        sum += buf[i];
-    return (sum & 0xff) + (sum >> 8);
+    struct OpenBIOS_nvpart_v1 *nvpart;
+    uint32_t addr = base;
+    uint32_t end = base + max_size;
+    int len;
+
+     do {
+        nvpart = (struct OpenBIOS_nvpart_v1 *)(nvr->data + addr);
+
+        if (nvpart->signature != OPENBIOS_PART_FREE)
+            continue;
+
+        len = be16_to_cpu(nvpart->len) << 4;
+        if (len < size)
+            size = len;
+
+        nvram_set_header(nvr, addr, signature, size, name);
+        if (len > size)
+            create_free_part(nvr, addr + size, len - size);
+        return size;
+    } while (next_nvpart(nvr, &addr, end) > 0 );
+    return -1;
 }
 
-/* set a free Mac OS NVRAM partition */
-void pmac_format_nvram_partition (MacIONVRAMState *nvr, int len)
+/* set a system Mac OS NVRAM partition */
+void pmac_format_nvram_partition (MacIONVRAMState *nvr)
 {
-    uint8_t *buf;
-    char partition_name[12] = "wwwwwwwwwwww";
-
-    buf = nvr->data;
-    buf[0] = 0x7f; /* free partition magic */
-    buf[1] = 0; /* checksum */
-    buf[2] = len >> 8;
-    buf[3] = len;
-    memcpy(buf + 4, partition_name, 12);
-    buf[1] = nvram_chksum(buf, 16);
+    create_free_part(nvr, 0, sizeof(nvr->data));
+    create_nv_part(nvr, 0, sizeof(nvr->data),
+                   OPENBIOS_PART_SYSTEM, "common", DEF_SYSTEM_SIZE);
 }
diff --git a/hw/ppc_mac.h b/hw/ppc_mac.h
index c833d17..343c91e 100644
--- a/hw/ppc_mac.h
+++ b/hw/ppc_mac.h
@@ -64,9 +64,9 @@ PCIBus *pci_pmac_init(qemu_irq *pic);
 /* Mac NVRAM */
 typedef struct MacIONVRAMState MacIONVRAMState;
 
-MacIONVRAMState *macio_nvram_init (int *mem_index, target_phys_addr_t size);
+MacIONVRAMState *macio_nvram_init (int *mem_index, const char *filename);
 void macio_nvram_map (void *opaque, target_phys_addr_t mem_base);
-void pmac_format_nvram_partition (MacIONVRAMState *nvr, int len);
+void pmac_format_nvram_partition (MacIONVRAMState *nvr);
 uint32_t macio_nvram_read (void *opaque, uint32_t addr);
 void macio_nvram_write (void *opaque, uint32_t addr, uint32_t val);
 
diff --git a/hw/ppc_oldworld.c b/hw/ppc_oldworld.c
index 73cf4ab..eb9f33f 100644
--- a/hw/ppc_oldworld.c
+++ b/hw/ppc_oldworld.c
@@ -348,8 +348,8 @@ static void ppc_heathrow_init (ram_addr_t ram_size, int vga_ram_size,
     adb_kbd_init(&adb_bus);
     adb_mouse_init(&adb_bus);
 
-    nvr = macio_nvram_init(&nvram_mem_index, 0x2000);
-    pmac_format_nvram_partition(nvr, 0x2000);
+    nvr = macio_nvram_init(&nvram_mem_index, "g3bw_nvram");
+    pmac_format_nvram_partition(nvr);
 
     dbdma_init(&dbdma_mem_index);
 
-- 
1.5.6.5


             reply	other threads:[~2008-12-19 10:55 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-19 10:55 laurent [this message]
2008-12-19 17:50 ` [Qemu-devel] Re: [PATCH 0/2][RFC][PPC] openbios support Blue Swirl
2008-12-19 19:41   ` Laurent Vivier
  -- strict thread matches above, loose matches on Subject: below --
2008-12-19  8:54 laurent
2008-12-19 10:23 ` Aurelien Jarno
     [not found] <1229635267-16897-1-git-send-email-Laurent@lvivier.info>
2008-12-19  8:45 ` Aurelien Jarno
2008-12-20  7:54   ` François Revol

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=11945563.15381229684145569.JavaMail.servlet@kundenserver \
    --to=laurent@lvivier.info \
    --cc=aurelien@aurel32.net \
    --cc=blauwirbel@gmail.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).