Skip to content

Commit eb5f222

Browse files
committed
Merge remote-tracking branch 'remotes/xtensa/tags/20141103-xtensa' into staging
Xtensa fixes and improvements 2014-11-03: - build fixes for cores w/o windowed registers and with profiling interrupts; - fix uImage load address for MMUv2 cores; - add script for automatic core import from xtensa configuration overlay. # gpg: Signature made Sun 02 Nov 2014 22:04:44 GMT using RSA key ID F83FA044 # gpg: Good signature from "Max Filippov <[email protected]>" # gpg: aka "Max Filippov <[email protected]>" * remotes/xtensa/tags/20141103-xtensa: MAINTAINERS: update xtensa boards target-xtensa: fix build for cores w/o windowed registers target-xtensa: add core importing script hw/xtensa/xtfpga: treat uImage load address as virtual hw/core/loader: implement address translation in uimage loader target-xtensa: avoid duplicate timer interrupt delivery target-xtensa: tests: pre-process tests linker script target-xtensa: add definition for XTHAL_INTTYPE_PROFILING Signed-off-by: Peter Maydell <[email protected]>
2 parents 7135781 + 437a8c1 commit eb5f222

File tree

19 files changed

+249
-146
lines changed

19 files changed

+249
-146
lines changed

MAINTAINERS

+4-3
Original file line numberDiff line numberDiff line change
@@ -583,12 +583,13 @@ Xtensa Machines
583583
sim
584584
M: Max Filippov <[email protected]>
585585
S: Maintained
586-
F: hw/xtensa/xtensa_sim.c
586+
F: hw/xtensa/sim.c
587587

588-
Avnet LX60
588+
XTFPGA (LX60, LX200, ML605, KC705)
589589
M: Max Filippov <[email protected]>
590590
S: Maintained
591-
F: hw/xtensa/xtensa_lx60.c
591+
F: hw/xtensa/xtfpga.c
592+
F: hw/net/opencores_eth.c
592593

593594
Devices
594595
-------

hw/arm/boot.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,7 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
580580
entry = elf_entry;
581581
if (kernel_size < 0) {
582582
kernel_size = load_uimage(info->kernel_filename, &entry, NULL,
583-
&is_linux);
583+
&is_linux, NULL, NULL);
584584
}
585585
/* On aarch64, it's the bootloader's job to uncompress the kernel. */
586586
if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64) && kernel_size < 0) {

hw/core/loader.c

+13-4
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,9 @@ static ssize_t gunzip(void *dst, size_t dstlen, uint8_t *src,
477477

478478
/* Load a U-Boot image. */
479479
static int load_uboot_image(const char *filename, hwaddr *ep, hwaddr *loadaddr,
480-
int *is_linux, uint8_t image_type)
480+
int *is_linux, uint8_t image_type,
481+
uint64_t (*translate_fn)(void *, uint64_t),
482+
void *translate_opaque)
481483
{
482484
int fd;
483485
int size;
@@ -511,6 +513,9 @@ static int load_uboot_image(const char *filename, hwaddr *ep, hwaddr *loadaddr,
511513
switch (hdr->ih_type) {
512514
case IH_TYPE_KERNEL:
513515
address = hdr->ih_load;
516+
if (translate_fn) {
517+
address = translate_fn(translate_opaque, address);
518+
}
514519
if (loadaddr) {
515520
*loadaddr = hdr->ih_load;
516521
}
@@ -587,15 +592,19 @@ static int load_uboot_image(const char *filename, hwaddr *ep, hwaddr *loadaddr,
587592
}
588593

589594
int load_uimage(const char *filename, hwaddr *ep, hwaddr *loadaddr,
590-
int *is_linux)
595+
int *is_linux,
596+
uint64_t (*translate_fn)(void *, uint64_t),
597+
void *translate_opaque)
591598
{
592-
return load_uboot_image(filename, ep, loadaddr, is_linux, IH_TYPE_KERNEL);
599+
return load_uboot_image(filename, ep, loadaddr, is_linux, IH_TYPE_KERNEL,
600+
translate_fn, translate_opaque);
593601
}
594602

595603
/* Load a ramdisk. */
596604
int load_ramdisk(const char *filename, hwaddr addr, uint64_t max_sz)
597605
{
598-
return load_uboot_image(filename, NULL, &addr, NULL, IH_TYPE_RAMDISK);
606+
return load_uboot_image(filename, NULL, &addr, NULL, IH_TYPE_RAMDISK,
607+
NULL, NULL);
599608
}
600609

601610
/* This simply prevents g_malloc in the function below from allocating

hw/m68k/an5206.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ static void an5206_init(MachineState *machine)
7474
NULL, NULL, 1, ELF_MACHINE, 0);
7575
entry = elf_entry;
7676
if (kernel_size < 0) {
77-
kernel_size = load_uimage(kernel_filename, &entry, NULL, NULL);
77+
kernel_size = load_uimage(kernel_filename, &entry, NULL, NULL,
78+
NULL, NULL);
7879
}
7980
if (kernel_size < 0) {
8081
kernel_size = load_image_targphys(kernel_filename, KERNEL_LOAD_ADDR,

hw/m68k/dummy_m68k.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ static void dummy_m68k_init(MachineState *machine)
5050
NULL, NULL, 1, ELF_MACHINE, 0);
5151
entry = elf_entry;
5252
if (kernel_size < 0) {
53-
kernel_size = load_uimage(kernel_filename, &entry, NULL, NULL);
53+
kernel_size = load_uimage(kernel_filename, &entry, NULL, NULL,
54+
NULL, NULL);
5455
}
5556
if (kernel_size < 0) {
5657
kernel_size = load_image_targphys(kernel_filename,

hw/m68k/mcf5208.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,8 @@ static void mcf5208evb_init(MachineState *machine)
279279
NULL, NULL, 1, ELF_MACHINE, 0);
280280
entry = elf_entry;
281281
if (kernel_size < 0) {
282-
kernel_size = load_uimage(kernel_filename, &entry, NULL, NULL);
282+
kernel_size = load_uimage(kernel_filename, &entry, NULL, NULL,
283+
NULL, NULL);
283284
}
284285
if (kernel_size < 0) {
285286
kernel_size = load_image_targphys(kernel_filename, 0x40000000,

hw/microblaze/boot.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ void microblaze_load_kernel(MicroBlazeCPU *cpu, hwaddr ddr_base,
154154
if (kernel_size < 0) {
155155
hwaddr uentry, loadaddr;
156156

157-
kernel_size = load_uimage(kernel_filename, &uentry, &loadaddr, 0);
157+
kernel_size = load_uimage(kernel_filename, &uentry, &loadaddr, 0,
158+
NULL, NULL);
158159
boot_info.bootstrap_pc = uentry;
159160
high = (loadaddr + kernel_size + 3) & ~3;
160161
}

hw/openrisc/openrisc_sim.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ static void cpu_openrisc_load_kernel(ram_addr_t ram_size,
7272
entry = elf_entry;
7373
if (kernel_size < 0) {
7474
kernel_size = load_uimage(kernel_filename,
75-
&entry, NULL, NULL);
75+
&entry, NULL, NULL, NULL, NULL);
7676
}
7777
if (kernel_size < 0) {
7878
kernel_size = load_image_targphys(kernel_filename,

hw/ppc/e500.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -830,7 +830,8 @@ void ppce500_init(MachineState *machine, PPCE500Params *params)
830830
* Hrm. No ELF image? Try a uImage, maybe someone is giving us an
831831
* ePAPR compliant kernel
832832
*/
833-
kernel_size = load_uimage(filename, &bios_entry, &loadaddr, NULL);
833+
kernel_size = load_uimage(filename, &bios_entry, &loadaddr, NULL,
834+
NULL, NULL);
834835
if (kernel_size < 0) {
835836
fprintf(stderr, "qemu: could not load firmware '%s'\n", filename);
836837
exit(1);

hw/ppc/ppc440_bamboo.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,8 @@ static void bamboo_init(MachineState *machine)
253253

254254
/* Load kernel. */
255255
if (kernel_filename) {
256-
success = load_uimage(kernel_filename, &entry, &loadaddr, NULL);
256+
success = load_uimage(kernel_filename, &entry, &loadaddr, NULL,
257+
NULL, NULL);
257258
if (success < 0) {
258259
success = load_elf(kernel_filename, NULL, NULL, &elf_entry,
259260
&elf_lowaddr, NULL, 1, ELF_MACHINE, 0);

hw/xtensa/pic_cpu.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@
3131

3232
void xtensa_advance_ccount(CPUXtensaState *env, uint32_t d)
3333
{
34-
uint32_t old_ccount = env->sregs[CCOUNT];
34+
uint32_t old_ccount = env->sregs[CCOUNT] + 1;
3535

3636
env->sregs[CCOUNT] += d;
3737

3838
if (xtensa_option_enabled(env->config, XTENSA_OPTION_TIMER_INTERRUPT)) {
3939
int i;
4040
for (i = 0; i < env->config->nccompare; ++i) {
41-
if (env->sregs[CCOMPARE + i] - old_ccount <= d) {
41+
if (env->sregs[CCOMPARE + i] - old_ccount < d) {
4242
xtensa_timer_irq(env, i, 1);
4343
}
4444
}

hw/xtensa/xtfpga.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,8 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
328328
} else {
329329
hwaddr ep;
330330
int is_linux;
331-
success = load_uimage(kernel_filename, &ep, NULL, &is_linux);
331+
success = load_uimage(kernel_filename, &ep, NULL, &is_linux,
332+
translate_phys_addr, cpu);
332333
if (success > 0 && is_linux) {
333334
entry_point = ep;
334335
} else {

include/hw/loader.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ int load_elf(const char *filename, uint64_t (*translate_fn)(void *, uint64_t),
3030
int load_aout(const char *filename, hwaddr addr, int max_sz,
3131
int bswap_needed, hwaddr target_page_size);
3232
int load_uimage(const char *filename, hwaddr *ep,
33-
hwaddr *loadaddr, int *is_linux);
33+
hwaddr *loadaddr, int *is_linux,
34+
uint64_t (*translate_fn)(void *, uint64_t),
35+
void *translate_opaque);
3436

3537
/**
3638
* load_ramdisk:

target-xtensa/cpu.h

+1
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ typedef enum {
266266
INTTYPE_TIMER,
267267
INTTYPE_DEBUG,
268268
INTTYPE_WRITE_ERR,
269+
INTTYPE_PROFILING,
269270
INTTYPE_MAX
270271
} interrupt_type;
271272

target-xtensa/import_core.sh

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#! /bin/bash -e
2+
3+
OVERLAY="$1"
4+
NAME="$2"
5+
FREQ=40000
6+
BASE=$(dirname "$0")
7+
TARGET="$BASE"/core-$NAME
8+
9+
[ $# -ge 2 -a -f "$OVERLAY" ] || { cat <<EOF
10+
Usage: $0 overlay-archive-to-import core-name [frequency-in-KHz]
11+
overlay-archive-to-import: file name of xtensa-config-overlay.tar.gz
12+
to import configuration from.
13+
core-name: QEMU name of the imported core. Must be valid
14+
C identifier.
15+
frequency-in-KHz: core frequency (40MHz if not specified).
16+
EOF
17+
exit
18+
}
19+
20+
[ $# -ge 3 ] && FREQ="$3"
21+
mkdir -p "$TARGET"
22+
tar -xf "$OVERLAY" -C "$TARGET" --strip-components=1 \
23+
--xform='s/core/core-isa/' config/core.h
24+
tar -xf "$OVERLAY" -O gdb/xtensa-config.c | \
25+
sed -n '1,/*\//p;/pc/,/a15/p' > "$TARGET"/gdb-config.c
26+
NUM_REGS=$(grep XTREG "$TARGET"/gdb-config.c | wc -l)
27+
28+
cat <<EOF > "${TARGET}.c"
29+
#include "cpu.h"
30+
#include "exec/exec-all.h"
31+
#include "exec/gdbstub.h"
32+
#include "qemu/host-utils.h"
33+
34+
#include "core-$NAME/core-isa.h"
35+
#include "overlay_tool.h"
36+
37+
static const XtensaConfig $NAME __attribute__((unused)) = {
38+
.name = "$NAME",
39+
.gdb_regmap = {
40+
.num_regs = $NUM_REGS,
41+
.reg = {
42+
#include "core-$NAME/gdb-config.c"
43+
}
44+
},
45+
.clock_freq_khz = $FREQ,
46+
DEFAULT_SECTIONS
47+
};
48+
49+
REGISTER_CORE($NAME)
50+
EOF
51+
52+
grep -q core-${NAME}.o "$BASE"/Makefile.objs || \
53+
echo "obj-y += core-${NAME}.o" >> "$BASE"/Makefile.objs

target-xtensa/overlay_tool.h

+20-12
Original file line numberDiff line numberDiff line change
@@ -108,20 +108,27 @@
108108
#define XCHAL_WINDOW_UF12_VECOFS 0x00000140
109109
#endif
110110

111+
#if XCHAL_HAVE_WINDOWED
112+
#define WINDOW_VECTORS \
113+
[EXC_WINDOW_OVERFLOW4] = XCHAL_WINDOW_OF4_VECOFS + \
114+
XCHAL_WINDOW_VECTORS_VADDR, \
115+
[EXC_WINDOW_UNDERFLOW4] = XCHAL_WINDOW_UF4_VECOFS + \
116+
XCHAL_WINDOW_VECTORS_VADDR, \
117+
[EXC_WINDOW_OVERFLOW8] = XCHAL_WINDOW_OF8_VECOFS + \
118+
XCHAL_WINDOW_VECTORS_VADDR, \
119+
[EXC_WINDOW_UNDERFLOW8] = XCHAL_WINDOW_UF8_VECOFS + \
120+
XCHAL_WINDOW_VECTORS_VADDR, \
121+
[EXC_WINDOW_OVERFLOW12] = XCHAL_WINDOW_OF12_VECOFS + \
122+
XCHAL_WINDOW_VECTORS_VADDR, \
123+
[EXC_WINDOW_UNDERFLOW12] = XCHAL_WINDOW_UF12_VECOFS + \
124+
XCHAL_WINDOW_VECTORS_VADDR,
125+
#else
126+
#define WINDOW_VECTORS
127+
#endif
128+
111129
#define EXCEPTION_VECTORS { \
112130
[EXC_RESET] = XCHAL_RESET_VECTOR_VADDR, \
113-
[EXC_WINDOW_OVERFLOW4] = XCHAL_WINDOW_OF4_VECOFS + \
114-
XCHAL_WINDOW_VECTORS_VADDR, \
115-
[EXC_WINDOW_UNDERFLOW4] = XCHAL_WINDOW_UF4_VECOFS + \
116-
XCHAL_WINDOW_VECTORS_VADDR, \
117-
[EXC_WINDOW_OVERFLOW8] = XCHAL_WINDOW_OF8_VECOFS + \
118-
XCHAL_WINDOW_VECTORS_VADDR, \
119-
[EXC_WINDOW_UNDERFLOW8] = XCHAL_WINDOW_UF8_VECOFS + \
120-
XCHAL_WINDOW_VECTORS_VADDR, \
121-
[EXC_WINDOW_OVERFLOW12] = XCHAL_WINDOW_OF12_VECOFS + \
122-
XCHAL_WINDOW_VECTORS_VADDR, \
123-
[EXC_WINDOW_UNDERFLOW12] = XCHAL_WINDOW_UF12_VECOFS + \
124-
XCHAL_WINDOW_VECTORS_VADDR, \
131+
WINDOW_VECTORS \
125132
[EXC_KERNEL] = XCHAL_KERNEL_VECTOR_VADDR, \
126133
[EXC_USER] = XCHAL_USER_VECTOR_VADDR, \
127134
[EXC_DOUBLE] = XCHAL_DOUBLEEXC_VECTOR_VADDR, \
@@ -163,6 +170,7 @@
163170
#define XTHAL_INTTYPE_TBD1 INTTYPE_DEBUG
164171
#define XTHAL_INTTYPE_TBD2 INTTYPE_WRITE_ERR
165172
#define XTHAL_INTTYPE_WRITE_ERROR INTTYPE_WRITE_ERR
173+
#define XTHAL_INTTYPE_PROFILING INTTYPE_PROFILING
166174

167175

168176
#define INTERRUPT(i) { \

tests/tcg/xtensa/Makefile

+7-3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ SIMFLAGS = --xtensa-core=DC_B_232L --exit_with_target_code $(EXTFLAGS)
1313
SIMDEBUG = --gdbserve=0
1414
endif
1515

16+
HOST_CC = gcc
1617
CC = $(CROSS)gcc
1718
AS = $(CROSS)gcc -x assembler-with-cpp
1819
LD = $(CROSS)ld
@@ -21,7 +22,7 @@ XTENSA_SRC_PATH = $(SRC_PATH)/tests/tcg/xtensa
2122
INCLUDE_DIRS = $(XTENSA_SRC_PATH) $(SRC_PATH)/target-xtensa/core-$(CORE)
2223
XTENSA_INC = $(addprefix -I,$(INCLUDE_DIRS))
2324

24-
LDFLAGS = -T$(XTENSA_SRC_PATH)/linker.ld
25+
LDFLAGS = -Tlinker.ld
2526

2627
CRT = crt.o vectors.o
2728

@@ -59,13 +60,16 @@ TESTCASES += test_windowed.tst
5960

6061
all: build
6162

63+
linker.ld: $(XTENSA_SRC_PATH)/linker.ld.S
64+
$(HOST_CC) $(XTENSA_INC) -E -P $< -o $@
65+
6266
%.o: $(XTENSA_SRC_PATH)/%.c
6367
$(CC) $(XTENSA_INC) $(CFLAGS) -c $< -o $@
6468

6569
%.o: $(XTENSA_SRC_PATH)/%.S
6670
$(CC) $(XTENSA_INC) $(ASFLAGS) -c $< -o $@
6771

68-
%.tst: %.o $(XTENSA_SRC_PATH)/macros.inc $(CRT) Makefile
72+
%.tst: %.o linker.ld $(XTENSA_SRC_PATH)/macros.inc $(CRT) Makefile
6973
$(LD) $(LDFLAGS) $(NOSTDFLAGS) $(CRT) $< -o $@
7074

7175
build: $(TESTCASES)
@@ -85,4 +89,4 @@ host-debug-%.tst: %.tst
8589
gdb --args $(SIM) $(SIMFLAGS) ./$<
8690

8791
clean:
88-
$(RM) -fr $(TESTCASES) $(CRT)
92+
$(RM) -fr $(TESTCASES) $(CRT) linker.ld

0 commit comments

Comments
 (0)