* [Qemu-devel] [PATCH 1/9] hw/xtensa: remove extraneous xtensa_ prefix from file names
2014-06-23 16:12 [Qemu-devel] [PATCH 0/9] target-xtensa: linux booting improvements Max Filippov
@ 2014-06-23 16:12 ` Max Filippov
2014-06-23 16:12 ` [Qemu-devel] [PATCH 2/9] hw/xtensa: replace fprintfs with error_report Max Filippov
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Max Filippov @ 2014-06-23 16:12 UTC (permalink / raw)
To: qemu-devel; +Cc: Max Filippov, Waldemar Brodkorb
While at it rename lx60 (named after the first board of the family) to
more generic xtfpga (the family name).
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
hw/xtensa/Makefile.objs | 4 ++--
hw/xtensa/{xtensa_bootparam.h => bootparam.h} | 0
hw/xtensa/{xtensa_sim.c => sim.c} | 0
hw/xtensa/{xtensa_lx60.c => xtfpga.c} | 2 +-
4 files changed, 3 insertions(+), 3 deletions(-)
rename hw/xtensa/{xtensa_bootparam.h => bootparam.h} (100%)
rename hw/xtensa/{xtensa_sim.c => sim.c} (100%)
rename hw/xtensa/{xtensa_lx60.c => xtfpga.c} (99%)
diff --git a/hw/xtensa/Makefile.objs b/hw/xtensa/Makefile.objs
index 6ead782..cb77dc3 100644
--- a/hw/xtensa/Makefile.objs
+++ b/hw/xtensa/Makefile.objs
@@ -1,3 +1,3 @@
obj-y += pic_cpu.o
-obj-y += xtensa_sim.o
-obj-y += xtensa_lx60.o
+obj-y += sim.o
+obj-y += xtfpga.o
diff --git a/hw/xtensa/xtensa_bootparam.h b/hw/xtensa/bootparam.h
similarity index 100%
rename from hw/xtensa/xtensa_bootparam.h
rename to hw/xtensa/bootparam.h
diff --git a/hw/xtensa/xtensa_sim.c b/hw/xtensa/sim.c
similarity index 100%
rename from hw/xtensa/xtensa_sim.c
rename to hw/xtensa/sim.c
diff --git a/hw/xtensa/xtensa_lx60.c b/hw/xtensa/xtfpga.c
similarity index 99%
rename from hw/xtensa/xtensa_lx60.c
rename to hw/xtensa/xtfpga.c
index 183527f..0b8a2ed 100644
--- a/hw/xtensa/xtensa_lx60.c
+++ b/hw/xtensa/xtfpga.c
@@ -37,7 +37,7 @@
#include "hw/block/flash.h"
#include "sysemu/blockdev.h"
#include "sysemu/char.h"
-#include "xtensa_bootparam.h"
+#include "bootparam.h"
typedef struct LxBoardDesc {
hwaddr flash_base;
--
1.8.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 2/9] hw/xtensa: replace fprintfs with error_report
2014-06-23 16:12 [Qemu-devel] [PATCH 0/9] target-xtensa: linux booting improvements Max Filippov
2014-06-23 16:12 ` [Qemu-devel] [PATCH 1/9] hw/xtensa: remove extraneous xtensa_ prefix from file names Max Filippov
@ 2014-06-23 16:12 ` Max Filippov
2014-06-23 16:12 ` [Qemu-devel] [PATCH 3/9] hw/xtensa/xtfpga: retrieve parameters from machine_opts Max Filippov
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Max Filippov @ 2014-06-23 16:12 UTC (permalink / raw)
To: qemu-devel; +Cc: Max Filippov, Waldemar Brodkorb
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
hw/xtensa/sim.c | 6 ++++--
hw/xtensa/xtfpga.c | 10 ++++++----
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/hw/xtensa/sim.c b/hw/xtensa/sim.c
index 89da43c..9642bf5 100644
--- a/hw/xtensa/sim.c
+++ b/hw/xtensa/sim.c
@@ -31,6 +31,7 @@
#include "elf.h"
#include "exec/memory.h"
#include "exec/address-spaces.h"
+#include "qemu/error-report.h"
static uint64_t translate_phys_addr(void *opaque, uint64_t addr)
{
@@ -63,8 +64,9 @@ static void xtensa_sim_init(MachineState *machine)
for (n = 0; n < smp_cpus; n++) {
cpu = cpu_xtensa_init(cpu_model);
if (cpu == NULL) {
- fprintf(stderr, "Unable to find CPU definition\n");
- exit(1);
+ error_report("unable to find CPU definition '%s'\n",
+ cpu_model);
+ exit(EXIT_FAILURE);
}
env = &cpu->env;
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 0b8a2ed..75bc479 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -37,6 +37,7 @@
#include "hw/block/flash.h"
#include "sysemu/blockdev.h"
#include "sysemu/char.h"
+#include "qemu/error-report.h"
#include "bootparam.h"
typedef struct LxBoardDesc {
@@ -185,8 +186,9 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
for (n = 0; n < smp_cpus; n++) {
cpu = cpu_xtensa_init(cpu_model);
if (cpu == NULL) {
- fprintf(stderr, "Unable to find CPU definition\n");
- exit(1);
+ error_report("unable to find CPU definition '%s'\n",
+ cpu_model);
+ exit(EXIT_FAILURE);
}
env = &cpu->env;
@@ -227,8 +229,8 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
board->flash_size / board->flash_sector_size,
4, 0x0000, 0x0000, 0x0000, 0x0000, be);
if (flash == NULL) {
- fprintf(stderr, "Unable to mount pflash\n");
- exit(1);
+ error_report("unable to mount pflash\n");
+ exit(EXIT_FAILURE);
}
}
--
1.8.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 3/9] hw/xtensa/xtfpga: retrieve parameters from machine_opts
2014-06-23 16:12 [Qemu-devel] [PATCH 0/9] target-xtensa: linux booting improvements Max Filippov
2014-06-23 16:12 ` [Qemu-devel] [PATCH 1/9] hw/xtensa: remove extraneous xtensa_ prefix from file names Max Filippov
2014-06-23 16:12 ` [Qemu-devel] [PATCH 2/9] hw/xtensa: replace fprintfs with error_report Max Filippov
@ 2014-06-23 16:12 ` Max Filippov
2014-06-23 16:12 ` [Qemu-devel] [PATCH 4/9] hw/xtensa/xtfpga: use symbolic constants for bootparam tags Max Filippov
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Max Filippov @ 2014-06-23 16:12 UTC (permalink / raw)
To: qemu-devel; +Cc: Max Filippov, Waldemar Brodkorb
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
hw/xtensa/xtfpga.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 75bc479..0aa3eeb 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -174,9 +174,10 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
MemoryRegion *ram, *rom, *system_io;
DriveInfo *dinfo;
pflash_t *flash = NULL;
+ QemuOpts *machine_opts = qemu_get_machine_opts();
const char *cpu_model = machine->cpu_model;
- const char *kernel_filename = machine->kernel_filename;
- const char *kernel_cmdline = machine->kernel_cmdline;
+ const char *kernel_filename = qemu_opt_get(machine_opts, "kernel");
+ const char *kernel_cmdline = qemu_opt_get(machine_opts, "append");
int n;
if (!cpu_model) {
--
1.8.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 4/9] hw/xtensa/xtfpga: use symbolic constants for bootparam tags
2014-06-23 16:12 [Qemu-devel] [PATCH 0/9] target-xtensa: linux booting improvements Max Filippov
` (2 preceding siblings ...)
2014-06-23 16:12 ` [Qemu-devel] [PATCH 3/9] hw/xtensa/xtfpga: retrieve parameters from machine_opts Max Filippov
@ 2014-06-23 16:12 ` Max Filippov
2014-06-23 16:12 ` [Qemu-devel] [PATCH 5/9] hw/xtensa/xtfpga: refactor bootparameters filling Max Filippov
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Max Filippov @ 2014-06-23 16:12 UTC (permalink / raw)
To: qemu-devel; +Cc: Max Filippov, Waldemar Brodkorb
Import bootparam tag names from linux/arch/xtensa/include/asm/bootparam.h
No functional changes.
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
hw/xtensa/bootparam.h | 10 ++++++++++
hw/xtensa/xtfpga.c | 6 +++---
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/hw/xtensa/bootparam.h b/hw/xtensa/bootparam.h
index 38ef32b..e6cf3b1 100644
--- a/hw/xtensa/bootparam.h
+++ b/hw/xtensa/bootparam.h
@@ -1,6 +1,16 @@
#ifndef HW_XTENSA_BOOTPARAM
#define HW_XTENSA_BOOTPARAM
+#define BP_TAG_COMMAND_LINE 0x1001 /* command line (0-terminated string)*/
+#define BP_TAG_INITRD 0x1002 /* ramdisk addr and size (bp_meminfo) */
+#define BP_TAG_MEMORY 0x1003 /* memory addr and size (bp_meminfo) */
+#define BP_TAG_SERIAL_BAUDRATE 0x1004 /* baud rate of current console. */
+#define BP_TAG_SERIAL_PORT 0x1005 /* serial device of current console */
+#define BP_TAG_FDT 0x1006 /* flat device tree addr */
+
+#define BP_TAG_FIRST 0x7B0B /* first tag with a version number */
+#define BP_TAG_LAST 0x7E0B /* last tag */
+
typedef struct BpTag {
uint16_t tag;
uint16_t size;
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 0aa3eeb..6d070b0 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -250,12 +250,12 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
env->regs[2] = tagptr;
- tagptr = put_tag(tagptr, 0x7b0b, 0, NULL);
+ tagptr = put_tag(tagptr, BP_TAG_FIRST, 0, NULL);
if (cmdline_size > 1) {
- tagptr = put_tag(tagptr, 0x1001,
+ tagptr = put_tag(tagptr, BP_TAG_COMMAND_LINE,
cmdline_size, kernel_cmdline);
}
- tagptr = put_tag(tagptr, 0x7e0b, 0, NULL);
+ tagptr = put_tag(tagptr, BP_TAG_LAST, 0, NULL);
}
uint64_t elf_entry;
uint64_t elf_lowaddr;
--
1.8.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 5/9] hw/xtensa/xtfpga: refactor bootparameters filling
2014-06-23 16:12 [Qemu-devel] [PATCH 0/9] target-xtensa: linux booting improvements Max Filippov
` (3 preceding siblings ...)
2014-06-23 16:12 ` [Qemu-devel] [PATCH 4/9] hw/xtensa/xtfpga: use symbolic constants for bootparam tags Max Filippov
@ 2014-06-23 16:12 ` Max Filippov
2014-06-23 16:12 ` [Qemu-devel] [PATCH 6/9] hw/xtensa/xtfpga: add memory info to bootparam Max Filippov
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Max Filippov @ 2014-06-23 16:12 UTC (permalink / raw)
To: qemu-devel; +Cc: Max Filippov, Waldemar Brodkorb
Separate filling first/last tag and size calculation from the kernel
command line setup.
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
hw/xtensa/bootparam.h | 5 +++++
hw/xtensa/xtfpga.c | 28 ++++++++++++++++------------
2 files changed, 21 insertions(+), 12 deletions(-)
diff --git a/hw/xtensa/bootparam.h b/hw/xtensa/bootparam.h
index e6cf3b1..e839bee 100644
--- a/hw/xtensa/bootparam.h
+++ b/hw/xtensa/bootparam.h
@@ -16,6 +16,11 @@ typedef struct BpTag {
uint16_t size;
} BpTag;
+static inline size_t get_tag_size(size_t data_size)
+{
+ return data_size + sizeof(BpTag) + 4;
+}
+
static inline ram_addr_t put_tag(ram_addr_t addr, uint16_t tag,
size_t size, const void *data)
{
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 6d070b0..689d078 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -237,26 +237,30 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
/* Use presence of kernel file name as 'boot from SRAM' switch. */
if (kernel_filename) {
+ size_t bp_size = 2 * get_tag_size(0);
+ uint32_t tagptr = 0xfe000000 + board->sram_size;
+ uint32_t cur_tagptr;
+
rom = g_malloc(sizeof(*rom));
memory_region_init_ram(rom, NULL, "lx60.sram", board->sram_size);
vmstate_register_ram_global(rom);
memory_region_add_subregion(system_memory, 0xfe000000, rom);
+ if (kernel_cmdline) {
+ bp_size += get_tag_size(strlen(kernel_cmdline) + 1);
+ }
+
/* Put kernel bootparameters to the end of that SRAM */
+ tagptr = (tagptr - bp_size) & ~0xff;
+ cur_tagptr = put_tag(tagptr, BP_TAG_FIRST, 0, NULL);
+
if (kernel_cmdline) {
- size_t cmdline_size = strlen(kernel_cmdline) + 1;
- size_t bp_size = sizeof(BpTag[4]) + cmdline_size;
- uint32_t tagptr = (0xfe000000 + board->sram_size - bp_size) & ~0xff;
-
- env->regs[2] = tagptr;
-
- tagptr = put_tag(tagptr, BP_TAG_FIRST, 0, NULL);
- if (cmdline_size > 1) {
- tagptr = put_tag(tagptr, BP_TAG_COMMAND_LINE,
- cmdline_size, kernel_cmdline);
- }
- tagptr = put_tag(tagptr, BP_TAG_LAST, 0, NULL);
+ cur_tagptr = put_tag(cur_tagptr, BP_TAG_COMMAND_LINE,
+ strlen(kernel_cmdline) + 1, kernel_cmdline);
}
+ cur_tagptr = put_tag(cur_tagptr, BP_TAG_LAST, 0, NULL);
+ env->regs[2] = tagptr;
+
uint64_t elf_entry;
uint64_t elf_lowaddr;
int success = load_elf(kernel_filename, translate_phys_addr, cpu,
--
1.8.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 6/9] hw/xtensa/xtfpga: add memory info to bootparam
2014-06-23 16:12 [Qemu-devel] [PATCH 0/9] target-xtensa: linux booting improvements Max Filippov
` (4 preceding siblings ...)
2014-06-23 16:12 ` [Qemu-devel] [PATCH 5/9] hw/xtensa/xtfpga: refactor bootparameters filling Max Filippov
@ 2014-06-23 16:12 ` Max Filippov
2014-06-23 16:12 ` [Qemu-devel] [PATCH 7/9] hw/xtensa/xtfpga: implement uImage loading Max Filippov
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Max Filippov @ 2014-06-23 16:12 UTC (permalink / raw)
To: qemu-devel; +Cc: Max Filippov, Waldemar Brodkorb
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
hw/xtensa/bootparam.h | 9 +++++++++
hw/xtensa/xtfpga.c | 9 ++++++++-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/hw/xtensa/bootparam.h b/hw/xtensa/bootparam.h
index e839bee..955f4e8 100644
--- a/hw/xtensa/bootparam.h
+++ b/hw/xtensa/bootparam.h
@@ -16,6 +16,15 @@ typedef struct BpTag {
uint16_t size;
} BpTag;
+typedef struct BpMemInfo {
+ uint32_t type;
+ uint32_t start;
+ uint32_t end;
+} BpMemInfo;
+
+#define MEMORY_TYPE_CONVENTIONAL 0x1000
+#define MEMORY_TYPE_NONE 0x2000
+
static inline size_t get_tag_size(size_t data_size)
{
return data_size + sizeof(BpTag) + 4;
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 689d078..97e5842 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -237,9 +237,14 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
/* Use presence of kernel file name as 'boot from SRAM' switch. */
if (kernel_filename) {
- size_t bp_size = 2 * get_tag_size(0);
+ size_t bp_size = 3 * get_tag_size(0); /* first/last and memory tags */
uint32_t tagptr = 0xfe000000 + board->sram_size;
uint32_t cur_tagptr;
+ BpMemInfo memory_location = {
+ .type = tswap32(MEMORY_TYPE_CONVENTIONAL),
+ .start = tswap32(0),
+ .end = tswap32(machine->ram_size),
+ };
rom = g_malloc(sizeof(*rom));
memory_region_init_ram(rom, NULL, "lx60.sram", board->sram_size);
@@ -253,6 +258,8 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
/* Put kernel bootparameters to the end of that SRAM */
tagptr = (tagptr - bp_size) & ~0xff;
cur_tagptr = put_tag(tagptr, BP_TAG_FIRST, 0, NULL);
+ cur_tagptr = put_tag(cur_tagptr, BP_TAG_MEMORY,
+ sizeof(memory_location), &memory_location);
if (kernel_cmdline) {
cur_tagptr = put_tag(cur_tagptr, BP_TAG_COMMAND_LINE,
--
1.8.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 7/9] hw/xtensa/xtfpga: implement uImage loading
2014-06-23 16:12 [Qemu-devel] [PATCH 0/9] target-xtensa: linux booting improvements Max Filippov
` (5 preceding siblings ...)
2014-06-23 16:12 ` [Qemu-devel] [PATCH 6/9] hw/xtensa/xtfpga: add memory info to bootparam Max Filippov
@ 2014-06-23 16:12 ` Max Filippov
2014-06-23 16:12 ` [Qemu-devel] [PATCH 8/9] hw/xtensa/xtfpga: implement DTB loading Max Filippov
2014-06-23 16:12 ` [Qemu-devel] [PATCH 9/9] hw/xtensa/xtfpga: implement initrd loading Max Filippov
8 siblings, 0 replies; 10+ messages in thread
From: Max Filippov @ 2014-06-23 16:12 UTC (permalink / raw)
To: qemu-devel; +Cc: Max Filippov, Waldemar Brodkorb
Provide a simple bootloader code at the reset address that jumps to the
loaded image entry point when it's not equal to the reset address. This
is needed because the old method of setting pc doesn't work due to cpu
reset done after the machine setup.
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
hw/xtensa/xtfpga.c | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 97e5842..0e0d825 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -237,6 +237,7 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
/* Use presence of kernel file name as 'boot from SRAM' switch. */
if (kernel_filename) {
+ uint32_t entry_point = env->pc;
size_t bp_size = 3 * get_tag_size(0); /* first/last and memory tags */
uint32_t tagptr = 0xfe000000 + board->sram_size;
uint32_t cur_tagptr;
@@ -273,7 +274,29 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
int success = load_elf(kernel_filename, translate_phys_addr, cpu,
&elf_entry, &elf_lowaddr, NULL, be, ELF_MACHINE, 0);
if (success > 0) {
- env->pc = elf_entry;
+ entry_point = elf_entry;
+ } else {
+ hwaddr ep;
+ int is_linux;
+ success = load_uimage(kernel_filename, &ep, NULL, &is_linux);
+ if (success > 0 && is_linux) {
+ entry_point = ep;
+ } else {
+ error_report("could not load kernel '%s'\n",
+ kernel_filename);
+ exit(EXIT_FAILURE);
+ }
+ }
+ if (entry_point != env->pc) {
+ static const uint8_t jx_a0[] = {
+#ifdef TARGET_WORDS_BIGENDIAN
+ 0x0a, 0, 0,
+#else
+ 0xa0, 0, 0,
+#endif
+ };
+ env->regs[0] = entry_point;
+ cpu_physical_memory_write(env->pc, jx_a0, sizeof(jx_a0));
}
} else {
if (flash) {
--
1.8.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 8/9] hw/xtensa/xtfpga: implement DTB loading
2014-06-23 16:12 [Qemu-devel] [PATCH 0/9] target-xtensa: linux booting improvements Max Filippov
` (6 preceding siblings ...)
2014-06-23 16:12 ` [Qemu-devel] [PATCH 7/9] hw/xtensa/xtfpga: implement uImage loading Max Filippov
@ 2014-06-23 16:12 ` Max Filippov
2014-06-23 16:12 ` [Qemu-devel] [PATCH 9/9] hw/xtensa/xtfpga: implement initrd loading Max Filippov
8 siblings, 0 replies; 10+ messages in thread
From: Max Filippov @ 2014-06-23 16:12 UTC (permalink / raw)
To: qemu-devel; +Cc: Max Filippov, Waldemar Brodkorb
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
hw/xtensa/xtfpga.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 0e0d825..01825d6 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -37,6 +37,7 @@
#include "hw/block/flash.h"
#include "sysemu/blockdev.h"
#include "sysemu/char.h"
+#include "sysemu/device_tree.h"
#include "qemu/error-report.h"
#include "bootparam.h"
@@ -178,6 +179,7 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
const char *cpu_model = machine->cpu_model;
const char *kernel_filename = qemu_opt_get(machine_opts, "kernel");
const char *kernel_cmdline = qemu_opt_get(machine_opts, "append");
+ const char *dtb_filename = qemu_opt_get(machine_opts, "dtb");
int n;
if (!cpu_model) {
@@ -246,6 +248,9 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
.start = tswap32(0),
.end = tswap32(machine->ram_size),
};
+ uint32_t lowmem_end = machine->ram_size < 0x08000000 ?
+ machine->ram_size : 0x08000000;
+ uint32_t cur_lowmem = QEMU_ALIGN_UP(lowmem_end / 2, 4096);
rom = g_malloc(sizeof(*rom));
memory_region_init_ram(rom, NULL, "lx60.sram", board->sram_size);
@@ -255,6 +260,9 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
if (kernel_cmdline) {
bp_size += get_tag_size(strlen(kernel_cmdline) + 1);
}
+ if (dtb_filename) {
+ bp_size += get_tag_size(sizeof(uint32_t));
+ }
/* Put kernel bootparameters to the end of that SRAM */
tagptr = (tagptr - bp_size) & ~0xff;
@@ -266,6 +274,21 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
cur_tagptr = put_tag(cur_tagptr, BP_TAG_COMMAND_LINE,
strlen(kernel_cmdline) + 1, kernel_cmdline);
}
+ if (dtb_filename) {
+ int fdt_size;
+ void *fdt = load_device_tree(dtb_filename, &fdt_size);
+ uint32_t dtb_addr = tswap32(cur_lowmem);
+
+ if (!fdt) {
+ error_report("could not load DTB '%s'\n", dtb_filename);
+ exit(EXIT_FAILURE);
+ }
+
+ cpu_physical_memory_write(cur_lowmem, fdt, fdt_size);
+ cur_tagptr = put_tag(cur_tagptr, BP_TAG_FDT,
+ sizeof(dtb_addr), &dtb_addr);
+ cur_lowmem = QEMU_ALIGN_UP(cur_lowmem + fdt_size, 4096);
+ }
cur_tagptr = put_tag(cur_tagptr, BP_TAG_LAST, 0, NULL);
env->regs[2] = tagptr;
--
1.8.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 9/9] hw/xtensa/xtfpga: implement initrd loading
2014-06-23 16:12 [Qemu-devel] [PATCH 0/9] target-xtensa: linux booting improvements Max Filippov
` (7 preceding siblings ...)
2014-06-23 16:12 ` [Qemu-devel] [PATCH 8/9] hw/xtensa/xtfpga: implement DTB loading Max Filippov
@ 2014-06-23 16:12 ` Max Filippov
8 siblings, 0 replies; 10+ messages in thread
From: Max Filippov @ 2014-06-23 16:12 UTC (permalink / raw)
To: qemu-devel; +Cc: Max Filippov, Waldemar Brodkorb
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
hw/xtensa/xtfpga.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 01825d6..a2dff5a 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -180,6 +180,7 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
const char *kernel_filename = qemu_opt_get(machine_opts, "kernel");
const char *kernel_cmdline = qemu_opt_get(machine_opts, "append");
const char *dtb_filename = qemu_opt_get(machine_opts, "dtb");
+ const char *initrd_filename = qemu_opt_get(machine_opts, "initrd");
int n;
if (!cpu_model) {
@@ -263,6 +264,9 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
if (dtb_filename) {
bp_size += get_tag_size(sizeof(uint32_t));
}
+ if (initrd_filename) {
+ bp_size += get_tag_size(sizeof(BpMemInfo));
+ }
/* Put kernel bootparameters to the end of that SRAM */
tagptr = (tagptr - bp_size) & ~0xff;
@@ -289,6 +293,26 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
sizeof(dtb_addr), &dtb_addr);
cur_lowmem = QEMU_ALIGN_UP(cur_lowmem + fdt_size, 4096);
}
+ if (initrd_filename) {
+ BpMemInfo initrd_location = { 0 };
+ int initrd_size = load_ramdisk(initrd_filename, cur_lowmem,
+ lowmem_end - cur_lowmem);
+
+ if (initrd_size < 0) {
+ initrd_size = load_image_targphys(initrd_filename,
+ cur_lowmem,
+ lowmem_end - cur_lowmem);
+ }
+ if (initrd_size < 0) {
+ error_report("could not load initrd '%s'\n", initrd_filename);
+ exit(EXIT_FAILURE);
+ }
+ initrd_location.start = tswap32(cur_lowmem);
+ initrd_location.end = tswap32(cur_lowmem + initrd_size);
+ cur_tagptr = put_tag(cur_tagptr, BP_TAG_INITRD,
+ sizeof(initrd_location), &initrd_location);
+ cur_lowmem = QEMU_ALIGN_UP(cur_lowmem + initrd_size, 4096);
+ }
cur_tagptr = put_tag(cur_tagptr, BP_TAG_LAST, 0, NULL);
env->regs[2] = tagptr;
--
1.8.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread