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
next 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).