diff options
author | Tudor Florea <tudor.florea@enea.com> | 2015-10-09 22:59:03 +0200 |
---|---|---|
committer | Tudor Florea <tudor.florea@enea.com> | 2015-10-09 22:59:03 +0200 |
commit | 972dcfcdbfe75dcfeb777150c136576cf1a71e99 (patch) | |
tree | 97a61cd7e293d7ae9d56ef7ed0f81253365bb026 /meta/recipes-devtools/qemu | |
download | poky-972dcfcdbfe75dcfeb777150c136576cf1a71e99.tar.gz |
initial commit for Enea Linux 5.0 arm
Signed-off-by: Tudor Florea <tudor.florea@enea.com>
Diffstat (limited to 'meta/recipes-devtools/qemu')
23 files changed, 1619 insertions, 0 deletions
diff --git a/meta/recipes-devtools/qemu/files/0001-Back-porting-security-fix-CVE-2014-5388.patch b/meta/recipes-devtools/qemu/files/0001-Back-porting-security-fix-CVE-2014-5388.patch new file mode 100644 index 0000000000..ec541fa668 --- /dev/null +++ b/meta/recipes-devtools/qemu/files/0001-Back-porting-security-fix-CVE-2014-5388.patch | |||
@@ -0,0 +1,30 @@ | |||
1 | Prevent out-of-bounds array access on | ||
2 | acpi_pcihp_pci_status. | ||
3 | |||
4 | Upstream-Status: Backport | ||
5 | |||
6 | Signed-off-by: Gonglei <arei.gonglei@huawei.com> | ||
7 | Signed-off-by: Sona Sarmadi <sona.sarmadi@enea.com> | ||
8 | --- | ||
9 | v2: | ||
10 | - change commit message. | ||
11 | - add 'Reviewed-by' | ||
12 | --- | ||
13 | hw/acpi/pcihp.c | 2 +- | ||
14 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
15 | |||
16 | diff --git a/hw/acpi/pcihp.c b/hw/acpi/pcihp.c | ||
17 | index fae663a..34dedf1 100644 | ||
18 | --- a/hw/acpi/pcihp.c | ||
19 | +++ b/hw/acpi/pcihp.c | ||
20 | @@ -231,7 +231,7 @@ static uint64_t pci_read(void *opaque, hwaddr addr, unsigned int size) | ||
21 | uint32_t val = 0; | ||
22 | int bsel = s->hotplug_select; | ||
23 | |||
24 | - if (bsel < 0 || bsel > ACPI_PCIHP_MAX_HOTPLUG_BUS) { | ||
25 | + if (bsel < 0 || bsel >= ACPI_PCIHP_MAX_HOTPLUG_BUS) { | ||
26 | return 0; | ||
27 | } | ||
28 | |||
29 | -- | ||
30 | 1.7.12.4 | ||
diff --git a/meta/recipes-devtools/qemu/files/Qemu-Arm-versatilepb-Add-memory-size-checking.patch b/meta/recipes-devtools/qemu/files/Qemu-Arm-versatilepb-Add-memory-size-checking.patch new file mode 100644 index 0000000000..7f1c5a9058 --- /dev/null +++ b/meta/recipes-devtools/qemu/files/Qemu-Arm-versatilepb-Add-memory-size-checking.patch | |||
@@ -0,0 +1,40 @@ | |||
1 | From 896fa02c24347e6e9259812cfda187b1d6ca6199 Mon Sep 17 00:00:00 2001 | ||
2 | From: Jiang Lu <lu.jiang@windriver.com> | ||
3 | Date: Wed, 13 Nov 2013 10:38:08 +0800 | ||
4 | Subject: [PATCH] Qemu:Arm:versatilepb: Add memory size checking | ||
5 | |||
6 | The machine can not work with memory over 256M, so add a checking | ||
7 | at startup. If the memory size exceed 256M, just stop emulation then | ||
8 | throw out warning about memory limitation. | ||
9 | |||
10 | Upstream-Status: Pending | ||
11 | |||
12 | Signed-off-by: Jiang Lu <lu.jiang@windriver.com> | ||
13 | |||
14 | Updated it on 2014-01-15 for rebasing | ||
15 | |||
16 | Signed-off-by: Robert Yang <liezhi.yang@windriver.com> | ||
17 | --- | ||
18 | hw/arm/versatilepb.c | 6 ++++++ | ||
19 | 1 file changed, 6 insertions(+) | ||
20 | |||
21 | diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c | ||
22 | index b48d84c..ad2cd5a 100644 | ||
23 | --- a/hw/arm/versatilepb.c | ||
24 | +++ b/hw/arm/versatilepb.c | ||
25 | @@ -199,6 +199,12 @@ static void versatile_init(QEMUMachineInitArgs *args, int board_id) | ||
26 | fprintf(stderr, "Unable to find CPU definition\n"); | ||
27 | exit(1); | ||
28 | } | ||
29 | + if (ram_size > (256 << 20)) { | ||
30 | + fprintf(stderr, | ||
31 | + "qemu: Too much memory for this machine: %d MB, maximum 256 MB\n", | ||
32 | + ((unsigned int)ram_size / (1 << 20))); | ||
33 | + exit(1); | ||
34 | + } | ||
35 | memory_region_init_ram(ram, NULL, "versatile.ram", machine->ram_size); | ||
36 | vmstate_register_ram_global(ram); | ||
37 | /* ??? RAM should repeat to fill physical memory space. */ | ||
38 | -- | ||
39 | 1.7.10.4 | ||
40 | |||
diff --git a/meta/recipes-devtools/qemu/files/exclude-some-arm-EABI-obsolete-syscalls.patch b/meta/recipes-devtools/qemu/files/exclude-some-arm-EABI-obsolete-syscalls.patch new file mode 100644 index 0000000000..171bda7e95 --- /dev/null +++ b/meta/recipes-devtools/qemu/files/exclude-some-arm-EABI-obsolete-syscalls.patch | |||
@@ -0,0 +1,93 @@ | |||
1 | [PATCH] exclude some arm EABI obsolete syscalls | ||
2 | |||
3 | Upstream-Status: Pending | ||
4 | |||
5 | some syscalls are obsolete and no longer available for EABI, exclude them to | ||
6 | fix the below error: | ||
7 | In file included from qemu-seccomp.c:16:0: | ||
8 | qemu-seccomp.c:28:7: error: '__NR_select' undeclared here (not in a function) | ||
9 | { SCMP_SYS(select), 252 }, | ||
10 | ^ | ||
11 | qemu-seccomp.c:36:7: error: '__NR_mmap' undeclared here (not in a function) | ||
12 | { SCMP_SYS(mmap), 247 }, | ||
13 | ^ | ||
14 | qemu-seccomp.c:57:7: error: '__NR_getrlimit' undeclared here (not in a function) | ||
15 | { SCMP_SYS(getrlimit), 245 }, | ||
16 | ^ | ||
17 | qemu-seccomp.c:96:7: error: '__NR_time' undeclared here (not in a function) | ||
18 | { SCMP_SYS(time), 245 }, | ||
19 | ^ | ||
20 | qemu-seccomp.c:185:7: error: '__NR_alarm' undeclared here (not in a function) | ||
21 | { SCMP_SYS(alarm), 241 }, | ||
22 | |||
23 | please refer source files: | ||
24 | arch/arm/include/uapi/asm/unistd.h | ||
25 | or kernel header: | ||
26 | /usr/include/asm/unistd.h | ||
27 | |||
28 | Signed-off-by: Roy.Li <rongqing.li@windriver.com> | ||
29 | --- | ||
30 | qemu-seccomp.c | 14 ++++++++------ | ||
31 | 1 file changed, 8 insertions(+), 6 deletions(-) | ||
32 | |||
33 | diff --git a/qemu-seccomp.c b/qemu-seccomp.c | ||
34 | index caa926e..5a78502 100644 | ||
35 | --- a/qemu-seccomp.c | ||
36 | +++ b/qemu-seccomp.c | ||
37 | @@ -25,15 +25,21 @@ static const struct QemuSeccompSyscall seccomp_whitelist[] = { | ||
38 | { SCMP_SYS(timer_settime), 255 }, | ||
39 | { SCMP_SYS(timer_gettime), 254 }, | ||
40 | { SCMP_SYS(futex), 253 }, | ||
41 | +#if !defined(__ARM_EABI__) | ||
42 | { SCMP_SYS(select), 252 }, | ||
43 | + { SCMP_SYS(time), 245 }, | ||
44 | + { SCMP_SYS(alarm), 241 }, | ||
45 | + { SCMP_SYS(getrlimit), 245 }, | ||
46 | + { SCMP_SYS(mmap), 247 }, | ||
47 | + { SCMP_SYS(socketcall), 250 }, | ||
48 | + { SCMP_SYS(ipc), 245 }, | ||
49 | +#endif | ||
50 | { SCMP_SYS(recvfrom), 251 }, | ||
51 | { SCMP_SYS(sendto), 250 }, | ||
52 | - { SCMP_SYS(socketcall), 250 }, | ||
53 | { SCMP_SYS(read), 249 }, | ||
54 | { SCMP_SYS(io_submit), 249 }, | ||
55 | { SCMP_SYS(brk), 248 }, | ||
56 | { SCMP_SYS(clone), 247 }, | ||
57 | - { SCMP_SYS(mmap), 247 }, | ||
58 | { SCMP_SYS(mprotect), 246 }, | ||
59 | { SCMP_SYS(execve), 245 }, | ||
60 | { SCMP_SYS(open), 245 }, | ||
61 | @@ -48,13 +54,11 @@ static const struct QemuSeccompSyscall seccomp_whitelist[] = { | ||
62 | { SCMP_SYS(bind), 245 }, | ||
63 | { SCMP_SYS(listen), 245 }, | ||
64 | { SCMP_SYS(semget), 245 }, | ||
65 | - { SCMP_SYS(ipc), 245 }, | ||
66 | { SCMP_SYS(gettimeofday), 245 }, | ||
67 | { SCMP_SYS(readlink), 245 }, | ||
68 | { SCMP_SYS(access), 245 }, | ||
69 | { SCMP_SYS(prctl), 245 }, | ||
70 | { SCMP_SYS(signalfd), 245 }, | ||
71 | - { SCMP_SYS(getrlimit), 245 }, | ||
72 | { SCMP_SYS(set_tid_address), 245 }, | ||
73 | { SCMP_SYS(statfs), 245 }, | ||
74 | { SCMP_SYS(unlink), 245 }, | ||
75 | @@ -93,7 +97,6 @@ static const struct QemuSeccompSyscall seccomp_whitelist[] = { | ||
76 | { SCMP_SYS(times), 245 }, | ||
77 | { SCMP_SYS(exit), 245 }, | ||
78 | { SCMP_SYS(clock_gettime), 245 }, | ||
79 | - { SCMP_SYS(time), 245 }, | ||
80 | { SCMP_SYS(restart_syscall), 245 }, | ||
81 | { SCMP_SYS(pwrite64), 245 }, | ||
82 | { SCMP_SYS(nanosleep), 245 }, | ||
83 | @@ -182,7 +185,6 @@ static const struct QemuSeccompSyscall seccomp_whitelist[] = { | ||
84 | { SCMP_SYS(lstat64), 241 }, | ||
85 | { SCMP_SYS(sendfile64), 241 }, | ||
86 | { SCMP_SYS(ugetrlimit), 241 }, | ||
87 | - { SCMP_SYS(alarm), 241 }, | ||
88 | { SCMP_SYS(rt_sigsuspend), 241 }, | ||
89 | { SCMP_SYS(rt_sigqueueinfo), 241 }, | ||
90 | { SCMP_SYS(rt_tgsigqueueinfo), 241 }, | ||
91 | -- | ||
92 | 1.9.1 | ||
93 | |||
diff --git a/meta/recipes-devtools/qemu/files/qemu-enlarge-env-entry-size.patch b/meta/recipes-devtools/qemu/files/qemu-enlarge-env-entry-size.patch new file mode 100644 index 0000000000..c7425ab8d4 --- /dev/null +++ b/meta/recipes-devtools/qemu/files/qemu-enlarge-env-entry-size.patch | |||
@@ -0,0 +1,31 @@ | |||
1 | qemu: Add addition environment space to boot loader qemu-system-mips | ||
2 | |||
3 | Upstream-Status: Inappropriate - OE uses deep paths | ||
4 | |||
5 | If you create a project with very long directory names like 128 characters | ||
6 | deep and use NFS, the kernel arguments will be truncated. The kernel will | ||
7 | accept longer strings such as 1024 bytes, but the qemu boot loader defaulted | ||
8 | to only 256 bytes. This patch expands the limit. | ||
9 | |||
10 | Signed-off-by: Jason Wessel <jason.wessel@windriver.com> | ||
11 | Signed-off-by: Roy Li <rongqing.li@windriver.com> | ||
12 | --- | ||
13 | hw/mips/mips_malta.c | 2 +- | ||
14 | 1 files changed, 1 insertions(+), 1 deletions(-) | ||
15 | |||
16 | diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c | ||
17 | index 9d521cc..17c0391 100644 | ||
18 | --- a/hw/mips/mips_malta.c | ||
19 | +++ b/hw/mips/mips_malta.c | ||
20 | @@ -53,7 +53,7 @@ | ||
21 | |||
22 | #define ENVP_ADDR 0x80002000l | ||
23 | #define ENVP_NB_ENTRIES 16 | ||
24 | -#define ENVP_ENTRY_SIZE 256 | ||
25 | +#define ENVP_ENTRY_SIZE 1024 | ||
26 | |||
27 | /* Hardware addresses */ | ||
28 | #define FLASH_ADDRESS 0x1e000000ULL | ||
29 | -- | ||
30 | 1.7.10.4 | ||
31 | |||
diff --git a/meta/recipes-devtools/qemu/nativesdk-qemu-helper_1.0.bb b/meta/recipes-devtools/qemu/nativesdk-qemu-helper_1.0.bb new file mode 100644 index 0000000000..51d1c59699 --- /dev/null +++ b/meta/recipes-devtools/qemu/nativesdk-qemu-helper_1.0.bb | |||
@@ -0,0 +1,47 @@ | |||
1 | SUMMARY = "Qemu helper scripts" | ||
2 | LICENSE = "GPLv2" | ||
3 | RDEPENDS_${PN} = "nativesdk-qemu" | ||
4 | PR = "r9" | ||
5 | |||
6 | |||
7 | LIC_FILES_CHKSUM = "file://${WORKDIR}/tunctl.c;endline=4;md5=ff3a09996bc5fff6bc5d4e0b4c28f999 \ | ||
8 | file://${COREBASE}/scripts/runqemu;endline=18;md5=77fbe442a88b1bcdc29c3ba67733b21b" | ||
9 | |||
10 | |||
11 | SRC_URI = "file://${COREBASE}/scripts/runqemu \ | ||
12 | file://${COREBASE}/scripts/runqemu-internal \ | ||
13 | file://${COREBASE}/scripts/runqemu-addptable2image \ | ||
14 | file://${COREBASE}/scripts/runqemu-gen-tapdevs \ | ||
15 | file://${COREBASE}/scripts/runqemu-ifup \ | ||
16 | file://${COREBASE}/scripts/runqemu-ifdown \ | ||
17 | file://${COREBASE}/scripts/oe-find-native-sysroot \ | ||
18 | file://${COREBASE}/scripts/runqemu-extract-sdk \ | ||
19 | file://${COREBASE}/scripts/runqemu-export-rootfs \ | ||
20 | file://tunctl.c \ | ||
21 | file://raw2flash.c \ | ||
22 | " | ||
23 | |||
24 | S = "${WORKDIR}" | ||
25 | |||
26 | inherit nativesdk | ||
27 | |||
28 | do_compile() { | ||
29 | ${CC} tunctl.c -o tunctl | ||
30 | ${CC} raw2flash.c -o raw2flash.spitz | ||
31 | ${CC} raw2flash.c -o flash2raw.spitz -Dflash2raw | ||
32 | } | ||
33 | |||
34 | do_install() { | ||
35 | install -d ${D}${bindir} | ||
36 | install -m 0755 ${WORKDIR}${COREBASE}/scripts/oe-* ${D}${bindir}/ | ||
37 | install -m 0755 ${WORKDIR}${COREBASE}/scripts/runqemu* ${D}${bindir}/ | ||
38 | install tunctl ${D}${bindir}/ | ||
39 | install raw2flash.spitz ${D}${bindir}/ | ||
40 | install flash2raw.spitz ${D}${bindir}/ | ||
41 | ln -fs raw2flash.spitz ${D}${bindir}/raw2flash.akita | ||
42 | ln -fs raw2flash.spitz ${D}${bindir}/raw2flash.borzoi | ||
43 | ln -fs raw2flash.spitz ${D}${bindir}/raw2flash.terrier | ||
44 | ln -fs flash2raw.spitz ${D}${bindir}/flash2raw.akita | ||
45 | ln -fs flash2raw.spitz ${D}${bindir}/flash2raw.borzoi | ||
46 | ln -fs flash2raw.spitz ${D}${bindir}/flash2raw.terrier | ||
47 | } | ||
diff --git a/meta/recipes-devtools/qemu/qemu-helper-native_1.0.bb b/meta/recipes-devtools/qemu/qemu-helper-native_1.0.bb new file mode 100644 index 0000000000..8d27c4db61 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu-helper-native_1.0.bb | |||
@@ -0,0 +1,21 @@ | |||
1 | SUMMARY = "Helper utilities needed by the runqemu script" | ||
2 | LICENSE = "GPLv2" | ||
3 | RDEPENDS_${PN} = "qemu-native" | ||
4 | PR = "r1" | ||
5 | |||
6 | LIC_FILES_CHKSUM = "file://${WORKDIR}/tunctl.c;endline=4;md5=ff3a09996bc5fff6bc5d4e0b4c28f999" | ||
7 | |||
8 | SRC_URI = "file://tunctl.c" | ||
9 | |||
10 | S = "${WORKDIR}" | ||
11 | |||
12 | inherit native | ||
13 | |||
14 | do_compile() { | ||
15 | ${CC} tunctl.c -o tunctl | ||
16 | } | ||
17 | |||
18 | do_install() { | ||
19 | install -d ${D}${bindir} | ||
20 | install tunctl ${D}${bindir}/ | ||
21 | } | ||
diff --git a/meta/recipes-devtools/qemu/qemu-helper/raw2flash.c b/meta/recipes-devtools/qemu/qemu-helper/raw2flash.c new file mode 100644 index 0000000000..19faf629b9 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu-helper/raw2flash.c | |||
@@ -0,0 +1,370 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2006 OpenedHand Ltd. | ||
3 | * | ||
4 | * This file is licensed under GNU GPL v2. | ||
5 | */ | ||
6 | #include <string.h> | ||
7 | #include <unistd.h> | ||
8 | #include <stdint.h> | ||
9 | #include <stdio.h> | ||
10 | #include <sys/types.h> | ||
11 | #include <stdlib.h> | ||
12 | |||
13 | #define TFR(_) _ | ||
14 | #define VERBOSE | ||
15 | #define PBAR_LEN 40 | ||
16 | |||
17 | #define PARTITION_START 0x00700000 | ||
18 | |||
19 | static const int ecc_pos8[] = { | ||
20 | 0x0, 0x1, 0x2, | ||
21 | }; | ||
22 | |||
23 | static const int ecc_pos16[] = { | ||
24 | 0x0, 0x1, 0x2, 0x3, 0x6, 0x7, | ||
25 | }; | ||
26 | |||
27 | static const int ecc_pos64[] = { | ||
28 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, | ||
29 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
30 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, | ||
31 | }; | ||
32 | |||
33 | static const int ecc_akita[] = { | ||
34 | 0x05, 0x01, 0x02, 0x03, 0x06, 0x07, 0x15, 0x11, | ||
35 | 0x12, 0x13, 0x16, 0x17, 0x25, 0x21, 0x22, 0x23, | ||
36 | 0x26, 0x27, 0x35, 0x31, 0x32, 0x33, 0x36, 0x37, | ||
37 | }; | ||
38 | |||
39 | struct jffs_marker_s { | ||
40 | int pos; | ||
41 | uint8_t value; | ||
42 | }; | ||
43 | |||
44 | static const struct jffs_marker_s free_pos8[] = { | ||
45 | { 0x03, 0xff }, { 0x04, 0xff }, { 0x06, 0x85 }, { 0x07, 0x19 }, | ||
46 | { -1 }, | ||
47 | }; | ||
48 | |||
49 | static const struct jffs_marker_s free_pos16[] = { | ||
50 | { 0x08, 0x85 }, { 0x09, 0x19 }, { 0x0a, 0x03 }, { 0x0b, 0x20 }, | ||
51 | { 0x0c, 0x08 }, { 0x0d, 0x00 }, { 0x0e, 0x00 }, { 0x0f, 0x00 }, | ||
52 | { -1 }, | ||
53 | }; | ||
54 | |||
55 | static const struct jffs_marker_s free_pos64[] = { | ||
56 | { 0x02, 0xff }, { 0x03, 0xff }, { 0x04, 0xff }, { 0x05, 0xff }, | ||
57 | { 0x06, 0xff }, { 0x07, 0xff }, { 0x08, 0xff }, { 0x09, 0xff }, | ||
58 | { 0x0a, 0xff }, { 0x0b, 0xff }, { 0x0c, 0xff }, { 0x0d, 0xff }, | ||
59 | { 0x0e, 0xff }, { 0x0f, 0xff }, { 0x10, 0x85 }, { 0x11, 0x19 }, | ||
60 | { 0x12, 0x03 }, { 0x13, 0x20 }, { 0x14, 0x08 }, { 0x15, 0x00 }, | ||
61 | { 0x16, 0x00 }, { 0x17, 0x00 }, { 0x18, 0xff }, { 0x19, 0xff }, | ||
62 | { 0x1a, 0xff }, { 0x1b, 0xff }, { 0x1c, 0xff }, { 0x1d, 0xff }, | ||
63 | { 0x1e, 0xff }, { 0x1f, 0xff }, { 0x20, 0xff }, { 0x21, 0xff }, | ||
64 | { 0x22, 0xff }, { 0x23, 0xff }, { 0x24, 0xff }, { 0x25, 0xff }, | ||
65 | { 0x26, 0xff }, { 0x27, 0xff }, | ||
66 | { -1 }, | ||
67 | }; | ||
68 | |||
69 | static const struct jffs_marker_s free_akita[] = { | ||
70 | { 0x08, 0x85 }, { 0x09, 0x19 }, { 0x0a, 0x03 }, { 0x0b, 0x20 }, | ||
71 | { 0x0c, 0x08 }, { 0x0d, 0x00 }, { 0x0e, 0x00 }, { 0x0f, 0x00 }, | ||
72 | { 0x10, 0xff }, | ||
73 | { -1 }, | ||
74 | }; | ||
75 | |||
76 | #define LEN(array) (sizeof(array) / sizeof(*array)) | ||
77 | |||
78 | static const struct ecc_style_s { | ||
79 | int page_size; | ||
80 | int oob_size; | ||
81 | int eccbytes; | ||
82 | int eccsize; | ||
83 | const int *eccpos; | ||
84 | int romsize; | ||
85 | const struct jffs_marker_s *freepos; | ||
86 | } spitz = { | ||
87 | 0x200, 0x10, 0x100, LEN(ecc_pos16), ecc_pos16, 0x01000000, free_pos16 | ||
88 | }, akita = { | ||
89 | 0x800, 0x40, 0x100, LEN(ecc_akita), ecc_akita, 0x08000000, free_akita | ||
90 | }, borzoi = { | ||
91 | 0x800, 0x40, 0x100, LEN(ecc_akita), ecc_akita, 0x08000000, free_akita | ||
92 | }, terrier = { | ||
93 | 0x800, 0x40, 0x100, LEN(ecc_akita), ecc_akita, 0x08000000, free_akita | ||
94 | }; | ||
95 | |||
96 | struct ecc_state_s { | ||
97 | int count; | ||
98 | uint8_t cp; | ||
99 | uint8_t lp[2]; | ||
100 | const struct ecc_style_s *style; | ||
101 | }; | ||
102 | |||
103 | #ifndef flash2raw | ||
104 | /* | ||
105 | * Pre-calculated 256-way 1 byte column parity. Table borrowed from Linux. | ||
106 | */ | ||
107 | static const uint8_t ecc_precalc_table[] = { | ||
108 | 0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, | ||
109 | 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00, | ||
110 | 0x65, 0x30, 0x33, 0x66, 0x3c, 0x69, 0x6a, 0x3f, | ||
111 | 0x3f, 0x6a, 0x69, 0x3c, 0x66, 0x33, 0x30, 0x65, | ||
112 | 0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c, | ||
113 | 0x3c, 0x69, 0x6a, 0x3f, 0x65, 0x30, 0x33, 0x66, | ||
114 | 0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59, | ||
115 | 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03, | ||
116 | 0x69, 0x3c, 0x3f, 0x6a, 0x30, 0x65, 0x66, 0x33, | ||
117 | 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f, 0x3c, 0x69, | ||
118 | 0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56, | ||
119 | 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c, | ||
120 | 0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55, | ||
121 | 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f, | ||
122 | 0x6a, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30, | ||
123 | 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a, | ||
124 | 0x6a, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30, | ||
125 | 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a, | ||
126 | 0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55, | ||
127 | 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f, | ||
128 | 0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56, | ||
129 | 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c, | ||
130 | 0x69, 0x3c, 0x3f, 0x6a, 0x30, 0x65, 0x66, 0x33, | ||
131 | 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f, 0x3c, 0x69, | ||
132 | 0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59, | ||
133 | 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03, | ||
134 | 0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c, | ||
135 | 0x3c, 0x69, 0x6a, 0x3f, 0x65, 0x30, 0x33, 0x66, | ||
136 | 0x65, 0x30, 0x33, 0x66, 0x3c, 0x69, 0x6a, 0x3f, | ||
137 | 0x3f, 0x6a, 0x69, 0x3c, 0x66, 0x33, 0x30, 0x65, | ||
138 | 0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, | ||
139 | 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00, | ||
140 | }; | ||
141 | |||
142 | /* Update ECC parity count */ | ||
143 | static inline uint8_t ecc_digest(struct ecc_state_s *s, uint8_t sample) { | ||
144 | uint8_t idx = ecc_precalc_table[sample]; | ||
145 | |||
146 | s->cp ^= idx & 0x3f; | ||
147 | if (idx & 0x40) { | ||
148 | s->lp[0] ^= ~(s->count & 0xff); | ||
149 | s->lp[1] ^= s->count & 0xff; | ||
150 | } | ||
151 | s->count ++; | ||
152 | |||
153 | return sample; | ||
154 | } | ||
155 | |||
156 | static void buffer_digest(struct ecc_state_s *ecc, | ||
157 | const uint8_t *buf, uint8_t *out) { | ||
158 | int i, lp_a[2]; | ||
159 | |||
160 | ecc->lp[0] = 0x00; | ||
161 | ecc->lp[1] = 0x00; | ||
162 | ecc->cp = 0x00; | ||
163 | ecc->count = 0; | ||
164 | for (i = 0; i < ecc->style->eccbytes; i ++) | ||
165 | ecc_digest(ecc, buf[i]); | ||
166 | |||
167 | # define BSHR(byte, from, to) ((ecc->lp[byte] >> (from - to)) & (1 << to)) | ||
168 | lp_a[0] = | ||
169 | BSHR(0, 4, 0) | BSHR(0, 5, 2) | | ||
170 | BSHR(0, 6, 4) | BSHR(0, 7, 6) | | ||
171 | BSHR(1, 4, 1) | BSHR(1, 5, 3) | | ||
172 | BSHR(1, 6, 5) | BSHR(1, 7, 7); | ||
173 | |||
174 | # define BSHL(byte, from, to) ((ecc->lp[byte] << (to - from)) & (1 << to)) | ||
175 | lp_a[1] = | ||
176 | BSHL(0, 0, 0) | BSHL(0, 1, 2) | | ||
177 | BSHL(0, 2, 4) | BSHL(0, 3, 6) | | ||
178 | BSHL(1, 0, 1) | BSHL(1, 1, 3) | | ||
179 | BSHL(1, 2, 5) | BSHL(1, 3, 7); | ||
180 | |||
181 | out[0] = ~lp_a[1]; | ||
182 | out[1] = ~lp_a[0]; | ||
183 | out[2] = (~ecc->cp << 2) | 0x03; | ||
184 | } | ||
185 | |||
186 | static void jffs2_format(const struct ecc_state_s *ecc, uint8_t oob[]) { | ||
187 | const struct jffs_marker_s *byte; | ||
188 | for (byte = ecc->style->freepos; byte->pos >= 0; byte ++) | ||
189 | oob[byte->pos] = byte->value; | ||
190 | } | ||
191 | |||
192 | static void buffer_fill(const struct ecc_state_s *ecc, uint8_t buffer[], | ||
193 | int *len, int *partition, int count, uint8_t jffs_buffer[]) { | ||
194 | int ret; | ||
195 | |||
196 | switch (*partition) { | ||
197 | case 0: | ||
198 | if (count < PARTITION_START) { | ||
199 | memcpy(buffer, jffs_buffer + count, | ||
200 | ecc->style->eccbytes); | ||
201 | *len = ecc->style->eccbytes; | ||
202 | break; | ||
203 | } | ||
204 | *partition = 1; | ||
205 | case 1: | ||
206 | if (count - PARTITION_START < PARTITION_START) { | ||
207 | memcpy(buffer, jffs_buffer + count - PARTITION_START, | ||
208 | ecc->style->eccbytes); | ||
209 | *len = ecc->style->eccbytes; | ||
210 | break; | ||
211 | } | ||
212 | |||
213 | while (*len < ecc->style->eccbytes) { | ||
214 | ret = TFR(read(0, buffer + *len, 0x800 - *len)); | ||
215 | if (ret <= 0) | ||
216 | break; | ||
217 | *len += ret; | ||
218 | } | ||
219 | |||
220 | if (*len == 0) | ||
221 | *partition = 2; | ||
222 | else if (*len < ecc->style->eccbytes) { | ||
223 | fprintf(stderr, "\nWarning: %i stray bytes\n", *len); | ||
224 | memset(buffer + *len, 0xff, | ||
225 | ecc->style->eccbytes - *len); | ||
226 | *len = ecc->style->eccbytes; | ||
227 | break; | ||
228 | } else | ||
229 | break; | ||
230 | case 2: | ||
231 | memset(buffer, 0xff, ecc->style->eccbytes); | ||
232 | *len = ecc->style->eccbytes; | ||
233 | break; | ||
234 | } | ||
235 | } | ||
236 | |||
237 | int main(int argc, char *argv[], char *envp[]) { | ||
238 | struct ecc_state_s ecc; | ||
239 | uint8_t buffer[0x1000], ecc_payload[0x40], regs[3], *jffs; | ||
240 | int ret, len, eccbyte, count, partition; | ||
241 | |||
242 | /* Check if we're called by "raw2flash.spitz" or similar */ | ||
243 | len = strlen(argv[0]); | ||
244 | if (!strcasecmp(argv[0] + len - 5, "akita")) | ||
245 | ecc.style = &akita; | ||
246 | else if (!strcasecmp(argv[0] + len - 6, "borzoi")) | ||
247 | ecc.style = &borzoi; | ||
248 | else if (!strcasecmp(argv[0] + len - 7, "terrier")) | ||
249 | ecc.style = &terrier; | ||
250 | else | ||
251 | ecc.style = &spitz; | ||
252 | |||
253 | # ifdef VERBOSE | ||
254 | fprintf(stderr, "["); | ||
255 | # endif | ||
256 | |||
257 | /* Skip first 10 bytes */ | ||
258 | TFR(read(0, buffer, 0x10)); | ||
259 | |||
260 | len = 0; | ||
261 | jffs = (uint8_t *) malloc(PARTITION_START); | ||
262 | while (len < PARTITION_START) { | ||
263 | ret = TFR(read(0, jffs + len, PARTITION_START - len)); | ||
264 | if (ret <= 0) | ||
265 | break; | ||
266 | len += ret; | ||
267 | } | ||
268 | |||
269 | /* Convert data from stdin */ | ||
270 | partition = len = eccbyte = count = 0; | ||
271 | memset(ecc_payload, 0xff, ecc.style->oob_size); | ||
272 | jffs2_format(&ecc, ecc_payload); | ||
273 | while (count < ecc.style->romsize) { | ||
274 | buffer_fill(&ecc, buffer, &len, &partition, count, jffs); | ||
275 | buffer_digest(&ecc, buffer, regs); | ||
276 | |||
277 | ecc_payload[ecc.style->eccpos[eccbyte ++]] = regs[0]; | ||
278 | ecc_payload[ecc.style->eccpos[eccbyte ++]] = regs[1]; | ||
279 | ecc_payload[ecc.style->eccpos[eccbyte ++]] = regs[2]; | ||
280 | |||
281 | TFR(write(1, buffer, ecc.style->eccbytes)); | ||
282 | count += ecc.style->eccbytes; | ||
283 | len -= ecc.style->eccbytes; | ||
284 | memmove(buffer, buffer + ecc.style->eccbytes, len); | ||
285 | |||
286 | if (eccbyte >= ecc.style->eccsize) { | ||
287 | TFR(write(1, ecc_payload, ecc.style->oob_size)); | ||
288 | eccbyte = 0; | ||
289 | memset(ecc_payload, 0xff, ecc.style->oob_size); | ||
290 | if (partition < 2) | ||
291 | jffs2_format(&ecc, ecc_payload); | ||
292 | } | ||
293 | |||
294 | # ifdef VERBOSE | ||
295 | if (count * PBAR_LEN / ecc.style->romsize > | ||
296 | (count - ecc.style->eccbytes) * | ||
297 | PBAR_LEN / ecc.style->romsize) | ||
298 | fprintf(stderr, "#"); | ||
299 | # endif | ||
300 | } | ||
301 | |||
302 | # ifdef VERBOSE | ||
303 | fprintf(stderr, "]\n"); | ||
304 | # endif | ||
305 | free(jffs); | ||
306 | return 0; | ||
307 | } | ||
308 | #else | ||
309 | int main(int argc, char *argv[], char *envp[]) { | ||
310 | struct ecc_state_s ecc; | ||
311 | uint8_t buffer[0x1000]; | ||
312 | int ret, len, count; | ||
313 | |||
314 | /* Check if we're called by "flash2raw.spitz" or similar */ | ||
315 | len = strlen(argv[0]); | ||
316 | if (!strcasecmp(argv[0] + len - 5, "akita")) | ||
317 | ecc.style = &akita; | ||
318 | else if (!strcasecmp(argv[0] + len - 6, "borzoi")) | ||
319 | ecc.style = &borzoi; | ||
320 | else if (!strcasecmp(argv[0] + len - 7, "terrier")) | ||
321 | ecc.style = &terrier; | ||
322 | else | ||
323 | ecc.style = &spitz; | ||
324 | |||
325 | # ifdef VERBOSE | ||
326 | fprintf(stderr, "["); | ||
327 | # endif | ||
328 | |||
329 | /* Convert data from stdin */ | ||
330 | count = 0; | ||
331 | while (count < ecc.style->romsize) { | ||
332 | len = 0; | ||
333 | while (len < ecc.style->page_size) { | ||
334 | ret = TFR(read(0, buffer + len, | ||
335 | ecc.style->page_size - len)); | ||
336 | if (ret <= 0) | ||
337 | break; | ||
338 | len += ret; | ||
339 | } | ||
340 | if (len == 0) | ||
341 | break; | ||
342 | if (len < ecc.style->page_size) { | ||
343 | fprintf(stderr, "\nWarning: %i stray bytes\n", len); | ||
344 | } | ||
345 | |||
346 | TFR(write(1, buffer, ecc.style->page_size)); | ||
347 | |||
348 | count += len; | ||
349 | len = 0; | ||
350 | while (len < ecc.style->oob_size) { | ||
351 | ret = TFR(read(0, buffer, ecc.style->oob_size - len)); | ||
352 | if (ret <= 0) | ||
353 | break; | ||
354 | len += ret; | ||
355 | } | ||
356 | |||
357 | # ifdef VERBOSE | ||
358 | if (count * PBAR_LEN / ecc.style->romsize > | ||
359 | (count - ecc.style->page_size) * | ||
360 | PBAR_LEN / ecc.style->romsize) | ||
361 | fprintf(stderr, "#"); | ||
362 | # endif | ||
363 | } | ||
364 | |||
365 | # ifdef VERBOSE | ||
366 | fprintf(stderr, "]\n"); | ||
367 | # endif | ||
368 | return 0; | ||
369 | } | ||
370 | #endif | ||
diff --git a/meta/recipes-devtools/qemu/qemu-helper/tunctl.c b/meta/recipes-devtools/qemu/qemu-helper/tunctl.c new file mode 100644 index 0000000000..16e24a2add --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu-helper/tunctl.c | |||
@@ -0,0 +1,156 @@ | |||
1 | /* Copyright 2002 Jeff Dike | ||
2 | * Licensed under the GPL | ||
3 | */ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include <string.h> | ||
8 | #include <errno.h> | ||
9 | #include <fcntl.h> | ||
10 | #include <unistd.h> | ||
11 | #include <pwd.h> | ||
12 | #include <grp.h> | ||
13 | #include <net/if.h> | ||
14 | #include <sys/ioctl.h> | ||
15 | #include <linux/if_tun.h> | ||
16 | |||
17 | /* TUNSETGROUP appeared in 2.6.23 */ | ||
18 | #ifndef TUNSETGROUP | ||
19 | #define TUNSETGROUP _IOW('T', 206, int) | ||
20 | #endif | ||
21 | |||
22 | static void Usage(char *name) | ||
23 | { | ||
24 | fprintf(stderr, "Create: %s [-b] [-u owner] [-g group] [-t device-name] " | ||
25 | "[-f tun-clone-device]\n", name); | ||
26 | fprintf(stderr, "Delete: %s -d device-name [-f tun-clone-device]\n\n", | ||
27 | name); | ||
28 | fprintf(stderr, "The default tun clone device is /dev/net/tun - some systems" | ||
29 | " use\n/dev/misc/net/tun instead\n\n"); | ||
30 | fprintf(stderr, "-b will result in brief output (just the device name)\n"); | ||
31 | exit(1); | ||
32 | } | ||
33 | |||
34 | int main(int argc, char **argv) | ||
35 | { | ||
36 | struct ifreq ifr; | ||
37 | struct passwd *pw; | ||
38 | struct group *gr; | ||
39 | uid_t owner = -1; | ||
40 | gid_t group = -1; | ||
41 | int tap_fd, opt, delete = 0, brief = 0; | ||
42 | char *tun = "", *file = "/dev/net/tun", *name = argv[0], *end; | ||
43 | |||
44 | while((opt = getopt(argc, argv, "bd:f:t:u:g:")) > 0){ | ||
45 | switch(opt) { | ||
46 | case 'b': | ||
47 | brief = 1; | ||
48 | break; | ||
49 | case 'd': | ||
50 | delete = 1; | ||
51 | tun = optarg; | ||
52 | break; | ||
53 | case 'f': | ||
54 | file = optarg; | ||
55 | break; | ||
56 | case 'u': | ||
57 | pw = getpwnam(optarg); | ||
58 | if(pw != NULL){ | ||
59 | owner = pw->pw_uid; | ||
60 | break; | ||
61 | } | ||
62 | owner = strtol(optarg, &end, 0); | ||
63 | if(*end != '\0'){ | ||
64 | fprintf(stderr, "'%s' is neither a username nor a numeric uid.\n", | ||
65 | optarg); | ||
66 | Usage(name); | ||
67 | } | ||
68 | break; | ||
69 | case 'g': | ||
70 | gr = getgrnam(optarg); | ||
71 | if(gr != NULL){ | ||
72 | group = gr->gr_gid; | ||
73 | break; | ||
74 | } | ||
75 | group = strtol(optarg, &end, 0); | ||
76 | if(*end != '\0'){ | ||
77 | fprintf(stderr, "'%s' is neither a groupname nor a numeric group.\n", | ||
78 | optarg); | ||
79 | Usage(name); | ||
80 | } | ||
81 | break; | ||
82 | |||
83 | case 't': | ||
84 | tun = optarg; | ||
85 | break; | ||
86 | case 'h': | ||
87 | default: | ||
88 | Usage(name); | ||
89 | } | ||
90 | } | ||
91 | |||
92 | argv += optind; | ||
93 | argc -= optind; | ||
94 | |||
95 | if(argc > 0) | ||
96 | Usage(name); | ||
97 | |||
98 | if((tap_fd = open(file, O_RDWR)) < 0){ | ||
99 | fprintf(stderr, "Failed to open '%s' : ", file); | ||
100 | perror(""); | ||
101 | exit(1); | ||
102 | } | ||
103 | |||
104 | memset(&ifr, 0, sizeof(ifr)); | ||
105 | |||
106 | ifr.ifr_flags = IFF_TAP | IFF_NO_PI; | ||
107 | strncpy(ifr.ifr_name, tun, sizeof(ifr.ifr_name) - 1); | ||
108 | if(ioctl(tap_fd, TUNSETIFF, (void *) &ifr) < 0){ | ||
109 | perror("TUNSETIFF"); | ||
110 | exit(1); | ||
111 | } | ||
112 | |||
113 | if(delete){ | ||
114 | if(ioctl(tap_fd, TUNSETPERSIST, 0) < 0){ | ||
115 | perror("disabling TUNSETPERSIST"); | ||
116 | exit(1); | ||
117 | } | ||
118 | printf("Set '%s' nonpersistent\n", ifr.ifr_name); | ||
119 | } | ||
120 | else { | ||
121 | /* emulate behaviour prior to TUNSETGROUP */ | ||
122 | if(owner == -1 && group == -1) { | ||
123 | owner = geteuid(); | ||
124 | } | ||
125 | |||
126 | if(owner != -1) { | ||
127 | if(ioctl(tap_fd, TUNSETOWNER, owner) < 0){ | ||
128 | perror("TUNSETOWNER"); | ||
129 | exit(1); | ||
130 | } | ||
131 | } | ||
132 | if(group != -1) { | ||
133 | if(ioctl(tap_fd, TUNSETGROUP, group) < 0){ | ||
134 | perror("TUNSETGROUP"); | ||
135 | exit(1); | ||
136 | } | ||
137 | } | ||
138 | |||
139 | if(ioctl(tap_fd, TUNSETPERSIST, 1) < 0){ | ||
140 | perror("enabling TUNSETPERSIST"); | ||
141 | exit(1); | ||
142 | } | ||
143 | |||
144 | if(brief) | ||
145 | printf("%s\n", ifr.ifr_name); | ||
146 | else { | ||
147 | printf("Set '%s' persistent and owned by", ifr.ifr_name); | ||
148 | if(owner != -1) | ||
149 | printf(" uid %d", owner); | ||
150 | if(group != -1) | ||
151 | printf(" gid %d", group); | ||
152 | printf("\n"); | ||
153 | } | ||
154 | } | ||
155 | return(0); | ||
156 | } | ||
diff --git a/meta/recipes-devtools/qemu/qemu-targets.inc b/meta/recipes-devtools/qemu/qemu-targets.inc new file mode 100644 index 0000000000..5c3565544e --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu-targets.inc | |||
@@ -0,0 +1,22 @@ | |||
1 | # possible arch values are arm aarch64 mips mipsel mips64 mips64el ppc ppc64 ppc64abi32 | ||
2 | # ppcemb armeb alpha sparc32plus i386 x86_64 cris m68k microblaze sparc sparc32 | ||
3 | # sparc32plus | ||
4 | |||
5 | def get_qemu_target_list(d): | ||
6 | import bb | ||
7 | archs = d.getVar('QEMU_TARGETS', True).split() | ||
8 | tos = d.getVar('HOST_OS', True) | ||
9 | softmmuonly = "" | ||
10 | for arch in ['mips64', 'mips64el', 'ppcemb']: | ||
11 | if arch in archs: | ||
12 | softmmuonly += arch + "-softmmu," | ||
13 | archs.remove(arch) | ||
14 | linuxuseronly = "" | ||
15 | for arch in ['armeb', 'alpha', 'ppc64abi32', 'sparc32plus']: | ||
16 | if arch in archs: | ||
17 | linuxuseronly += arch + "-linux-user," | ||
18 | archs.remove(arch) | ||
19 | if 'linux' not in tos: | ||
20 | return softmmuonly + ''.join([arch + "-softmmu" + "," for arch in archs]).rstrip(',') | ||
21 | return softmmuonly + linuxuseronly + ''.join([arch + "-linux-user" + "," + arch + "-softmmu" + "," for arch in archs]).rstrip(',') | ||
22 | |||
diff --git a/meta/recipes-devtools/qemu/qemu.inc b/meta/recipes-devtools/qemu/qemu.inc new file mode 100644 index 0000000000..c9a5d328f9 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu.inc | |||
@@ -0,0 +1,124 @@ | |||
1 | SUMMARY = "Fast open source processor emulator" | ||
2 | HOMEPAGE = "http://qemu.org" | ||
3 | LICENSE = "GPLv2 & LGPLv2.1" | ||
4 | DEPENDS = "glib-2.0 zlib pixman" | ||
5 | RDEPENDS_${PN}_class-target += "bash python" | ||
6 | |||
7 | require qemu-targets.inc | ||
8 | inherit autotools-brokensep | ||
9 | BBCLASSEXTEND = "native nativesdk" | ||
10 | |||
11 | # QEMU_TARGETS is overridable variable | ||
12 | QEMU_TARGETS ?= "arm aarch64 i386 mips mipsel mips64 mips64el ppc sh4 x86_64" | ||
13 | |||
14 | SRC_URI = "\ | ||
15 | file://powerpc_rom.bin \ | ||
16 | file://larger_default_ram_size.patch \ | ||
17 | file://disable-grabs.patch \ | ||
18 | file://exclude-some-arm-EABI-obsolete-syscalls.patch \ | ||
19 | file://wacom.patch \ | ||
20 | " | ||
21 | |||
22 | SRC_URI_append_class-native = "\ | ||
23 | file://fix-libcap-header-issue-on-some-distro.patch \ | ||
24 | " | ||
25 | |||
26 | EXTRA_OECONF += "--target-list=${@get_qemu_target_list(d)} --disable-werror --disable-bluez --disable-libiscsi --with-system-pixman --extra-cflags='${CFLAGS}'" | ||
27 | |||
28 | EXTRA_OECONF_class-nativesdk = "--target-list=${@get_qemu_target_list(d)} --disable-werror \ | ||
29 | " | ||
30 | export LIBTOOL="${HOST_SYS}-libtool" | ||
31 | |||
32 | do_configure_prepend_class-native() { | ||
33 | # Append build host pkg-config paths for native target since the host may provide sdl | ||
34 | BHOST_PKGCONFIG_PATH=$(PATH=/usr/bin:/bin pkg-config --variable pc_path pkg-config || echo "") | ||
35 | if [ ! -z "$BHOST_PKGCONFIG_PATH" ]; then | ||
36 | export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$BHOST_PKGCONFIG_PATH | ||
37 | fi | ||
38 | |||
39 | # Undo the -lX11 added by linker-flags.patch, don't assume that host has libX11 installed | ||
40 | sed -i 's/-lX11//g' Makefile.target | ||
41 | } | ||
42 | |||
43 | do_configure_prepend_class-nativesdk() { | ||
44 | if [ "${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'x11', '', d)}" = "" ] ; then | ||
45 | # Undo the -lX11 added by linker-flags.patch | ||
46 | sed -i 's/-lX11//g' Makefile.target | ||
47 | fi | ||
48 | } | ||
49 | |||
50 | KVMENABLE = "--enable-kvm" | ||
51 | KVMENABLE_darwin = "--disable-kvm" | ||
52 | KVMENABLE_mingw32 = "--disable-kvm" | ||
53 | |||
54 | do_configure() { | ||
55 | # Handle distros such as CentOS 5 32-bit that do not have kvm support | ||
56 | KVMOPTS="--disable-kvm" | ||
57 | if [ "${PN}" != "qemu-native" -a "${PN}" != "nativesdk-qemu" ] \ | ||
58 | || [ -f /usr/include/linux/kvm.h ] ; then | ||
59 | KVMOPTS="${KVMENABLE}" | ||
60 | fi | ||
61 | |||
62 | ${S}/configure --prefix=${prefix} --sysconfdir=${sysconfdir} --libexecdir=${libexecdir} --localstatedir=${localstatedir} --disable-strip ${EXTRA_OECONF} $KVMOPTS | ||
63 | test ! -e ${S}/target-i386/beginend_funcs.sh || chmod a+x ${S}/target-i386/beginend_funcs.sh | ||
64 | } | ||
65 | |||
66 | do_install () { | ||
67 | export STRIP="true" | ||
68 | autotools_do_install | ||
69 | install -d ${D}${datadir}/qemu | ||
70 | install -m 0755 ${WORKDIR}/powerpc_rom.bin ${D}${datadir}/qemu | ||
71 | } | ||
72 | |||
73 | # The following fragment will create a wrapper for qemu-mips user emulation | ||
74 | # binary in order to work around a segmentation fault issue. Basically, by | ||
75 | # default, the reserved virtual address space for 32-on-64 bit is set to 4GB. | ||
76 | # This will trigger a MMU access fault in the virtual CPU. With this change, | ||
77 | # the qemu-mips works fine. | ||
78 | # IMPORTANT: This piece needs to be removed once the root cause is fixed! | ||
79 | do_install_append() { | ||
80 | if [ -e "${D}/${bindir}/qemu-mips" ]; then | ||
81 | create_wrapper ${D}/${bindir}/qemu-mips \ | ||
82 | QEMU_RESERVED_VA=0x0 | ||
83 | fi | ||
84 | } | ||
85 | # END of qemu-mips workaround | ||
86 | |||
87 | PACKAGECONFIG ??= "fdt sdl alsa" | ||
88 | PACKAGECONFIG_class-native ??= "fdt alsa" | ||
89 | PACKAGECONFIG_class-nativesdk ??= "fdt sdl" | ||
90 | NATIVEDEPS = "" | ||
91 | NATIVEDEPS_class-native = "${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'libxext-native', '',d)}" | ||
92 | PACKAGECONFIG[sdl] = "--enable-sdl,--disable-sdl,libsdl ${NATIVEDEPS}," | ||
93 | PACKAGECONFIG[virtfs] = "--enable-virtfs --enable-attr,--disable-virtfs,libcap attr," | ||
94 | PACKAGECONFIG[aio] = "--enable-linux-aio,--disable-linux-aio,libaio," | ||
95 | PACKAGECONFIG[xfs] = "--enable-xfsctl,--disable-xfsctl,xfsprogs," | ||
96 | PACKAGECONFIG[xen] = "--enable-xen, --disable-xen,," | ||
97 | PACKAGECONFIG[quorum] = "--enable-quorum, --disable-quorum, gnutls," | ||
98 | PACKAGECONFIG[vnc-tls] = "--enable-vnc --enable-vnc-tls,--disable-vnc-tls, gnutls," | ||
99 | PACKAGECONFIG[vnc-ws] = "--enable-vnc --enable-vnc-ws,--disable-vnc-ws, gnutls," | ||
100 | PACKAGECONFIG[vnc-sasl] = "--enable-vnc --enable-vnc-sasl,--disable-vnc-sasl,cyrus-sasl," | ||
101 | PACKAGECONFIG[vnc-jpeg] = "--enable-vnc --enable-vnc-jpeg,--disable-vnc-jpeg,jpeg," | ||
102 | PACKAGECONFIG[vnc-png] = "--enable-vnc --enable-vnc-png,--disable-vnc-png,libpng," | ||
103 | PACKAGECONFIG[libcurl] = "--enable-curl,--disable-curl,libcurl," | ||
104 | PACKAGECONFIG[nss] = "--enable-smartcard-nss,--disable-smartcard-nss,nss," | ||
105 | PACKAGECONFIG[uuid] = "--enable-uuid,--disable-uuid,util-linux," | ||
106 | PACKAGECONFIG[curses] = "--enable-curses,--disable-curses,ncurses," | ||
107 | PACKAGECONFIG[gtk+] = "--enable-gtk --enable-vte,--disable-gtk --disable-vte,gtk+ libvte," | ||
108 | PACKAGECONFIG[libcap-ng] = "--enable-cap-ng,--disable-cap-ng,libcap-ng," | ||
109 | PACKAGECONFIG[ssh2] = "--enable-libssh2,--disable-libssh2,libssh2," | ||
110 | PACKAGECONFIG[libusb] = "--enable-libusb,--disable-libusb,libusb1" | ||
111 | PACKAGECONFIG[fdt] = "--enable-fdt,--disable-fdt,dtc" | ||
112 | PACKAGECONFIG[alsa] = ",,alsa-lib" | ||
113 | PACKAGECONFIG[glx] = "--enable-glx,--disable-glx,mesa" | ||
114 | PACKAGECONFIG[lzo] = "--enable-lzo,--disable-lzo,lzo" | ||
115 | PACKAGECONFIG[numa] = "--enable-numa,--disable-numa,numactl" | ||
116 | |||
117 | EXTRA_OECONF += "${@bb.utils.contains('PACKAGECONFIG', 'alsa', '--audio-drv-list=oss,alsa', '', d)}" | ||
118 | |||
119 | # Qemu target will not build in world build for ARM or Mips | ||
120 | BROKEN_qemuarm = "1" | ||
121 | BROKEN_qemumips64 = "1" | ||
122 | BROKEN_qemumips = "1" | ||
123 | |||
124 | INSANE_SKIP_${PN} = "arch" | ||
diff --git a/meta/recipes-devtools/qemu/qemu/CVE-2014-7840.patch b/meta/recipes-devtools/qemu/qemu/CVE-2014-7840.patch new file mode 100644 index 0000000000..4f992bae14 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/CVE-2014-7840.patch | |||
@@ -0,0 +1,57 @@ | |||
1 | From 0be839a2701369f669532ea5884c15bead1c6e08 Mon Sep 17 00:00:00 2001 | ||
2 | From: "Michael S. Tsirkin" <mst@redhat.com> | ||
3 | Date: Wed, 12 Nov 2014 11:44:39 +0200 | ||
4 | Subject: [PATCH] migration: fix parameter validation on ram load | ||
5 | |||
6 | During migration, the values read from migration stream during ram load | ||
7 | are not validated. Especially offset in host_from_stream_offset() and | ||
8 | also the length of the writes in the callers of said function. | ||
9 | |||
10 | To fix this, we need to make sure that the [offset, offset + length] | ||
11 | range fits into one of the allocated memory regions. | ||
12 | |||
13 | Validating addr < len should be sufficient since data seems to always be | ||
14 | managed in TARGET_PAGE_SIZE chunks. | ||
15 | |||
16 | Fixes: CVE-2014-7840 | ||
17 | |||
18 | Upstream-Status: Backport | ||
19 | |||
20 | Note: follow-up patches add extra checks on each block->host access. | ||
21 | |||
22 | Signed-off-by: Michael S. Tsirkin <mst@redhat.com> | ||
23 | Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> | ||
24 | Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> | ||
25 | Signed-off-by: Amit Shah <amit.shah@redhat.com> | ||
26 | Signed-off-by: Sona Sarmadi <sona.sarmadi@enea.com> | ||
27 | --- | ||
28 | arch_init.c | 5 +++-- | ||
29 | 1 file changed, 3 insertions(+), 2 deletions(-) | ||
30 | |||
31 | diff --git a/arch_init.c b/arch_init.c | ||
32 | index 88a5ba0..593a990 100644 | ||
33 | --- a/arch_init.c | ||
34 | +++ b/arch_init.c | ||
35 | @@ -1006,7 +1006,7 @@ static inline void *host_from_stream_offset(QEMUFile *f, | ||
36 | uint8_t len; | ||
37 | |||
38 | if (flags & RAM_SAVE_FLAG_CONTINUE) { | ||
39 | - if (!block) { | ||
40 | + if (!block || block->length <= offset) { | ||
41 | error_report("Ack, bad migration stream!"); | ||
42 | return NULL; | ||
43 | } | ||
44 | @@ -1019,8 +1019,9 @@ static inline void *host_from_stream_offset(QEMUFile *f, | ||
45 | id[len] = 0; | ||
46 | |||
47 | QTAILQ_FOREACH(block, &ram_list.blocks, next) { | ||
48 | - if (!strncmp(id, block->idstr, sizeof(id))) | ||
49 | + if (!strncmp(id, block->idstr, sizeof(id)) && block->length > offset) { | ||
50 | return memory_region_get_ram_ptr(block->mr) + offset; | ||
51 | + } | ||
52 | } | ||
53 | |||
54 | error_report("Can't find block %s!", id); | ||
55 | -- | ||
56 | 1.9.1 | ||
57 | |||
diff --git a/meta/recipes-devtools/qemu/qemu/configure-fix-Darwin-target-detection.patch b/meta/recipes-devtools/qemu/qemu/configure-fix-Darwin-target-detection.patch new file mode 100644 index 0000000000..59cdc1c304 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/configure-fix-Darwin-target-detection.patch | |||
@@ -0,0 +1,32 @@ | |||
1 | Upstream-Status: Pending | ||
2 | Signed-off-by: Cristian Iorga <cristian.iorga@intel.com> | ||
3 | |||
4 | From 9ac096d8eccf2d56ece646320c282c8369f8337c Mon Sep 17 00:00:00 2001 | ||
5 | From: Cristian Iorga <cristian.iorga@intel.com> | ||
6 | Date: Tue, 29 Jul 2014 18:35:59 +0300 | ||
7 | Subject: [PATCH] configure: fix Darwin target detection | ||
8 | |||
9 | fix Darwin target detection for qemu | ||
10 | cross-compilation. | ||
11 | |||
12 | Signed-off-by: Cristian Iorga <cristian.iorga@intel.com> | ||
13 | --- | ||
14 | configure | 2 ++ | ||
15 | 1 file changed, 2 insertions(+) | ||
16 | |||
17 | diff --git a/configure b/configure | ||
18 | index 283c71c..1c66a11 100755 | ||
19 | --- a/configure | ||
20 | +++ b/configure | ||
21 | @@ -444,6 +444,8 @@ elif check_define __sun__ ; then | ||
22 | targetos='SunOS' | ||
23 | elif check_define __HAIKU__ ; then | ||
24 | targetos='Haiku' | ||
25 | +elif check_define __APPLE__ ; then | ||
26 | + targetos='Darwin' | ||
27 | else | ||
28 | targetos=`uname -s` | ||
29 | fi | ||
30 | -- | ||
31 | 1.9.1 | ||
32 | |||
diff --git a/meta/recipes-devtools/qemu/qemu/disable-grabs.patch b/meta/recipes-devtools/qemu/qemu/disable-grabs.patch new file mode 100644 index 0000000000..41726b1c87 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/disable-grabs.patch | |||
@@ -0,0 +1,72 @@ | |||
1 | When the pointer enters the Qemu window it calls SDL_WM_GrabInput, which calls | ||
2 | XGrabPointer in a busyloop until it returns GrabSuccess. However if there's already | ||
3 | a pointer grab (screen is locked, a menu is open) then qemu will hang until the | ||
4 | grab can be taken. In the specific case of a headless X server on an autobuilder, once | ||
5 | the screensaver has kicked in any qemu instance that appears underneath the | ||
6 | pointer will hang. | ||
7 | |||
8 | I'm not entirely sure why pointer grabs are required (the documentation | ||
9 | explicitly says it doesn't do grabs when using a tablet, which we are) so wrap | ||
10 | them in a conditional that can be set by the autobuilder environment, preserving | ||
11 | the current grabbing behaviour for everyone else. | ||
12 | |||
13 | Upstream-Status: Pending | ||
14 | Signed-off-by: Ross Burton <ross.burton@intel.com> | ||
15 | |||
16 | From 4b1988ecb01a178269ec0513a75f2ec620c7ef6a Mon Sep 17 00:00:00 2001 | ||
17 | From: Ross Burton <ross.burton@intel.com> | ||
18 | Date: Wed, 18 Sep 2013 14:04:54 +0100 | ||
19 | Subject: [PATCH] sdl.c: allow user to disable pointer grabs | ||
20 | |||
21 | Signed-off-by: Ross Burton <ross.burton@intel.com> | ||
22 | Signed-off-by: Eric Bénard <eric@eukrea.com> | ||
23 | --- | ||
24 | ui/sdl.c | 12 ++++++++++-- | ||
25 | 1 file changed, 10 insertions(+), 2 deletions(-) | ||
26 | |||
27 | diff --git a/ui/sdl.c b/ui/sdl.c | ||
28 | index 39a42d6..9b8abe5 100644 | ||
29 | --- a/ui/sdl.c | ||
30 | +++ b/ui/sdl.c | ||
31 | @@ -59,6 +59,10 @@ static SDL_Cursor *guest_sprite = NULL; | ||
32 | static SDL_PixelFormat host_format; | ||
33 | static int scaling_active = 0; | ||
34 | static Notifier mouse_mode_notifier; | ||
35 | +#ifndef True | ||
36 | +#define True 1 | ||
37 | +#endif | ||
38 | +static doing_grabs = True; | ||
39 | |||
40 | static void sdl_update(DisplayChangeListener *dcl, | ||
41 | int x, int y, int w, int h) | ||
42 | @@ -384,14 +388,16 @@ static void sdl_grab_start(void) | ||
43 | SDL_WarpMouse(guest_x, guest_y); | ||
44 | } else | ||
45 | sdl_hide_cursor(); | ||
46 | - SDL_WM_GrabInput(SDL_GRAB_ON); | ||
47 | + if (doing_grabs) | ||
48 | + SDL_WM_GrabInput(SDL_GRAB_ON); | ||
49 | gui_grab = 1; | ||
50 | sdl_update_caption(); | ||
51 | } | ||
52 | |||
53 | static void sdl_grab_end(void) | ||
54 | { | ||
55 | - SDL_WM_GrabInput(SDL_GRAB_OFF); | ||
56 | + if (doing_grabs) | ||
57 | + SDL_WM_GrabInput(SDL_GRAB_OFF); | ||
58 | gui_grab = 0; | ||
59 | sdl_show_cursor(); | ||
60 | sdl_update_caption(); | ||
61 | @@ -909,6 +915,8 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame) | ||
62 | * This requires SDL >= 1.2.14. */ | ||
63 | setenv("SDL_DISABLE_LOCK_KEYS", "1", 1); | ||
64 | |||
65 | + doing_grabs = (getenv("QEMU_DONT_GRAB") == NULL); | ||
66 | + | ||
67 | flags = SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE; | ||
68 | if (SDL_Init (flags)) { | ||
69 | fprintf(stderr, "Could not initialize SDL(%s) - exiting\n", | ||
70 | -- | ||
71 | 1.8.3.1 | ||
72 | |||
diff --git a/meta/recipes-devtools/qemu/qemu/fix-libcap-header-issue-on-some-distro.patch b/meta/recipes-devtools/qemu/qemu/fix-libcap-header-issue-on-some-distro.patch new file mode 100644 index 0000000000..13a6ea23b1 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/fix-libcap-header-issue-on-some-distro.patch | |||
@@ -0,0 +1,84 @@ | |||
1 | fix libcap header issue on some distro | ||
2 | |||
3 | 1, When build qemu-native on SLED 11.2, there is an error: | ||
4 | ... | ||
5 | | In file included from /usr/include/bits/sigcontext.h:28, | ||
6 | | from /usr/include/signal.h:339, | ||
7 | | from /buildarea2/tmp/work/i686-linux/qemu-native/1.4.0-r0/ | ||
8 | qemu-1.4.0/include/qemu-common.h:42, | ||
9 | | from fsdev/virtfs-proxy-helper.c:23: | ||
10 | | /usr/include/asm/sigcontext.h:28: error: expected specifier- | ||
11 | qualifier-list before '__u64' | ||
12 | | /usr/include/asm/sigcontext.h:191: error: expected specifier- | ||
13 | qualifier-list before '__u64' | ||
14 | ... | ||
15 | |||
16 | 2, The virtfs-proxy-helper.c includes <sys/capability.h> and | ||
17 | qemu-common.h in sequence. The header include map is: | ||
18 | (`-->' presents `include') | ||
19 | ... | ||
20 | "virtfs-proxy-helper.c" --> <sys/capability.h> | ||
21 | ... | ||
22 | "virtfs-proxy-helper.c" --> "qemu-common.h" --> <signal.h> --> | ||
23 | <bits/sigcontext.h> --> <asm/sigcontext.h> --> <linux/types.h> --> | ||
24 | <asm/types.h> --> <asm-generic/types.h> --> <asm-generic/int-ll64.h> | ||
25 | ... | ||
26 | |||
27 | 3, The bug is found on SLED 11.2 x86. In libcap header file | ||
28 | /usr/include/sys/capability.h, it does evil stuff like this: | ||
29 | ... | ||
30 | 25 /* | ||
31 | 26 * Make sure we can be included from userland by preventing | ||
32 | 27 * capability.h from including other kernel headers | ||
33 | 28 */ | ||
34 | 29 #define _LINUX_TYPES_H | ||
35 | 30 #define _LINUX_FS_H | ||
36 | 31 #define __LINUX_COMPILER_H | ||
37 | 32 #define __user | ||
38 | 33 | ||
39 | 34 typedef unsigned int __u32; | ||
40 | 35 typedef __u32 __le32; | ||
41 | ... | ||
42 | This completely prevents including /usr/include/linux/types.h. | ||
43 | The above `<asm/sigcontext.h> --> <linux/types.h>' is prevented, | ||
44 | and '__u64' is defined in <asm-generic/int-ll64.h>. | ||
45 | |||
46 | 4, Modify virtfs-proxy-helper.c to include <sys/capability.h> | ||
47 | last to workaround the issue. | ||
48 | |||
49 | http://www.linuxtv.org/pipermail/vdr/2009-August/021194.html | ||
50 | http://patchwork.linuxtv.org/patch/12748/ | ||
51 | |||
52 | Upstream-Status: Pending | ||
53 | Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> | ||
54 | --- | ||
55 | fsdev/virtfs-proxy-helper.c | 7 +++++-- | ||
56 | 1 file changed, 5 insertions(+), 2 deletions(-) | ||
57 | |||
58 | diff --git a/fsdev/virtfs-proxy-helper.c b/fsdev/virtfs-proxy-helper.c | ||
59 | --- a/fsdev/virtfs-proxy-helper.c | ||
60 | +++ b/fsdev/virtfs-proxy-helper.c | ||
61 | @@ -12,7 +12,6 @@ | ||
62 | #include <sys/resource.h> | ||
63 | #include <getopt.h> | ||
64 | #include <syslog.h> | ||
65 | -#include <sys/capability.h> | ||
66 | #include <sys/fsuid.h> | ||
67 | #include <sys/vfs.h> | ||
68 | #include <sys/ioctl.h> | ||
69 | @@ -26,7 +25,11 @@ | ||
70 | #include "virtio-9p-marshal.h" | ||
71 | #include "hw/9pfs/virtio-9p-proxy.h" | ||
72 | #include "fsdev/virtio-9p-marshal.h" | ||
73 | - | ||
74 | +/* | ||
75 | + * Include this one last due to some versions of it being buggy: | ||
76 | + * http://www.linuxtv.org/pipermail/vdr/2009-August/021194.html | ||
77 | + */ | ||
78 | +#include <sys/capability.h> | ||
79 | #define PROGNAME "virtfs-proxy-helper" | ||
80 | |||
81 | #ifndef XFS_SUPER_MAGIC | ||
82 | -- | ||
83 | 1.7.10.4 | ||
84 | |||
diff --git a/meta/recipes-devtools/qemu/qemu/larger_default_ram_size.patch b/meta/recipes-devtools/qemu/qemu/larger_default_ram_size.patch new file mode 100644 index 0000000000..711c36071d --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/larger_default_ram_size.patch | |||
@@ -0,0 +1,22 @@ | |||
1 | This patch is taken from debian. 128M is too less sometimes if distro | ||
2 | with lot of packages is booted so this patch raises the default to 384M | ||
3 | |||
4 | It has not been applied to upstream qemu | ||
5 | |||
6 | Khem Raj <raj.khem@gmail.com> | ||
7 | |||
8 | Upstream-Status: Pending | ||
9 | |||
10 | Index: qemu-0.14.0/vl.c | ||
11 | =================================================================== | ||
12 | --- qemu-0.14.0.orig/vl.c | ||
13 | +++ qemu-0.14.0/vl.c | ||
14 | @@ -168,7 +168,7 @@ int main(int argc, char **argv) | ||
15 | //#define DEBUG_NET | ||
16 | //#define DEBUG_SLIRP | ||
17 | |||
18 | -#define DEFAULT_RAM_SIZE 128 | ||
19 | +#define DEFAULT_RAM_SIZE 384 | ||
20 | |||
21 | #define MAX_VIRTIO_CONSOLES 1 | ||
22 | |||
diff --git a/meta/recipes-devtools/qemu/qemu/powerpc_rom.bin b/meta/recipes-devtools/qemu/qemu/powerpc_rom.bin new file mode 100644 index 0000000000..c4044296c5 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/powerpc_rom.bin | |||
Binary files differ | |||
diff --git a/meta/recipes-devtools/qemu/qemu/qemu-CVE-2015-3456.patch b/meta/recipes-devtools/qemu/qemu/qemu-CVE-2015-3456.patch new file mode 100644 index 0000000000..f05441fce6 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/qemu-CVE-2015-3456.patch | |||
@@ -0,0 +1,92 @@ | |||
1 | qemu: CVE-2015-3456 | ||
2 | |||
3 | the patch comes from: | ||
4 | https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-3456 | ||
5 | http://git.qemu.org/?p=qemu.git;a=commit;h=e907746266721f305d67bc0718795fedee2e824c | ||
6 | |||
7 | fdc: force the fifo access to be in bounds of the allocated buffer | ||
8 | |||
9 | During processing of certain commands such as FD_CMD_READ_ID and | ||
10 | FD_CMD_DRIVE_SPECIFICATION_COMMAND the fifo memory access could | ||
11 | get out of bounds leading to memory corruption with values coming | ||
12 | from the guest. | ||
13 | |||
14 | Fix this by making sure that the index is always bounded by the | ||
15 | allocated memory. | ||
16 | |||
17 | This is CVE-2015-3456. | ||
18 | |||
19 | Signed-off-by: Petr Matousek <pmatouse@redhat.com> | ||
20 | Reviewed-by: John Snow <jsnow@redhat.com> | ||
21 | Signed-off-by: John Snow <jsnow@redhat.com> | ||
22 | Signed-off-by: Li Wang <li.wang@windriver.com> | ||
23 | |||
24 | Upstream-Status: Backport | ||
25 | |||
26 | Signed-off-by: Kai Kang <kai.kang@windriver.com> | ||
27 | --- | ||
28 | hw/block/fdc.c | 17 +++++++++++------ | ||
29 | 1 file changed, 11 insertions(+), 6 deletions(-) | ||
30 | |||
31 | diff --git a/hw/block/fdc.c b/hw/block/fdc.c | ||
32 | index 490d127..045459e 100644 | ||
33 | --- a/hw/block/fdc.c | ||
34 | +++ b/hw/block/fdc.c | ||
35 | @@ -1436,7 +1436,7 @@ static uint32_t fdctrl_read_data(FDCtrl *fdctrl) | ||
36 | { | ||
37 | FDrive *cur_drv; | ||
38 | uint32_t retval = 0; | ||
39 | - int pos; | ||
40 | + uint32_t pos; | ||
41 | |||
42 | cur_drv = get_cur_drv(fdctrl); | ||
43 | fdctrl->dsr &= ~FD_DSR_PWRDOWN; | ||
44 | @@ -1445,8 +1445,8 @@ static uint32_t fdctrl_read_data(FDCtrl *fdctrl) | ||
45 | return 0; | ||
46 | } | ||
47 | pos = fdctrl->data_pos; | ||
48 | + pos %= FD_SECTOR_LEN; | ||
49 | if (fdctrl->msr & FD_MSR_NONDMA) { | ||
50 | - pos %= FD_SECTOR_LEN; | ||
51 | if (pos == 0) { | ||
52 | if (fdctrl->data_pos != 0) | ||
53 | if (!fdctrl_seek_to_next_sect(fdctrl, cur_drv)) { | ||
54 | @@ -1790,10 +1790,13 @@ static void fdctrl_handle_option(FDCtrl *fdctrl, int direction) | ||
55 | static void fdctrl_handle_drive_specification_command(FDCtrl *fdctrl, int direction) | ||
56 | { | ||
57 | FDrive *cur_drv = get_cur_drv(fdctrl); | ||
58 | + uint32_t pos; | ||
59 | |||
60 | - if (fdctrl->fifo[fdctrl->data_pos - 1] & 0x80) { | ||
61 | + pos = fdctrl->data_pos - 1; | ||
62 | + pos %= FD_SECTOR_LEN; | ||
63 | + if (fdctrl->fifo[pos] & 0x80) { | ||
64 | /* Command parameters done */ | ||
65 | - if (fdctrl->fifo[fdctrl->data_pos - 1] & 0x40) { | ||
66 | + if (fdctrl->fifo[pos] & 0x40) { | ||
67 | fdctrl->fifo[0] = fdctrl->fifo[1]; | ||
68 | fdctrl->fifo[2] = 0; | ||
69 | fdctrl->fifo[3] = 0; | ||
70 | @@ -1893,7 +1896,7 @@ static uint8_t command_to_handler[256]; | ||
71 | static void fdctrl_write_data(FDCtrl *fdctrl, uint32_t value) | ||
72 | { | ||
73 | FDrive *cur_drv; | ||
74 | - int pos; | ||
75 | + uint32_t pos; | ||
76 | |||
77 | /* Reset mode */ | ||
78 | if (!(fdctrl->dor & FD_DOR_nRESET)) { | ||
79 | @@ -1941,7 +1944,9 @@ static void fdctrl_write_data(FDCtrl *fdctrl, uint32_t value) | ||
80 | } | ||
81 | |||
82 | FLOPPY_DPRINTF("%s: %02x\n", __func__, value); | ||
83 | - fdctrl->fifo[fdctrl->data_pos++] = value; | ||
84 | + pos = fdctrl->data_pos++; | ||
85 | + pos %= FD_SECTOR_LEN; | ||
86 | + fdctrl->fifo[pos] = value; | ||
87 | if (fdctrl->data_pos == fdctrl->data_len) { | ||
88 | /* We now have all parameters | ||
89 | * and will be able to treat the command | ||
90 | -- | ||
91 | 1.7.9.5 | ||
92 | |||
diff --git a/meta/recipes-devtools/qemu/qemu/slirp-CVE-2014-3640.patch b/meta/recipes-devtools/qemu/qemu/slirp-CVE-2014-3640.patch new file mode 100644 index 0000000000..a7ecf31c01 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/slirp-CVE-2014-3640.patch | |||
@@ -0,0 +1,48 @@ | |||
1 | From 9a72433843d912a45046959b1953861211d1838d Mon Sep 17 00:00:00 2001 | ||
2 | From: Petr Matousek <pmatouse@redhat.com> | ||
3 | Date: Thu, 18 Sep 2014 08:35:37 +0200 | ||
4 | Subject: [PATCH] slirp: udp: fix NULL pointer dereference because of | ||
5 | uninitialized socket | ||
6 | |||
7 | When guest sends udp packet with source port and source addr 0, | ||
8 | uninitialized socket is picked up when looking for matching and already | ||
9 | created udp sockets, and later passed to sosendto() where NULL pointer | ||
10 | dereference is hit during so->slirp->vnetwork_mask.s_addr access. | ||
11 | |||
12 | Fix this by checking that the socket is not just a socket stub. | ||
13 | |||
14 | This is CVE-2014-3640. | ||
15 | |||
16 | Upstream-Status: Backport | ||
17 | |||
18 | Signed-off-by: Petr Matousek <pmatouse@redhat.com> | ||
19 | Reported-by: Xavier Mehrenberger <xavier.mehrenberger@airbus.com> | ||
20 | Reported-by: Stephane Duverger <stephane.duverger@eads.net> | ||
21 | Reviewed-by: Jan Kiszka <jan.kiszka@siemens.com> | ||
22 | Reviewed-by: Michael S. Tsirkin <mst@redhat.com> | ||
23 | Reviewed-by: Michael Tokarev <mjt@tls.msk.ru> | ||
24 | Message-id: 20140918063537.GX9321@dhcp-25-225.brq.redhat.com | ||
25 | Signed-off-by: Peter Maydell <peter.maydell@linaro.org> | ||
26 | (cherry picked from commit 01f7cecf0037997cb0e58ec0d56bf9b5a6f7cb2a) | ||
27 | Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> | ||
28 | Signed-off-by: Sona Sarmadi <sona.sarmadi@enea.com> | ||
29 | --- | ||
30 | slirp/udp.c | 2 +- | ||
31 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
32 | |||
33 | diff --git a/slirp/udp.c b/slirp/udp.c | ||
34 | index 8cc6cb6..f77e00f 100644 | ||
35 | --- a/slirp/udp.c | ||
36 | +++ b/slirp/udp.c | ||
37 | @@ -152,7 +152,7 @@ udp_input(register struct mbuf *m, int iphlen) | ||
38 | * Locate pcb for datagram. | ||
39 | */ | ||
40 | so = slirp->udp_last_so; | ||
41 | - if (so->so_lport != uh->uh_sport || | ||
42 | + if (so == &slirp->udb || so->so_lport != uh->uh_sport || | ||
43 | so->so_laddr.s_addr != ip->ip_src.s_addr) { | ||
44 | struct socket *tmp; | ||
45 | |||
46 | -- | ||
47 | 1.9.1 | ||
48 | |||
diff --git a/meta/recipes-devtools/qemu/qemu/vnc-CVE-2014-7815.patch b/meta/recipes-devtools/qemu/qemu/vnc-CVE-2014-7815.patch new file mode 100644 index 0000000000..10a6dacbe5 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/vnc-CVE-2014-7815.patch | |||
@@ -0,0 +1,53 @@ | |||
1 | From b2f1d90530301d7915dddc8a750063757675b21a Mon Sep 17 00:00:00 2001 | ||
2 | From: Petr Matousek <pmatouse@redhat.com> | ||
3 | Date: Mon, 27 Oct 2014 12:41:44 +0100 | ||
4 | Subject: [PATCH] vnc: sanitize bits_per_pixel from the client | ||
5 | |||
6 | bits_per_pixel that are less than 8 could result in accessing | ||
7 | non-initialized buffers later in the code due to the expectation | ||
8 | that bytes_per_pixel value that is used to initialize these buffers is | ||
9 | never zero. | ||
10 | |||
11 | To fix this check that bits_per_pixel from the client is one of the | ||
12 | values that the rfb protocol specification allows. | ||
13 | |||
14 | This is CVE-2014-7815. | ||
15 | |||
16 | Upstream-Status: Backport | ||
17 | |||
18 | Signed-off-by: Petr Matousek <pmatouse@redhat.com> | ||
19 | |||
20 | [ kraxel: apply codestyle fix ] | ||
21 | |||
22 | Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> | ||
23 | (cherry picked from commit e6908bfe8e07f2b452e78e677da1b45b1c0f6829) | ||
24 | Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> | ||
25 | Signed-off-by: Sona Sarmadi <sona.sarmadi@enea.com> | ||
26 | --- | ||
27 | ui/vnc.c | 10 ++++++++++ | ||
28 | 1 file changed, 10 insertions(+) | ||
29 | |||
30 | diff --git a/ui/vnc.c b/ui/vnc.c | ||
31 | index f8d9b7d..87e34ae 100644 | ||
32 | --- a/ui/vnc.c | ||
33 | +++ b/ui/vnc.c | ||
34 | @@ -2026,6 +2026,16 @@ static void set_pixel_format(VncState *vs, | ||
35 | return; | ||
36 | } | ||
37 | |||
38 | + switch (bits_per_pixel) { | ||
39 | + case 8: | ||
40 | + case 16: | ||
41 | + case 32: | ||
42 | + break; | ||
43 | + default: | ||
44 | + vnc_client_error(vs); | ||
45 | + return; | ||
46 | + } | ||
47 | + | ||
48 | vs->client_pf.rmax = red_max; | ||
49 | vs->client_pf.rbits = hweight_long(red_max); | ||
50 | vs->client_pf.rshift = red_shift; | ||
51 | -- | ||
52 | 1.9.1 | ||
53 | |||
diff --git a/meta/recipes-devtools/qemu/qemu/wacom.patch b/meta/recipes-devtools/qemu/qemu/wacom.patch new file mode 100644 index 0000000000..fd1b4a6963 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/wacom.patch | |||
@@ -0,0 +1,130 @@ | |||
1 | The USB wacom device is missing a HID descriptor which causes it | ||
2 | to fail to operate with recent kernels (e.g. 3.17). | ||
3 | |||
4 | This patch adds a HID desriptor to the device, based upon one from | ||
5 | real wcom device. | ||
6 | |||
7 | Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> | ||
8 | |||
9 | Upstream-Status: Submitted | ||
10 | 2014/11/27 | ||
11 | |||
12 | Index: qemu-2.1.0/hw/usb/dev-wacom.c | ||
13 | =================================================================== | ||
14 | --- qemu-2.1.0.orig/hw/usb/dev-wacom.c 2014-08-01 15:12:17.000000000 +0100 | ||
15 | +++ qemu-2.1.0/hw/usb/dev-wacom.c 2014-10-12 12:13:30.540306042 +0100 | ||
16 | @@ -68,6 +68,89 @@ | ||
17 | [STR_SERIALNUMBER] = "1", | ||
18 | }; | ||
19 | |||
20 | +static const uint8_t qemu_tablet_hid_report_descriptor[] = { | ||
21 | + 0x05, 0x01, /* Usage Page (Generic Desktop) */ | ||
22 | + 0x09, 0x02, /* Usage (Mouse) */ | ||
23 | + 0xa1, 0x01, /* Collection (Application) */ | ||
24 | + 0x85, 0x01, /* Report ID (1) */ | ||
25 | + 0x09, 0x01, /* Usage (Pointer) */ | ||
26 | + 0xa1, 0x00, /* Collection (Physical) */ | ||
27 | + 0x05, 0x09, /* Usage Page (Button) */ | ||
28 | + 0x19, 0x01, /* Usage Minimum (1) */ | ||
29 | + 0x29, 0x05, /* Usage Maximum (5) */ | ||
30 | + 0x15, 0x00, /* Logical Minimum (0) */ | ||
31 | + 0x25, 0x01, /* Logical Maximum (1) */ | ||
32 | + 0x95, 0x05, /* Report Count (5) */ | ||
33 | + 0x75, 0x01, /* Report Size (1) */ | ||
34 | + 0x81, 0x02, /* Input (Data, Variable, Absolute) */ | ||
35 | + 0x95, 0x01, /* Report Count (1) */ | ||
36 | + 0x75, 0x03, /* Report Size (3) */ | ||
37 | + 0x81, 0x01, /* Input (Constant) */ | ||
38 | + 0x05, 0x01, /* Usage Page (Generic Desktop) */ | ||
39 | + 0x09, 0x30, /* Usage (X) */ | ||
40 | + 0x09, 0x31, /* Usage (Y) */ | ||
41 | + 0x15, 0x81, /* Logical Minimum (-127) */ | ||
42 | + 0x25, 0x7f, /* Logical Maximum (127) */ | ||
43 | + 0x75, 0x08, /* Report Size (8) */ | ||
44 | + 0x95, 0x02, /* Report Count (2) */ | ||
45 | + 0x81, 0x06, /* Input (Data, Variable, Relative) */ | ||
46 | + 0xc0, /* End Collection */ | ||
47 | + 0xc0, /* End Collection */ | ||
48 | + 0x05, 0x0d, /* Usage Page (Digitizer) */ | ||
49 | + 0x09, 0x01, /* Usage (Digitizer) */ | ||
50 | + 0xa1, 0x01, /* Collection (Application) */ | ||
51 | + 0x85, 0x02, /* Report ID (2) */ | ||
52 | + 0xa1, 0x00, /* Collection (Physical) */ | ||
53 | + 0x06, 0x00, 0xff, /* Usage Page (Vendor 0xff00) */ | ||
54 | + 0x09, 0x01, /* Usage (Digitizer) */ | ||
55 | + 0x15, 0x00, /* Logical Minimum (0) */ | ||
56 | + 0x26, 0xff, 0x00, /* Logical Maximum (255) */ | ||
57 | + 0x75, 0x08, /* Report Size (8) */ | ||
58 | + 0x95, 0x08, /* Report Count (8) */ | ||
59 | + 0x81, 0x02, /* Input (Data, Variable, Absolute) */ | ||
60 | + 0xc0, /* End Collection */ | ||
61 | + 0x09, 0x01, /* Usage (Digitizer) */ | ||
62 | + 0x85, 0x02, /* Report ID (2) */ | ||
63 | + 0x95, 0x01, /* Report Count (1) */ | ||
64 | + 0xb1, 0x02, /* FEATURE (2) */ | ||
65 | + 0xc0, /* End Collection */ | ||
66 | + 0x06, 0x00, 0xff, /* Usage Page (Vendor 0xff00) */ | ||
67 | + 0x09, 0x01, /* Usage (Digitizer) */ | ||
68 | + 0xa1, 0x01, /* Collection (Application) */ | ||
69 | + 0x85, 0x02, /* Report ID (2) */ | ||
70 | + 0x05, 0x0d, /* Usage Page (Digitizer) */ | ||
71 | + 0x09, 0x22, /* Usage (Finger) */ | ||
72 | + 0xa1, 0x00, /* Collection (Physical) */ | ||
73 | + 0x06, 0x00, 0xff, /* Usage Page (Vendor 0xff00) */ | ||
74 | + 0x09, 0x01, /* Usage (Digitizer) */ | ||
75 | + 0x15, 0x00, /* Logical Minimum (0) */ | ||
76 | + 0x26, 0xff, 0x00, /* Logical Maximum */ | ||
77 | + 0x75, 0x08, /* Report Size (8) */ | ||
78 | + 0x95, 0x02, /* Report Count (2) */ | ||
79 | + 0x81, 0x02, /* Input (Data, Variable, Absolute) */ | ||
80 | + 0x05, 0x01, /* Usage Page (Generic Desktop) */ | ||
81 | + 0x09, 0x30, /* Usage (X) */ | ||
82 | + 0x35, 0x00, /* Physical Minimum */ | ||
83 | + 0x46, 0xe0, 0x2e, /* Physical Maximum */ | ||
84 | + 0x26, 0xe0, 0x01, /* Logical Maximum */ | ||
85 | + 0x75, 0x10, /* Report Size (16) */ | ||
86 | + 0x95, 0x01, /* Report Count (1) */ | ||
87 | + 0x81, 0x02, /* Input (Data, Variable, Absolute) */ | ||
88 | + 0x09, 0x31, /* Usage (Y) */ | ||
89 | + 0x46, 0x40, 0x1f, /* Physical Maximum */ | ||
90 | + 0x26, 0x40, 0x01, /* Logical Maximum */ | ||
91 | + 0x81, 0x02, /* Input (Data, Variable, Absolute) */ | ||
92 | + 0x06, 0x00, 0xff, /* Usage Page (Vendor 0xff00) */ | ||
93 | + 0x09, 0x01, /* Usage (Digitizer) */ | ||
94 | + 0x26, 0xff, 0x00, /* Logical Maximum */ | ||
95 | + 0x75, 0x08, /* Report Size (8) */ | ||
96 | + 0x95, 0x0d, /* Report Count (13) */ | ||
97 | + 0x81, 0x02, /* Input (Data, Variable, Absolute) */ | ||
98 | + 0xc0, /* End Collection */ | ||
99 | + 0xc0, /* End Collection */ | ||
100 | +}; | ||
101 | + | ||
102 | + | ||
103 | static const USBDescIface desc_iface_wacom = { | ||
104 | .bInterfaceNumber = 0, | ||
105 | .bNumEndpoints = 1, | ||
106 | @@ -85,7 +168,7 @@ | ||
107 | 0x00, /* u8 country_code */ | ||
108 | 0x01, /* u8 num_descriptors */ | ||
109 | 0x22, /* u8 type: Report */ | ||
110 | - 0x6e, 0, /* u16 len */ | ||
111 | + sizeof(qemu_tablet_hid_report_descriptor), 0, /* u16 len */ | ||
112 | }, | ||
113 | }, | ||
114 | }, | ||
115 | @@ -265,6 +350,15 @@ | ||
116 | } | ||
117 | |||
118 | switch (request) { | ||
119 | + case InterfaceRequest | USB_REQ_GET_DESCRIPTOR: | ||
120 | + switch (value >> 8) { | ||
121 | + case 0x22: | ||
122 | + memcpy(data, qemu_tablet_hid_report_descriptor, | ||
123 | + sizeof(qemu_tablet_hid_report_descriptor)); | ||
124 | + p->actual_length = sizeof(qemu_tablet_hid_report_descriptor); | ||
125 | + break; | ||
126 | + } | ||
127 | + break; | ||
128 | case WACOM_SET_REPORT: | ||
129 | if (s->mouse_grabbed) { | ||
130 | qemu_remove_mouse_event_handler(s->eh_entry); | ||
diff --git a/meta/recipes-devtools/qemu/qemu_2.1.0.bb b/meta/recipes-devtools/qemu/qemu_2.1.0.bb new file mode 100644 index 0000000000..92a89d699c --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu_2.1.0.bb | |||
@@ -0,0 +1,32 @@ | |||
1 | require qemu.inc | ||
2 | |||
3 | LIC_FILES_CHKSUM = "file://COPYING;md5=441c28d2cf86e15a37fa47e15a72fbac \ | ||
4 | file://COPYING.LIB;endline=24;md5=c04def7ae38850e7d3ef548588159913" | ||
5 | |||
6 | SRC_URI += "file://configure-fix-Darwin-target-detection.patch \ | ||
7 | file://qemu-enlarge-env-entry-size.patch \ | ||
8 | file://Qemu-Arm-versatilepb-Add-memory-size-checking.patch \ | ||
9 | file://0001-Back-porting-security-fix-CVE-2014-5388.patch \ | ||
10 | file://qemu-CVE-2015-3456.patch \ | ||
11 | file://CVE-2014-7840.patch \ | ||
12 | file://vnc-CVE-2014-7815.patch \ | ||
13 | file://slirp-CVE-2014-3640.patch \ | ||
14 | " | ||
15 | SRC_URI_prepend = "http://wiki.qemu-project.org/download/${BP}.tar.bz2" | ||
16 | SRC_URI[md5sum] = "6726977292b448cbc7f89998fac6983b" | ||
17 | SRC_URI[sha256sum] = "397e23184f4bf613589a8fe0c6542461dc2afdf17ed337e97e6fd2f31e8f8802" | ||
18 | |||
19 | COMPATIBLE_HOST_class-target_mips64 = "null" | ||
20 | |||
21 | do_sanitize_sources() { | ||
22 | # These .git files point to a nonexistent path "../.git/modules" and will confuse git | ||
23 | # if it tries to recurse into those directories. | ||
24 | rm -f ${S}/dtc/.git ${S}/pixman/.git | ||
25 | } | ||
26 | |||
27 | addtask sanitize_sources after do_unpack before do_patch | ||
28 | |||
29 | do_install_append() { | ||
30 | # Prevent QA warnings about installed ${localstatedir}/run | ||
31 | if [ -d ${D}${localstatedir}/run ]; then rmdir ${D}${localstatedir}/run; fi | ||
32 | } | ||
diff --git a/meta/recipes-devtools/qemu/qemu_git.bb b/meta/recipes-devtools/qemu/qemu_git.bb new file mode 100644 index 0000000000..a30932a8ba --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu_git.bb | |||
@@ -0,0 +1,15 @@ | |||
1 | require qemu.inc | ||
2 | |||
3 | SRCREV = "04024dea2674861fcf13582a77b58130c67fccd8" | ||
4 | |||
5 | LIC_FILES_CHKSUM = "file://COPYING;md5=441c28d2cf86e15a37fa47e15a72fbac \ | ||
6 | file://COPYING.LIB;endline=24;md5=c04def7ae38850e7d3ef548588159913" | ||
7 | |||
8 | PV = "1.3.0+git${SRCPV}" | ||
9 | |||
10 | SRC_URI_prepend = "git://git.qemu.org/qemu.git" | ||
11 | S = "${WORKDIR}/git" | ||
12 | |||
13 | DEFAULT_PREFERENCE = "-1" | ||
14 | |||
15 | COMPATIBLE_HOST_class-target_mips64 = "null" | ||
diff --git a/meta/recipes-devtools/qemu/qemuwrapper-cross_1.0.bb b/meta/recipes-devtools/qemu/qemuwrapper-cross_1.0.bb new file mode 100644 index 0000000000..d2981b5575 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemuwrapper-cross_1.0.bb | |||
@@ -0,0 +1,48 @@ | |||
1 | SUMMARY = "QEMU wrapper script" | ||
2 | LICENSE = "MIT" | ||
3 | LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" | ||
4 | |||
5 | inherit qemu | ||
6 | |||
7 | do_install () { | ||
8 | install -d ${D}${bindir_crossscripts}/ | ||
9 | |||
10 | echo "#!/bin/sh" > ${D}${bindir_crossscripts}/qemuwrapper | ||
11 | qemu_binary=${@qemu_target_binary(d)} | ||
12 | qemu_options='${@d.getVar("QEMU_OPTIONS_%s" % d.getVar('PACKAGE_ARCH', True), True) or d.getVar('QEMU_OPTIONS', True) or ""}' | ||
13 | echo "$qemu_binary $qemu_options \"\$@\"" >> ${D}${bindir_crossscripts}/qemuwrapper | ||
14 | fallback_qemu_bin= | ||
15 | case $qemu_binary in | ||
16 | "qemu-i386") | ||
17 | fallback_qemu_bin=qemu-x86_64 | ||
18 | ;; | ||
19 | "qemu-x86_64") | ||
20 | fallback_qemu_bin=qemu-i386 | ||
21 | ;; | ||
22 | *) | ||
23 | ;; | ||
24 | esac | ||
25 | |||
26 | if [ -n "$fallback_qemu_bin" ]; then | ||
27 | |||
28 | cat >> ${D}${bindir_crossscripts}/qemuwrapper << EOF | ||
29 | rc=\$? | ||
30 | if [ \$rc = 255 ]; then | ||
31 | $fallback_qemu_bin "\$@" | ||
32 | rc=\$? | ||
33 | fi | ||
34 | exit \$rc | ||
35 | EOF | ||
36 | |||
37 | fi | ||
38 | |||
39 | chmod +x ${D}${bindir_crossscripts}/qemuwrapper | ||
40 | } | ||
41 | |||
42 | SYSROOT_PREPROCESS_FUNCS += "qemuwrapper_sysroot_preprocess" | ||
43 | |||
44 | qemuwrapper_sysroot_preprocess () { | ||
45 | sysroot_stage_dir ${D}${bindir_crossscripts} ${SYSROOT_DESTDIR}${bindir_crossscripts} | ||
46 | } | ||
47 | |||
48 | INHIBIT_DEFAULT_DEPS = "1" | ||