target/xtensa fixes for 2.9:
- fix build failure when FDT support is not enabled; - correctly pass command line arguments to semihosting guests. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJYzCdpAAoJEFH5zJH4P6BEOvkP/3sVwQeNKj/eqSDWu5pdOKSL uyEDIp5yzzJZmwZ96QOP0NPR0J2KthvP4IfwPBy0IbsX1bvqJGT8fMT2cx7Fgx/A qstsxHZ+yDp4OjKSWMPI1KGO0HaSop22oNRMpM0ywYgGer69g4zlqzI5/7aDaXSK d9HcnDhHTpS+5sFPU8qf4Enlkw9pMDkaLKGWVc7E8AW5DAqs7vaXCca33ZE3DJ08 c//TM2zcNTcyACsqBp1jny+BdiP9api7Qe6fgFvmXGMdR3zR4xcTEOTMVde0hy9i YIDLvacp2FA0JOvFmvdhmi/5WRZu/A8pOG+1d8QU91x5WBxjS9MtEGhrewE4T7m6 YS5eeX5xnQ15g3YCqjHYiE4D1pDQ6a2vl8cy1S1tHb6k2tEOvHhNC8Yg4k8Kov1g tHw4WBhr/GSOU5M51qeOXwhU3FX6FqAUf691N7YngiSMkEGau84F11fKt0aRKR3A vMN4S3MdHSvuOc4sa+tBodkdc25v5esR+ga40cVdIVM45zno2Pmr1hCH9RNP4vWx W5d4vF2cO24qVFo7B9Tm8JlmWgFFYBJzcNjtf9Cd1ts7R4Mi7DmSBGT0by/sZhS9 dSKTPf8jIwSpeLWJ19WaKvJdD1PacXFZaKMWdZ16BWCVMXtCMRezx40ffJ3yuJIc Q758ze1uizJKC+xJg6Hz =Pqza -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/xtensa/tags/20170317-xtensa' into staging target/xtensa fixes for 2.9: - fix build failure when FDT support is not enabled; - correctly pass command line arguments to semihosting guests. # gpg: Signature made Fri 17 Mar 2017 18:14:01 GMT # gpg: using RSA key 0x51F9CC91F83FA044 # gpg: Good signature from "Max Filippov <filippov@cadence.com>" # gpg: aka "Max Filippov <max.filippov@cogentembedded.com>" # gpg: aka "Max Filippov <jcmvbkbc@gmail.com>" # Primary key fingerprint: 2B67 854B 98E5 327D CDEB 17D8 51F9 CC91 F83F A044 * remotes/xtensa/tags/20170317-xtensa: target/xtensa: fix semihosting argc/argv implementation target/xtensa: xtfpga: load DTB only when FDT support is enabled Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
96dd9c89c1
|
@ -317,6 +317,7 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
|
||||||
cur_tagptr = put_tag(cur_tagptr, BP_TAG_COMMAND_LINE,
|
cur_tagptr = put_tag(cur_tagptr, BP_TAG_COMMAND_LINE,
|
||||||
strlen(kernel_cmdline) + 1, kernel_cmdline);
|
strlen(kernel_cmdline) + 1, kernel_cmdline);
|
||||||
}
|
}
|
||||||
|
#ifdef CONFIG_FDT
|
||||||
if (dtb_filename) {
|
if (dtb_filename) {
|
||||||
int fdt_size;
|
int fdt_size;
|
||||||
void *fdt = load_device_tree(dtb_filename, &fdt_size);
|
void *fdt = load_device_tree(dtb_filename, &fdt_size);
|
||||||
|
@ -332,6 +333,14 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
|
||||||
sizeof(dtb_addr), &dtb_addr);
|
sizeof(dtb_addr), &dtb_addr);
|
||||||
cur_lowmem = QEMU_ALIGN_UP(cur_lowmem + fdt_size, 4096);
|
cur_lowmem = QEMU_ALIGN_UP(cur_lowmem + fdt_size, 4096);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (dtb_filename) {
|
||||||
|
error_report("could not load DTB '%s': "
|
||||||
|
"FDT support is not configured in QEMU",
|
||||||
|
dtb_filename);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (initrd_filename) {
|
if (initrd_filename) {
|
||||||
BpMemInfo initrd_location = { 0 };
|
BpMemInfo initrd_location = { 0 };
|
||||||
int initrd_size = load_ramdisk(initrd_filename, cur_lowmem,
|
int initrd_size = load_ramdisk(initrd_filename, cur_lowmem,
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
|
#include "exec/semihost.h"
|
||||||
#include "qemu/log.h"
|
#include "qemu/log.h"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -261,28 +262,50 @@ void HELPER(simcall)(CPUXtensaState *env)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TARGET_SYS_argc:
|
case TARGET_SYS_argc:
|
||||||
regs[2] = 1;
|
regs[2] = semihosting_get_argc();
|
||||||
regs[3] = 0;
|
regs[3] = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TARGET_SYS_argv_sz:
|
case TARGET_SYS_argv_sz:
|
||||||
regs[2] = 128;
|
{
|
||||||
|
int argc = semihosting_get_argc();
|
||||||
|
int sz = (argc + 1) * sizeof(uint32_t);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < argc; ++i) {
|
||||||
|
sz += 1 + strlen(semihosting_get_arg(i));
|
||||||
|
}
|
||||||
|
regs[2] = sz;
|
||||||
regs[3] = 0;
|
regs[3] = 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TARGET_SYS_argv:
|
case TARGET_SYS_argv:
|
||||||
{
|
{
|
||||||
struct Argv {
|
int argc = semihosting_get_argc();
|
||||||
uint32_t argptr[2];
|
int str_offset = (argc + 1) * sizeof(uint32_t);
|
||||||
char text[120];
|
int i;
|
||||||
} argv = {
|
uint32_t argptr;
|
||||||
{0, 0},
|
|
||||||
"test"
|
for (i = 0; i < argc; ++i) {
|
||||||
};
|
const char *str = semihosting_get_arg(i);
|
||||||
|
int str_size = strlen(str) + 1;
|
||||||
|
|
||||||
|
argptr = tswap32(regs[3] + str_offset);
|
||||||
|
|
||||||
argv.argptr[0] = tswap32(regs[3] + offsetof(struct Argv, text));
|
|
||||||
cpu_memory_rw_debug(cs,
|
cpu_memory_rw_debug(cs,
|
||||||
regs[3], (uint8_t *)&argv, sizeof(argv), 1);
|
regs[3] + i * sizeof(uint32_t),
|
||||||
|
(uint8_t *)&argptr, sizeof(argptr), 1);
|
||||||
|
cpu_memory_rw_debug(cs,
|
||||||
|
regs[3] + str_offset,
|
||||||
|
(uint8_t *)str, str_size, 1);
|
||||||
|
str_offset += str_size;
|
||||||
|
}
|
||||||
|
argptr = 0;
|
||||||
|
cpu_memory_rw_debug(cs,
|
||||||
|
regs[3] + i * sizeof(uint32_t),
|
||||||
|
(uint8_t *)&argptr, sizeof(argptr), 1);
|
||||||
|
regs[3] = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue