diff options
| author | Christian Krinitsin <mail@krinitsin.com> | 2025-06-16 16:59:00 +0000 |
|---|---|---|
| committer | Christian Krinitsin <mail@krinitsin.com> | 2025-06-16 16:59:33 +0000 |
| commit | 9aba81d8eb048db908c94a3c40c25a5fde0caee6 (patch) | |
| tree | b765e7fb5e9a3c2143c68b0414e0055adb70e785 /results/classifier/118/all/1895080 | |
| parent | b89a938452613061c0f1f23e710281cf5c83cb29 (diff) | |
| download | qemu-analysis-9aba81d8eb048db908c94a3c40c25a5fde0caee6.tar.gz qemu-analysis-9aba81d8eb048db908c94a3c40c25a5fde0caee6.zip | |
add 18th iteration of classifier
Diffstat (limited to 'results/classifier/118/all/1895080')
| -rw-r--r-- | results/classifier/118/all/1895080 | 1357 |
1 files changed, 1357 insertions, 0 deletions
diff --git a/results/classifier/118/all/1895080 b/results/classifier/118/all/1895080 new file mode 100644 index 000000000..bbef68390 --- /dev/null +++ b/results/classifier/118/all/1895080 @@ -0,0 +1,1357 @@ +peripherals: 0.942 +permissions: 0.942 +arm: 0.933 +register: 0.915 +device: 0.912 +socket: 0.911 +user-level: 0.911 +debug: 0.911 +performance: 0.909 +semantic: 0.906 +architecture: 0.905 +x86: 0.905 +hypervisor: 0.903 +risc-v: 0.902 +ppc: 0.901 +KVM: 0.899 +assembly: 0.898 +vnc: 0.897 +graphic: 0.897 +PID: 0.893 +virtual: 0.891 +network: 0.882 +VMM: 0.881 +TCG: 0.866 +files: 0.861 +boot: 0.842 +i386: 0.838 +kernel: 0.835 +mistranslation: 0.796 + +pgb_reserved_va: Assertion `addr == test' failed + +This problem occurs on CentOS-7.5 (64-bit) with qemu-5.1.0, qemu head (commit 9435a8b3dd35f1f926f1b9127e8a906217a5518a) for riscv32-linux-user. + +Firstly, compile fails: +Compiling C object libqemu-riscv32-linux-user.fa.p/linux-user_strace.c.o +../qemu.git/linux-user/strace.c:1210:18: error: ‘FALLOC_FL_KEEP_SIZE’ undeclared here (not in a function) + FLAG_GENERIC(FALLOC_FL_KEEP_SIZE), + +I have to add below include to linux-user/strace.c +diff --git a/linux-user/strace.c b/linux-user/strace.c +index 11fea14fba..22e51d4a8a 100644 +--- a/linux-user/strace.c ++++ b/linux-user/strace.c +@@ -7,6 +7,7 @@ + #include <sys/mount.h> + #include <arpa/inet.h> + #include <netinet/tcp.h> ++#include <linux/falloc.h> + #include <linux/if_packet.h> + #include <linux/netlink.h> + #include <sched.h> + +Then trying qemu-riscv32 with a simple ELF, I get: +linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' failed. + +strace shows that: +mmap(0x1000, 4294963200, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' failed. +) = 103 + +The source code is in the function pgb_reserved_va (linux-user/elfload.c). I think mmap cannot guarantee that the returned pointer (test) equals to the parameter of addr. So is this a bug to assert (addr == test)? + +Attached configure script and test ELF file. + +Thanks. + + + +Le 10/09/2020 à 07:21, Launchpad Bug Tracker a écrit : +> This problem occurs on CentOS-7.5 (64-bit) with qemu-5.1.0, qemu head +> (commit 9435a8b3dd35f1f926f1b9127e8a906217a5518a) for riscv32-linux- +> user. + +I tried to build qemu-5.1 on CentOS-7.5.1 but as python 3.5 is not +available, I gave up. + +> Firstly, compile fails: +> Compiling C object libqemu-riscv32-linux-user.fa.p/linux-user_strace.c.o +> ../qemu.git/linux-user/strace.c:1210:18: error: ‘FALLOC_FL_KEEP_SIZE’ undeclared here (not in a function) +> FLAG_GENERIC(FALLOC_FL_KEEP_SIZE), +> +> I have to add below include to linux-user/strace.c +> diff --git a/linux-user/strace.c b/linux-user/strace.c +> index 11fea14fba..22e51d4a8a 100644 +> --- a/linux-user/strace.c +> +++ b/linux-user/strace.c +> @@ -7,6 +7,7 @@ +> #include <sys/mount.h> +> #include <arpa/inet.h> +> #include <netinet/tcp.h> +> +#include <linux/falloc.h> +> #include <linux/if_packet.h> +> #include <linux/netlink.h> +> #include <sched.h> + +In fact, fallocate(2) says fcntl.h must be included. +And qemu/osdep.h includes it. +So you should not have this problem. + +> +> Then trying qemu-riscv32 with a simple ELF, I get: +> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' failed. +> +> strace shows that: +> mmap(0x1000, 4294963200, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' failed. +> ) = 103 +> +> The source code is in the function pgb_reserved_va (linux- +> user/elfload.c). I think mmap cannot guarantee that the returned pointer +> (test) equals to the parameter of addr. So is this a bug to assert (addr +> == test)? + +I think Alex Bennée knows better this code than I do, so cc'ing him. + +Thnaks +Laurent + + +> This problem occurs on CentOS-7.5 (64-bit) with qemu-5.1.0, qemu head +> > (commit 9435a8b3dd35f1f926f1b9127e8a906217a5518a) for riscv32-linux- +> > user. +> +> I tried to build qemu-5.1 on CentOS-7.5.1 but as python 3.5 is not +> available, I gave up. +> + +Thank you for your effort. I installed python3 with yum: +python3.x86_64 3.6.8-10.el7 @centos +Then maybe you can specify python3 in configure with +"--python=/bin/python3" in case configure cannot find it. + + +> +> > Firstly, compile fails: +> > Compiling C object libqemu-riscv32-linux-user.fa.p/linux-user_strace.c.o +> > ../qemu.git/linux-user/strace.c:1210:18: error: ‘FALLOC_FL_KEEP_SIZE’ +> undeclared here (not in a function) +> > FLAG_GENERIC(FALLOC_FL_KEEP_SIZE), +> > +> > I have to add below include to linux-user/strace.c +> > diff --git a/linux-user/strace.c b/linux-user/strace.c +> > index 11fea14fba..22e51d4a8a 100644 +> > --- a/linux-user/strace.c +> > +++ b/linux-user/strace.c +> > @@ -7,6 +7,7 @@ +> > #include <sys/mount.h> +> > #include <arpa/inet.h> +> > #include <netinet/tcp.h> +> > +#include <linux/falloc.h> +> > #include <linux/if_packet.h> +> > #include <linux/netlink.h> +> > #include <sched.h> +> +> In fact, fallocate(2) says fcntl.h must be included. +> And qemu/osdep.h includes it. +> So you should not have this problem. +> + +I tried to save the file after pre-processing, namely strace.i. Though +_GNU_SOURCE is defined and fcntl.h is included, falloc.h is not included, +in which FALLOC_FL_KEEP_SIZE is defined. I'm not sure if it's some +environmental problem. + +Thanks. + +> +> > Then trying qemu-riscv32 with a simple ELF, I get: +> > linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' +> failed. +> > +> > strace shows that: +> > mmap(0x1000, 4294963200, PROT_NONE, +> MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +> > write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: +> ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == +> test' failed. +> > ) = 103 +> > +> > The source code is in the function pgb_reserved_va (linux- +> > user/elfload.c). I think mmap cannot guarantee that the returned pointer +> > (test) equals to the parameter of addr. So is this a bug to assert (addr +> > == test)? +> +> I think Alex Bennée knows better this code than I do, so cc'ing him. +> +> Thnaks +> Laurent +> +> -- +> You received this bug notification because you are subscribed to the bug +> report. +> https://bugs.launchpad.net/bugs/1895080 +> +> Title: +> pgb_reserved_va: Assertion `addr == test' failed +> +> Status in QEMU: +> New +> +> Bug description: +> This problem occurs on CentOS-7.5 (64-bit) with qemu-5.1.0, qemu head +> (commit 9435a8b3dd35f1f926f1b9127e8a906217a5518a) for riscv32-linux- +> user. +> +> Firstly, compile fails: +> Compiling C object libqemu-riscv32-linux-user.fa.p/linux-user_strace.c.o +> ../qemu.git/linux-user/strace.c:1210:18: error: ‘FALLOC_FL_KEEP_SIZE’ +> undeclared here (not in a function) +> FLAG_GENERIC(FALLOC_FL_KEEP_SIZE), +> +> I have to add below include to linux-user/strace.c +> diff --git a/linux-user/strace.c b/linux-user/strace.c +> index 11fea14fba..22e51d4a8a 100644 +> --- a/linux-user/strace.c +> +++ b/linux-user/strace.c +> @@ -7,6 +7,7 @@ +> #include <sys/mount.h> +> #include <arpa/inet.h> +> #include <netinet/tcp.h> +> +#include <linux/falloc.h> +> #include <linux/if_packet.h> +> #include <linux/netlink.h> +> #include <sched.h> +> +> Then trying qemu-riscv32 with a simple ELF, I get: +> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' +> failed. +> +> strace shows that: +> mmap(0x1000, 4294963200, PROT_NONE, +> MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: +> ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == +> test' failed. +> ) = 103 +> +> The source code is in the function pgb_reserved_va (linux- +> user/elfload.c). I think mmap cannot guarantee that the returned +> pointer (test) equals to the parameter of addr. So is this a bug to +> assert (addr == test)? +> +> Attached configure script and test ELF file. +> +> Thanks. +> +> To manage notifications about this bug go to: +> https://bugs.launchpad.net/qemu/+bug/1895080/+subscriptions +> + + +Have you got a static version of the test binary (or a mini rootfs with the libraries it needs)? + +Have you got a static version of the test binary (or a mini rootfs with +> the libraries it needs)? +> + +If the problem occurs, it does not reach the stage of the dependent +libraries of the test ELF. Anyway, I've attached the static test binary as +hello.static.elf. +Thanks + + +> -- +> You received this bug notification because you are subscribed to the bug +> report. +> https://bugs.launchpad.net/bugs/1895080 +> +> Title: +> pgb_reserved_va: Assertion `addr == test' failed +> +> Status in QEMU: +> New +> +> Bug description: +> This problem occurs on CentOS-7.5 (64-bit) with qemu-5.1.0, qemu head +> (commit 9435a8b3dd35f1f926f1b9127e8a906217a5518a) for riscv32-linux- +> user. +> +> Firstly, compile fails: +> Compiling C object libqemu-riscv32-linux-user.fa.p/linux-user_strace.c.o +> ../qemu.git/linux-user/strace.c:1210:18: error: ‘FALLOC_FL_KEEP_SIZE’ +> undeclared here (not in a function) +> FLAG_GENERIC(FALLOC_FL_KEEP_SIZE), +> +> I have to add below include to linux-user/strace.c +> diff --git a/linux-user/strace.c b/linux-user/strace.c +> index 11fea14fba..22e51d4a8a 100644 +> --- a/linux-user/strace.c +> +++ b/linux-user/strace.c +> @@ -7,6 +7,7 @@ +> #include <sys/mount.h> +> #include <arpa/inet.h> +> #include <netinet/tcp.h> +> +#include <linux/falloc.h> +> #include <linux/if_packet.h> +> #include <linux/netlink.h> +> #include <sched.h> +> +> Then trying qemu-riscv32 with a simple ELF, I get: +> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' +> failed. +> +> strace shows that: +> mmap(0x1000, 4294963200, PROT_NONE, +> MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: +> ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == +> test' failed. +> ) = 103 +> +> The source code is in the function pgb_reserved_va (linux- +> user/elfload.c). I think mmap cannot guarantee that the returned +> pointer (test) equals to the parameter of addr. So is this a bug to +> assert (addr == test)? +> +> Attached configure script and test ELF file. +> +> Thanks. +> +> To manage notifications about this bug go to: +> https://bugs.launchpad.net/qemu/+bug/1895080/+subscriptions +> + + + +Laurent Vivier <email address hidden> writes: + +> Le 10/09/2020 à 07:21, Launchpad Bug Tracker a écrit : +>> This problem occurs on CentOS-7.5 (64-bit) with qemu-5.1.0, qemu head +>> (commit 9435a8b3dd35f1f926f1b9127e8a906217a5518a) for riscv32-linux- +>> user. +> +> I tried to build qemu-5.1 on CentOS-7.5.1 but as python 3.5 is not +> available, I gave up. +> +>> Firstly, compile fails: +>> Compiling C object libqemu-riscv32-linux-user.fa.p/linux-user_strace.c.o +>> ../qemu.git/linux-user/strace.c:1210:18: error: ‘FALLOC_FL_KEEP_SIZE’ undeclared here (not in a function) +>> FLAG_GENERIC(FALLOC_FL_KEEP_SIZE), +>> +>> I have to add below include to linux-user/strace.c +>> diff --git a/linux-user/strace.c b/linux-user/strace.c +>> index 11fea14fba..22e51d4a8a 100644 +>> --- a/linux-user/strace.c +>> +++ b/linux-user/strace.c +>> @@ -7,6 +7,7 @@ +>> #include <sys/mount.h> +>> #include <arpa/inet.h> +>> #include <netinet/tcp.h> +>> +#include <linux/falloc.h> +>> #include <linux/if_packet.h> +>> #include <linux/netlink.h> +>> #include <sched.h> +> +> In fact, fallocate(2) says fcntl.h must be included. +> And qemu/osdep.h includes it. +> So you should not have this problem. +> +>> +>> Then trying qemu-riscv32 with a simple ELF, I get: +>> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' failed. +>> +>> strace shows that: +>> mmap(0x1000, 4294963200, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +>> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' failed. +>> ) = 103 +>> +>> The source code is in the function pgb_reserved_va (linux- +>> user/elfload.c). I think mmap cannot guarantee that the returned pointer +>> (test) equals to the parameter of addr. So is this a bug to assert (addr +>> == test)? +> +> I think Alex Bennée knows better this code than I do, so cc'ing him. + +It should be able to do so because the earlier code (pgb_static) checks +for a hole the size of reserved_va in the host memory map. This should +be fairly easy for 32 bit guests given the amount of spare address space +you have on a 64 bit system. + +I'm assuming CentOS 7.5 actually has a definition for +MAP_FIXED_NOREPLACE which should ensure we get what we asked for - +otherwise we are in the position of hoping the kernel honours what we +asked for. + +> +> Thnaks +> Laurent + + +-- +Alex Bennée + + + +Alex Bennée <email address hidden> writes: + +> Laurent Vivier <email address hidden> writes: +> +<snip> +>>> Then trying qemu-riscv32 with a simple ELF, I get: +>>> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' failed. +>>> +>>> strace shows that: +>>> mmap(0x1000, 4294963200, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +>>> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' failed. +>>> ) = 103 +>>> +>>> The source code is in the function pgb_reserved_va (linux- +>>> user/elfload.c). I think mmap cannot guarantee that the returned pointer +>>> (test) equals to the parameter of addr. So is this a bug to assert (addr +>>> == test)? +>> +> I'm assuming CentOS 7.5 actually has a definition for +> MAP_FIXED_NOREPLACE which should ensure we get what we asked for - +> otherwise we are in the position of hoping the kernel honours what we +> asked for. + +Doh re-reading I see it's not set in the strace output. Maybe we should +promote the assert case to the failure leg so we have: + + if (addr == MAP_FAILED || addr != test) { + error_report(...) + } + +so we at least fail with a user friendly error rather than an abort? + +-- +Alex Bennée + + +No, it's not set by CentOS-7.5. +Does it mean that we just cannot run the ELF in such a case? I've tried +many times, the assert always fails. Maybe, we can blame CentOS-7.5. +BTW: with the option "-p 65536", the case runs successfully. + +On Fri, Sep 11, 2020 at 5:50 PM Alex Bennée <email address hidden> +wrote: + +> Alex Bennée <email address hidden> writes: +> +> > Laurent Vivier <email address hidden> writes: +> > +> <snip> +> >>> Then trying qemu-riscv32 with a simple ELF, I get: +> >>> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' +> failed. +> >>> +> >>> strace shows that: +> >>> mmap(0x1000, 4294963200, PROT_NONE, +> MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +> >>> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: +> ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == +> test' failed. +> >>> ) = 103 +> >>> +> >>> The source code is in the function pgb_reserved_va (linux- +> >>> user/elfload.c). I think mmap cannot guarantee that the returned +> pointer +> >>> (test) equals to the parameter of addr. So is this a bug to assert +> (addr +> >>> == test)? +> >> +> > I'm assuming CentOS 7.5 actually has a definition for +> > MAP_FIXED_NOREPLACE which should ensure we get what we asked for - +> > otherwise we are in the position of hoping the kernel honours what we +> > asked for. +> +> Doh re-reading I see it's not set in the strace output. Maybe we should +> promote the assert case to the failure leg so we have: +> +> if (addr == MAP_FAILED || addr != test) { +> error_report(...) +> } +> +> so we at least fail with a user friendly error rather than an abort? +> +> -- +> Alex Bennée +> +> -- +> You received this bug notification because you are subscribed to the bug +> report. +> https://bugs.launchpad.net/bugs/1895080 +> +> Title: +> pgb_reserved_va: Assertion `addr == test' failed +> +> Status in QEMU: +> New +> +> Bug description: +> This problem occurs on CentOS-7.5 (64-bit) with qemu-5.1.0, qemu head +> (commit 9435a8b3dd35f1f926f1b9127e8a906217a5518a) for riscv32-linux- +> user. +> +> Firstly, compile fails: +> Compiling C object libqemu-riscv32-linux-user.fa.p/linux-user_strace.c.o +> ../qemu.git/linux-user/strace.c:1210:18: error: ‘FALLOC_FL_KEEP_SIZE’ +> undeclared here (not in a function) +> FLAG_GENERIC(FALLOC_FL_KEEP_SIZE), +> +> I have to add below include to linux-user/strace.c +> diff --git a/linux-user/strace.c b/linux-user/strace.c +> index 11fea14fba..22e51d4a8a 100644 +> --- a/linux-user/strace.c +> +++ b/linux-user/strace.c +> @@ -7,6 +7,7 @@ +> #include <sys/mount.h> +> #include <arpa/inet.h> +> #include <netinet/tcp.h> +> +#include <linux/falloc.h> +> #include <linux/if_packet.h> +> #include <linux/netlink.h> +> #include <sched.h> +> +> Then trying qemu-riscv32 with a simple ELF, I get: +> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' +> failed. +> +> strace shows that: +> mmap(0x1000, 4294963200, PROT_NONE, +> MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: +> ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == +> test' failed. +> ) = 103 +> +> The source code is in the function pgb_reserved_va (linux- +> user/elfload.c). I think mmap cannot guarantee that the returned +> pointer (test) equals to the parameter of addr. So is this a bug to +> assert (addr == test)? +> +> Attached configure script and test ELF file. +> +> Thanks. +> +> To manage notifications about this bug go to: +> https://bugs.launchpad.net/qemu/+bug/1895080/+subscriptions +> + + + +Hansni Bu <email address hidden> writes: + +> No, it's not set by CentOS-7.5. +> Does it mean that we just cannot run the ELF in such a case? I've tried +> many times, the assert always fails. Maybe, we can blame CentOS-7.5. + +The trouble is without MAP_FIXED_NOREPLACE we are at the mercy of the +host kernel to allow the address request to be honoured. A plain +MAP_FIXED won't do as it can clober existing mappings. In theory a +suitable hole has been identified but sometimes the kernel makes a +decision to offset the suggested mapping for it's own reasons. + +> BTW: with the option "-p 65536", the case runs successfully. + +Hmm interesting. I wonder if we are seeing a fail due to mmap_min_addr? +What does: + + /proc/sys/vm/mmap_min_addr + +give you on the system? + +You can manually set the reserved_va and the base address using -R and +-B although that is more of a developer work around. I think moving the +assert to the condition above would be an improvement just because it +tells us what the requested base address was and what the kernel decided +to give us. + +> +> On Fri, Sep 11, 2020 at 5:50 PM Alex Bennée <email address hidden> +> wrote: +> +>> Alex Bennée <email address hidden> writes: +>> +>> > Laurent Vivier <email address hidden> writes: +>> > +>> <snip> +>> >>> Then trying qemu-riscv32 with a simple ELF, I get: +>> >>> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' +>> failed. +>> >>> +>> >>> strace shows that: +>> >>> mmap(0x1000, 4294963200, PROT_NONE, +>> MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +>> >>> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: +>> ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == +>> test' failed. +>> >>> ) = 103 +>> >>> +>> >>> The source code is in the function pgb_reserved_va (linux- +>> >>> user/elfload.c). I think mmap cannot guarantee that the returned +>> pointer +>> >>> (test) equals to the parameter of addr. So is this a bug to assert +>> (addr +>> >>> == test)? +>> >> +>> > I'm assuming CentOS 7.5 actually has a definition for +>> > MAP_FIXED_NOREPLACE which should ensure we get what we asked for - +>> > otherwise we are in the position of hoping the kernel honours what we +>> > asked for. +>> +>> Doh re-reading I see it's not set in the strace output. Maybe we should +>> promote the assert case to the failure leg so we have: +>> +>> if (addr == MAP_FAILED || addr != test) { +>> error_report(...) +>> } +>> +>> so we at least fail with a user friendly error rather than an abort? +>> +>> -- +>> Alex Bennée +>> +>> -- +>> You received this bug notification because you are subscribed to the bug +>> report. +>> https://bugs.launchpad.net/bugs/1895080 +>> +>> Title: +>> pgb_reserved_va: Assertion `addr == test' failed +>> +>> Status in QEMU: +>> New +>> +>> Bug description: +>> This problem occurs on CentOS-7.5 (64-bit) with qemu-5.1.0, qemu head +>> (commit 9435a8b3dd35f1f926f1b9127e8a906217a5518a) for riscv32-linux- +>> user. +>> +>> Firstly, compile fails: +>> Compiling C object libqemu-riscv32-linux-user.fa.p/linux-user_strace.c.o +>> ../qemu.git/linux-user/strace.c:1210:18: error: ‘FALLOC_FL_KEEP_SIZE’ +>> undeclared here (not in a function) +>> FLAG_GENERIC(FALLOC_FL_KEEP_SIZE), +>> +>> I have to add below include to linux-user/strace.c +>> diff --git a/linux-user/strace.c b/linux-user/strace.c +>> index 11fea14fba..22e51d4a8a 100644 +>> --- a/linux-user/strace.c +>> +++ b/linux-user/strace.c +>> @@ -7,6 +7,7 @@ +>> #include <sys/mount.h> +>> #include <arpa/inet.h> +>> #include <netinet/tcp.h> +>> +#include <linux/falloc.h> +>> #include <linux/if_packet.h> +>> #include <linux/netlink.h> +>> #include <sched.h> +>> +>> Then trying qemu-riscv32 with a simple ELF, I get: +>> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' +>> failed. +>> +>> strace shows that: +>> mmap(0x1000, 4294963200, PROT_NONE, +>> MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +>> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: +>> ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == +>> test' failed. +>> ) = 103 +>> +>> The source code is in the function pgb_reserved_va (linux- +>> user/elfload.c). I think mmap cannot guarantee that the returned +>> pointer (test) equals to the parameter of addr. So is this a bug to +>> assert (addr == test)? +>> +>> Attached configure script and test ELF file. +>> +>> Thanks. +>> +>> To manage notifications about this bug go to: +>> https://bugs.launchpad.net/qemu/+bug/1895080/+subscriptions +>> + + +-- +Alex Bennée + + +> > No, it's not set by CentOS-7.5. +> > Does it mean that we just cannot run the ELF in such a case? I've tried +> > many times, the assert always fails. Maybe, we can blame CentOS-7.5. +> +> The trouble is without MAP_FIXED_NOREPLACE we are at the mercy of the +> host kernel to allow the address request to be honoured. A plain +> MAP_FIXED won't do as it can clober existing mappings. In theory a +> suitable hole has been identified but sometimes the kernel makes a +> decision to offset the suggested mapping for it's own reasons. +> + +MAP_FIXED_NOREPLACE is quite a new feature. + + +> > BTW: with the option "-p 65536", the case runs successfully. +> +> Hmm interesting. I wonder if we are seeing a fail due to mmap_min_addr? +> What does: +> +> /proc/sys/vm/mmap_min_addr +> +> give you on the system? +> + +It gives me 4096. And guest_base has this value. Maybe that's the strange +point. mmap_min_addr give us 0x1000. While we are requesting this address, +the kernel gives us 0x10000. + + +> +> You can manually set the reserved_va and the base address using -R and +> -B although that is more of a developer work around. I think moving the +> assert to the condition above would be an improvement just because it +> tells us what the requested base address was and what the kernel decided +> to give us. +> + +Setting guest_base with -B to 0x10000 works. Tried some -R values, no luck. +Agree to print a more hintful message. + + +> +> > +> > On Fri, Sep 11, 2020 at 5:50 PM Alex Bennée <email address hidden> +> > wrote: +> > +> >> Alex Bennée <email address hidden> writes: +> >> +> >> > Laurent Vivier <email address hidden> writes: +> >> > +> >> <snip> +> >> >>> Then trying qemu-riscv32 with a simple ELF, I get: +> >> >>> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' +> >> failed. +> >> >>> +> >> >>> strace shows that: +> >> >>> mmap(0x1000, 4294963200, PROT_NONE, +> >> MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +> >> >>> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: +> >> ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr +> == +> >> test' failed. +> >> >>> ) = 103 +> >> >>> +> >> >>> The source code is in the function pgb_reserved_va (linux- +> >> >>> user/elfload.c). I think mmap cannot guarantee that the returned +> >> pointer +> >> >>> (test) equals to the parameter of addr. So is this a bug to assert +> >> (addr +> >> >>> == test)? +> >> >> +> >> > I'm assuming CentOS 7.5 actually has a definition for +> >> > MAP_FIXED_NOREPLACE which should ensure we get what we asked for - +> >> > otherwise we are in the position of hoping the kernel honours what we +> >> > asked for. +> >> +> >> Doh re-reading I see it's not set in the strace output. Maybe we should +> >> promote the assert case to the failure leg so we have: +> >> +> >> if (addr == MAP_FAILED || addr != test) { +> >> error_report(...) +> >> } +> >> +> >> so we at least fail with a user friendly error rather than an abort? +> >> +> >> -- +> >> Alex Bennée +> >> +> >> -- +> >> You received this bug notification because you are subscribed to the bug +> >> report. +> >> https://bugs.launchpad.net/bugs/1895080 +> >> +> >> Title: +> >> pgb_reserved_va: Assertion `addr == test' failed +> >> +> >> Status in QEMU: +> >> New +> >> +> >> Bug description: +> >> This problem occurs on CentOS-7.5 (64-bit) with qemu-5.1.0, qemu head +> >> (commit 9435a8b3dd35f1f926f1b9127e8a906217a5518a) for riscv32-linux- +> >> user. +> >> +> >> Firstly, compile fails: +> >> Compiling C object +> libqemu-riscv32-linux-user.fa.p/linux-user_strace.c.o +> >> ../qemu.git/linux-user/strace.c:1210:18: error: ‘FALLOC_FL_KEEP_SIZE’ +> >> undeclared here (not in a function) +> >> FLAG_GENERIC(FALLOC_FL_KEEP_SIZE), +> >> +> >> I have to add below include to linux-user/strace.c +> >> diff --git a/linux-user/strace.c b/linux-user/strace.c +> >> index 11fea14fba..22e51d4a8a 100644 +> >> --- a/linux-user/strace.c +> >> +++ b/linux-user/strace.c +> >> @@ -7,6 +7,7 @@ +> >> #include <sys/mount.h> +> >> #include <arpa/inet.h> +> >> #include <netinet/tcp.h> +> >> +#include <linux/falloc.h> +> >> #include <linux/if_packet.h> +> >> #include <linux/netlink.h> +> >> #include <sched.h> +> >> +> >> Then trying qemu-riscv32 with a simple ELF, I get: +> >> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' +> >> failed. +> >> +> >> strace shows that: +> >> mmap(0x1000, 4294963200, PROT_NONE, +> >> MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +> >> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: +> >> ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr +> == +> >> test' failed. +> >> ) = 103 +> >> +> >> The source code is in the function pgb_reserved_va (linux- +> >> user/elfload.c). I think mmap cannot guarantee that the returned +> >> pointer (test) equals to the parameter of addr. So is this a bug to +> >> assert (addr == test)? +> >> +> >> Attached configure script and test ELF file. +> >> +> >> Thanks. +> >> +> >> To manage notifications about this bug go to: +> >> https://bugs.launchpad.net/qemu/+bug/1895080/+subscriptions +> >> +> +> +> -- +> Alex Bennée +> +> -- +> You received this bug notification because you are subscribed to the bug +> report. +> https://bugs.launchpad.net/bugs/1895080 +> +> Title: +> pgb_reserved_va: Assertion `addr == test' failed +> +> Status in QEMU: +> New +> +> Bug description: +> This problem occurs on CentOS-7.5 (64-bit) with qemu-5.1.0, qemu head +> (commit 9435a8b3dd35f1f926f1b9127e8a906217a5518a) for riscv32-linux- +> user. +> +> Firstly, compile fails: +> Compiling C object libqemu-riscv32-linux-user.fa.p/linux-user_strace.c.o +> ../qemu.git/linux-user/strace.c:1210:18: error: ‘FALLOC_FL_KEEP_SIZE’ +> undeclared here (not in a function) +> FLAG_GENERIC(FALLOC_FL_KEEP_SIZE), +> +> I have to add below include to linux-user/strace.c +> diff --git a/linux-user/strace.c b/linux-user/strace.c +> index 11fea14fba..22e51d4a8a 100644 +> --- a/linux-user/strace.c +> +++ b/linux-user/strace.c +> @@ -7,6 +7,7 @@ +> #include <sys/mount.h> +> #include <arpa/inet.h> +> #include <netinet/tcp.h> +> +#include <linux/falloc.h> +> #include <linux/if_packet.h> +> #include <linux/netlink.h> +> #include <sched.h> +> +> Then trying qemu-riscv32 with a simple ELF, I get: +> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' +> failed. +> +> strace shows that: +> mmap(0x1000, 4294963200, PROT_NONE, +> MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: +> ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == +> test' failed. +> ) = 103 +> +> The source code is in the function pgb_reserved_va (linux- +> user/elfload.c). I think mmap cannot guarantee that the returned +> pointer (test) equals to the parameter of addr. So is this a bug to +> assert (addr == test)? +> +> Attached configure script and test ELF file. +> +> Thanks. +> +> To manage notifications about this bug go to: +> https://bugs.launchpad.net/qemu/+bug/1895080/+subscriptions +> + + + +Hansni Bu <email address hidden> writes: + +>> > No, it's not set by CentOS-7.5. +>> > Does it mean that we just cannot run the ELF in such a case? I've tried +>> > many times, the assert always fails. Maybe, we can blame CentOS-7.5. +>> +>> The trouble is without MAP_FIXED_NOREPLACE we are at the mercy of the +>> host kernel to allow the address request to be honoured. A plain +>> MAP_FIXED won't do as it can clober existing mappings. In theory a +>> suitable hole has been identified but sometimes the kernel makes a +>> decision to offset the suggested mapping for it's own reasons. +>> +> +> MAP_FIXED_NOREPLACE is quite a new feature. +> +> +>> > BTW: with the option "-p 65536", the case runs successfully. +>> +>> Hmm interesting. I wonder if we are seeing a fail due to mmap_min_addr? +>> What does: +>> +>> /proc/sys/vm/mmap_min_addr +>> +>> give you on the system? +>> +> +> It gives me 4096. And guest_base has this value. Maybe that's the strange +> point. mmap_min_addr give us 0x1000. While we are requesting this address, +> the kernel gives us 0x10000. + +Yeah the meaning of mmap_min_addr should be exactly that which is odd +why the kernel doesn't honour the request. That said it seems to be a +user tweakable knob so you could just up it. + +>> +>> You can manually set the reserved_va and the base address using -R and +>> -B although that is more of a developer work around. I think moving the +>> assert to the condition above would be an improvement just because it +>> tells us what the requested base address was and what the kernel decided +>> to give us. +>> +> +> Setting guest_base with -B to 0x10000 works. Tried some -R values, no luck. +> Agree to print a more hintful message. + +OK - one other test you try is running inside a chroot which *does not* +have visibility of /proc. That will cause it to fall back to the old +probing technique of trying multiple mmap operations to find the hole. I +suspect that works because the attempt to map 0x1000 would fail the +check. The reason we default to probing /proc/self/map now is that brute +force technique falls over when trying to probe for a hole on 64 bit +systems, especially when built with stack protection/clang debug +instrumentation. + +In the meantime I'll spin up a patch to improve the failure mode. + +> +> +>> +>> > +>> > On Fri, Sep 11, 2020 at 5:50 PM Alex Bennée <email address hidden> +>> > wrote: +>> > +>> >> Alex Bennée <email address hidden> writes: +>> >> +>> >> > Laurent Vivier <email address hidden> writes: +>> >> > +>> >> <snip> +>> >> >>> Then trying qemu-riscv32 with a simple ELF, I get: +>> >> >>> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' +>> >> failed. +>> >> >>> +>> >> >>> strace shows that: +>> >> >>> mmap(0x1000, 4294963200, PROT_NONE, +>> >> MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +>> >> >>> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: +>> >> ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr +>> == +>> >> test' failed. +>> >> >>> ) = 103 +>> >> >>> +>> >> >>> The source code is in the function pgb_reserved_va (linux- +>> >> >>> user/elfload.c). I think mmap cannot guarantee that the returned +>> >> pointer +>> >> >>> (test) equals to the parameter of addr. So is this a bug to assert +>> >> (addr +>> >> >>> == test)? +>> >> >> +>> >> > I'm assuming CentOS 7.5 actually has a definition for +>> >> > MAP_FIXED_NOREPLACE which should ensure we get what we asked for - +>> >> > otherwise we are in the position of hoping the kernel honours what we +>> >> > asked for. +>> >> +>> >> Doh re-reading I see it's not set in the strace output. Maybe we should +>> >> promote the assert case to the failure leg so we have: +>> >> +>> >> if (addr == MAP_FAILED || addr != test) { +>> >> error_report(...) +>> >> } +>> >> +>> >> so we at least fail with a user friendly error rather than an abort? +>> >> +>> >> -- +>> >> Alex Bennée +>> >> +>> >> -- +>> >> You received this bug notification because you are subscribed to the bug +>> >> report. +>> >> https://bugs.launchpad.net/bugs/1895080 +>> >> +>> >> Title: +>> >> pgb_reserved_va: Assertion `addr == test' failed +>> >> +>> >> Status in QEMU: +>> >> New +>> >> +>> >> Bug description: +>> >> This problem occurs on CentOS-7.5 (64-bit) with qemu-5.1.0, qemu head +>> >> (commit 9435a8b3dd35f1f926f1b9127e8a906217a5518a) for riscv32-linux- +>> >> user. +>> >> +>> >> Firstly, compile fails: +>> >> Compiling C object +>> libqemu-riscv32-linux-user.fa.p/linux-user_strace.c.o +>> >> ../qemu.git/linux-user/strace.c:1210:18: error: ‘FALLOC_FL_KEEP_SIZE’ +>> >> undeclared here (not in a function) +>> >> FLAG_GENERIC(FALLOC_FL_KEEP_SIZE), +>> >> +>> >> I have to add below include to linux-user/strace.c +>> >> diff --git a/linux-user/strace.c b/linux-user/strace.c +>> >> index 11fea14fba..22e51d4a8a 100644 +>> >> --- a/linux-user/strace.c +>> >> +++ b/linux-user/strace.c +>> >> @@ -7,6 +7,7 @@ +>> >> #include <sys/mount.h> +>> >> #include <arpa/inet.h> +>> >> #include <netinet/tcp.h> +>> >> +#include <linux/falloc.h> +>> >> #include <linux/if_packet.h> +>> >> #include <linux/netlink.h> +>> >> #include <sched.h> +>> >> +>> >> Then trying qemu-riscv32 with a simple ELF, I get: +>> >> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' +>> >> failed. +>> >> +>> >> strace shows that: +>> >> mmap(0x1000, 4294963200, PROT_NONE, +>> >> MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +>> >> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: +>> >> ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr +>> == +>> >> test' failed. +>> >> ) = 103 +>> >> +>> >> The source code is in the function pgb_reserved_va (linux- +>> >> user/elfload.c). I think mmap cannot guarantee that the returned +>> >> pointer (test) equals to the parameter of addr. So is this a bug to +>> >> assert (addr == test)? +>> >> +>> >> Attached configure script and test ELF file. +>> >> +>> >> Thanks. +>> >> +>> >> To manage notifications about this bug go to: +>> >> https://bugs.launchpad.net/qemu/+bug/1895080/+subscriptions +>> >> +>> +>> +>> -- +>> Alex Bennée +>> +>> -- +>> You received this bug notification because you are subscribed to the bug +>> report. +>> https://bugs.launchpad.net/bugs/1895080 +>> +>> Title: +>> pgb_reserved_va: Assertion `addr == test' failed +>> +>> Status in QEMU: +>> New +>> +>> Bug description: +>> This problem occurs on CentOS-7.5 (64-bit) with qemu-5.1.0, qemu head +>> (commit 9435a8b3dd35f1f926f1b9127e8a906217a5518a) for riscv32-linux- +>> user. +>> +>> Firstly, compile fails: +>> Compiling C object libqemu-riscv32-linux-user.fa.p/linux-user_strace.c.o +>> ../qemu.git/linux-user/strace.c:1210:18: error: ‘FALLOC_FL_KEEP_SIZE’ +>> undeclared here (not in a function) +>> FLAG_GENERIC(FALLOC_FL_KEEP_SIZE), +>> +>> I have to add below include to linux-user/strace.c +>> diff --git a/linux-user/strace.c b/linux-user/strace.c +>> index 11fea14fba..22e51d4a8a 100644 +>> --- a/linux-user/strace.c +>> +++ b/linux-user/strace.c +>> @@ -7,6 +7,7 @@ +>> #include <sys/mount.h> +>> #include <arpa/inet.h> +>> #include <netinet/tcp.h> +>> +#include <linux/falloc.h> +>> #include <linux/if_packet.h> +>> #include <linux/netlink.h> +>> #include <sched.h> +>> +>> Then trying qemu-riscv32 with a simple ELF, I get: +>> linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == test' +>> failed. +>> +>> strace shows that: +>> mmap(0x1000, 4294963200, PROT_NONE, +>> MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x10000 +>> write(2, "qemu-riscv32: ../qemu.git/linux-"..., 103qemu-riscv32: +>> ../qemu.git/linux-user/elfload.c:2341: pgb_reserved_va: Assertion `addr == +>> test' failed. +>> ) = 103 +>> +>> The source code is in the function pgb_reserved_va (linux- +>> user/elfload.c). I think mmap cannot guarantee that the returned +>> pointer (test) equals to the parameter of addr. So is this a bug to +>> assert (addr == test)? +>> +>> Attached configure script and test ELF file. +>> +>> Thanks. +>> +>> To manage notifications about this bug go to: +>> https://bugs.launchpad.net/qemu/+bug/1895080/+subscriptions +>> + + +-- +Alex Bennée + + +On older kernels which don't implement MAP_FIXED_NOREPLACE the kernel +may still fail to give us the address we asked for despite having +already probed the map for a valid hole. Asserting isn't particularly +useful to the user so let us move the check up and expand the +error_report a little to give them a fighting chance of working around +the problem. + +Ameliorates: ee94743034 +Cc: Bug 1895080 <email address hidden> +Signed-off-by: Alex Bennée <email address hidden> +--- + linux-user/elfload.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +diff --git a/linux-user/elfload.c b/linux-user/elfload.c +index 4961e6119e2..f6022fd7049 100644 +--- a/linux-user/elfload.c ++++ b/linux-user/elfload.c +@@ -2331,14 +2331,13 @@ static void pgb_reserved_va(const char *image_name, abi_ulong guest_loaddr, + assert(guest_base != 0); + test = g2h(0); + addr = mmap(test, reserved_va, PROT_NONE, flags, -1, 0); +- if (addr == MAP_FAILED) { ++ if (addr == MAP_FAILED || addr != test) { + error_report("Unable to reserve 0x%lx bytes of virtual address " +- "space (%s) for use as guest address space (check your " +- "virtual memory ulimit setting or reserve less " +- "using -R option)", reserved_va, strerror(errno)); ++ "space at %p (%s) for use as guest address space (check your" ++ "virtual memory ulimit setting, min_mmap_addr or reserve less " ++ "using -R option)", reserved_va, test, strerror(errno)); + exit(EXIT_FAILURE); + } +- assert(addr == test); + } + + void probe_guest_base(const char *image_name, abi_ulong guest_loaddr, +-- +2.20.1 + + + +On older kernels which don't implement MAP_FIXED_NOREPLACE the kernel +may still fail to give us the address we asked for despite having +already probed the map for a valid hole. Asserting isn't particularly +useful to the user so let us move the check up and expand the +error_report a little to give them a fighting chance of working around +the problem. + +Ameliorates: ee94743034 +Cc: Bug 1895080 <email address hidden> +Signed-off-by: Alex Bennée <email address hidden> +--- + linux-user/elfload.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +diff --git a/linux-user/elfload.c b/linux-user/elfload.c +index 4961e6119e24..f6022fd70493 100644 +--- a/linux-user/elfload.c ++++ b/linux-user/elfload.c +@@ -2331,14 +2331,13 @@ static void pgb_reserved_va(const char *image_name, abi_ulong guest_loaddr, + assert(guest_base != 0); + test = g2h(0); + addr = mmap(test, reserved_va, PROT_NONE, flags, -1, 0); +- if (addr == MAP_FAILED) { ++ if (addr == MAP_FAILED || addr != test) { + error_report("Unable to reserve 0x%lx bytes of virtual address " +- "space (%s) for use as guest address space (check your " +- "virtual memory ulimit setting or reserve less " +- "using -R option)", reserved_va, strerror(errno)); ++ "space at %p (%s) for use as guest address space (check your" ++ "virtual memory ulimit setting, min_mmap_addr or reserve less " ++ "using -R option)", reserved_va, test, strerror(errno)); + exit(EXIT_FAILURE); + } +- assert(addr == test); + } + + void probe_guest_base(const char *image_name, abi_ulong guest_loaddr, +-- +2.20.1 + + + +chroot works as you expected. +And the patch makes sense. +Thanks. + +On older kernels which don't implement MAP_FIXED_NOREPLACE the kernel +may still fail to give us the address we asked for despite having +already probed the map for a valid hole. Asserting isn't particularly +useful to the user so let us move the check up and expand the +error_report a little to give them a fighting chance of working around +the problem. + +Ameliorates: ee94743034 +Cc: Bug 1895080 <email address hidden> +Signed-off-by: Alex Bennée <email address hidden> +--- + linux-user/elfload.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +diff --git a/linux-user/elfload.c b/linux-user/elfload.c +index 4961e6119e24..f6022fd70493 100644 +--- a/linux-user/elfload.c ++++ b/linux-user/elfload.c +@@ -2331,14 +2331,13 @@ static void pgb_reserved_va(const char *image_name, abi_ulong guest_loaddr, + assert(guest_base != 0); + test = g2h(0); + addr = mmap(test, reserved_va, PROT_NONE, flags, -1, 0); +- if (addr == MAP_FAILED) { ++ if (addr == MAP_FAILED || addr != test) { + error_report("Unable to reserve 0x%lx bytes of virtual address " +- "space (%s) for use as guest address space (check your " +- "virtual memory ulimit setting or reserve less " +- "using -R option)", reserved_va, strerror(errno)); ++ "space at %p (%s) for use as guest address space (check your" ++ "virtual memory ulimit setting, min_mmap_addr or reserve less " ++ "using -R option)", reserved_va, test, strerror(errno)); + exit(EXIT_FAILURE); + } +- assert(addr == test); + } + + void probe_guest_base(const char *image_name, abi_ulong guest_loaddr, +-- +2.20.1 + + + +Le 15/09/2020 à 15:43, Alex Bennée a écrit : +> On older kernels which don't implement MAP_FIXED_NOREPLACE the kernel +> may still fail to give us the address we asked for despite having +> already probed the map for a valid hole. Asserting isn't particularly +> useful to the user so let us move the check up and expand the +> error_report a little to give them a fighting chance of working around +> the problem. +> +> Ameliorates: ee94743034 +> Cc: Bug 1895080 <email address hidden> +> Signed-off-by: Alex Bennée <email address hidden> +> --- +> linux-user/elfload.c | 9 ++++----- +> 1 file changed, 4 insertions(+), 5 deletions(-) +> +> diff --git a/linux-user/elfload.c b/linux-user/elfload.c +> index 4961e6119e24..f6022fd70493 100644 +> --- a/linux-user/elfload.c +> +++ b/linux-user/elfload.c +> @@ -2331,14 +2331,13 @@ static void pgb_reserved_va(const char *image_name, abi_ulong guest_loaddr, +> assert(guest_base != 0); +> test = g2h(0); +> addr = mmap(test, reserved_va, PROT_NONE, flags, -1, 0); +> - if (addr == MAP_FAILED) { +> + if (addr == MAP_FAILED || addr != test) { +> error_report("Unable to reserve 0x%lx bytes of virtual address " +> - "space (%s) for use as guest address space (check your " +> - "virtual memory ulimit setting or reserve less " +> - "using -R option)", reserved_va, strerror(errno)); +> + "space at %p (%s) for use as guest address space (check your" +> + "virtual memory ulimit setting, min_mmap_addr or reserve less " +> + "using -R option)", reserved_va, test, strerror(errno)); +> exit(EXIT_FAILURE); +> } +> - assert(addr == test); +> } +> +> void probe_guest_base(const char *image_name, abi_ulong guest_loaddr, +> + +Reviewed-by: Laurent Vivier <email address hidden> + + +On older kernels which don't implement MAP_FIXED_NOREPLACE the kernel +may still fail to give us the address we asked for despite having +already probed the map for a valid hole. Asserting isn't particularly +useful to the user so let us move the check up and expand the +error_report a little to give them a fighting chance of working around +the problem. + +Signed-off-by: Alex Bennée <email address hidden> +Reviewed-by: Laurent Vivier <email address hidden> +Reviewed-by: Richard Henderson <email address hidden> +Cc: Bug 1895080 <email address hidden> +Ameliorates: ee94743034 +Message-Id: <email address hidden> + +diff --git a/linux-user/elfload.c b/linux-user/elfload.c +index 4961e6119e24..f6022fd70493 100644 +--- a/linux-user/elfload.c ++++ b/linux-user/elfload.c +@@ -2331,14 +2331,13 @@ static void pgb_reserved_va(const char *image_name, abi_ulong guest_loaddr, + assert(guest_base != 0); + test = g2h(0); + addr = mmap(test, reserved_va, PROT_NONE, flags, -1, 0); +- if (addr == MAP_FAILED) { ++ if (addr == MAP_FAILED || addr != test) { + error_report("Unable to reserve 0x%lx bytes of virtual address " +- "space (%s) for use as guest address space (check your " +- "virtual memory ulimit setting or reserve less " +- "using -R option)", reserved_va, strerror(errno)); ++ "space at %p (%s) for use as guest address space (check your" ++ "virtual memory ulimit setting, min_mmap_addr or reserve less " ++ "using -R option)", reserved_va, test, strerror(errno)); + exit(EXIT_FAILURE); + } +- assert(addr == test); + } + + void probe_guest_base(const char *image_name, abi_ulong guest_loaddr, +-- +2.20.1 + + + +https://git.qemu.org/?p=qemu.git;a=commitdiff;h=fb730c8683807d549c4a + +Released with QEMU v5.2.0. + |