[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Bug 1880225] Re: Emulation of some arm programs fail with "Assertion `h
From: |
Aleksandar Markovic |
Subject: |
[Bug 1880225] Re: Emulation of some arm programs fail with "Assertion `have_guest_base' failed." |
Date: |
Sat, 23 May 2020 07:52:02 -0000 |
The problem may be in int_guest_commpage() - it returns false.
>From gdb debugging session:
(gdb) p addr
$1 = (void *) 0xb7ffd000
(gdb) p want
$2 = (void *) 0xffff0000
(gdb) n
398 if (addr != want) {
(gdb) p qemu_host_page_size
$3 = 4096
(gdb) l
393
394 if (addr == MAP_FAILED) {
395 perror("Allocating guest commpage");
396 exit(EXIT_FAILURE);
397 }
398 if (addr != want) {
399 return false;
400 }
401
402 /* Set kernel helper versions; rest of page is 0. */
(gdb)
--
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1880225
Title:
Emulation of some arm programs fail with "Assertion `have_guest_base'
failed."
Status in QEMU:
Confirmed
Bug description:
This issue is observer with QEMU ToT, checked out around May 15th (but
I believe it is present in current master too), and wasn't present in
QEMU v5.0.0.
I am using 32-bit Intel(R) Pentium(R) M processor 1.73GHz host.
Arm cross-compiler is a standard cross-compiler that comes with
Debian-based distributions, and gcc version is:
$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Debian 8.3.0-2) 8.3.0
Compile this program with cross compiler:
$ arm-linux-gnueabi-gcc -O2 -static toupper_string.c -o
toupper_string-arm
Emulation with QEMU v5.0.0 is correct, and gives expected output:
$ ~/Build/qemu-5.0.0/build-gcc/arm-linux-user/qemu-arm ./toupper_string-arm
CONTROL RESULT: (toupper_string)
nwlrbbmqbhcdarz owkkyhiddqscdxr jmowfrxsjybldbe fsarcbynecdyggx
xpklorellnmpapq
NWLRBBMQBHCDARZ OWKKYHIDDQSCDXR JMOWFRXSJYBLDBE FSARCBYNECDYGGX
XPKLORELLNMPAPQ
While, in case of QEMU master it fails:
$ ~/Build/qemu-master/build-gcc/arm-linux-user/qemu-arm ./toupper_string-arm
qemu-arm: /home/rtrk/Build/qemu-master/linux-user/elfload.c:2294:
probe_guest_base: Assertion `have_guest_base' failed.
Aborted
There are many other programs that exibit the same behavior. The
failure is arm-sprecific.
-----------------------------------------------------
source code: (let's call this file toupper_string.c) (similar file is
also in attachment)
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#define MAX_STRING_LENGHT 15
#define NUMBER_OF_RANDOM_STRINGS 100
#define DEFAULT_NUMBER_OF_REPETITIONS 30000
#define MAX_NUMBER_OF_REPETITIONS 1000000000
#define NUMBER_OF_CONTROL_PRINT_ITEMS 5
/* Structure for keeping an array of strings */
struct StringStruct {
char chars[MAX_STRING_LENGHT + 1];
};
/**
* Sets characters of the given string to random small letters a-z.
* @param s String to get random characters.
* @len Length of the input string.
*/
static void gen_random_string(char *chars, const int len)
{
static const char letters[] = "abcdefghijklmnopqrstuvwxyz";
for (size_t i = 0; i < len; i++) {
chars[i] = letters[rand() % (sizeof(letters) - 1)];
}
chars[len] = 0;
}
void main (int argc, char* argv[])
{
struct StringStruct random_strings[NUMBER_OF_RANDOM_STRINGS];
struct StringStruct strings_to_be_uppercased[NUMBER_OF_RANDOM_STRINGS];
int32_t number_of_repetitions = DEFAULT_NUMBER_OF_REPETITIONS;
int32_t option;
/* Parse command line options */
while ((option = getopt(argc, argv, "n:")) != -1) {
if (option == 'n') {
int32_t user_number_of_repetitions = atoi(optarg);
/* Check if the value is a negative number */
if (user_number_of_repetitions < 1) {
fprintf(stderr, "Error ... Value for option '-n' cannot be a "
"negative number.\n");
exit(EXIT_FAILURE);
}
/* Check if the value is a string or zero */
if (user_number_of_repetitions == 0) {
fprintf(stderr, "Error ... Invalid value for option '-n'.\n");
exit(EXIT_FAILURE);
}
/* Check if the value is too large */
if (user_number_of_repetitions > MAX_NUMBER_OF_REPETITIONS) {
fprintf(stderr, "Error ... Value for option '-n' cannot be "
"more than %d.\n", MAX_NUMBER_OF_REPETITIONS);
exit(EXIT_FAILURE);
}
number_of_repetitions = user_number_of_repetitions;
} else {
exit(EXIT_FAILURE);
}
}
/* Create an array of strings with random content */
srand(1);
for (size_t i = 0; i < NUMBER_OF_RANDOM_STRINGS; i++) {
gen_random_string(random_strings[i].chars, MAX_STRING_LENGHT);
}
/* Perform uppercasing of a set of random strings multiple times */
for (size_t j = 0; j < number_of_repetitions; j++) {
/* Copy initial set of random strings to the set to be uppercased */
memcpy(strings_to_be_uppercased, random_strings,
NUMBER_OF_RANDOM_STRINGS * (MAX_STRING_LENGHT + 1));
/* Do actual changing case to uppercase */
for (size_t i = 0; i < NUMBER_OF_RANDOM_STRINGS; i++) {
int k = 0;
while (strings_to_be_uppercased[i].chars[k]) {
char ch = strings_to_be_uppercased[i].chars[k] - 32;
memcpy((void *)strings_to_be_uppercased[i].chars + k,
&ch, 1);
k++;
}
}
}
/* Control printing */
printf("CONTROL RESULT: (toupper_string)\n");
for (size_t i = 0; i < NUMBER_OF_CONTROL_PRINT_ITEMS; i++) {
printf(" %s", random_strings[i].chars);
}
printf("\n");
for (size_t i = 0; i < NUMBER_OF_CONTROL_PRINT_ITEMS; i++) {
printf(" %s", strings_to_be_uppercased[i].chars);
}
printf("\n");
}
To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1880225/+subscriptions
- [Bug 1880225] [NEW] Emulation of some arm programs fail with "Assertion `have_guest_base' failed.", Aleksandar Markovic, 2020/05/22
- Re: [Bug 1880225] [NEW] Emulation of some arm programs fail with "Assertion `have_guest_base' failed.", Alex Bennée, 2020/05/22
- [Bug 1880225] Re: Emulation of some arm programs fail with "Assertion `have_guest_base' failed.", Alex Bennée, 2020/05/22
- [Bug 1880225] Re: Emulation of some arm programs fail with "Assertion `have_guest_base' failed.", Aleksandar Markovic, 2020/05/22
- [Bug 1880225] Re: Emulation of some arm programs fail with "Assertion `have_guest_base' failed.", Aleksandar Markovic, 2020/05/22
- [Bug 1880225] Re: Emulation of some arm programs fail with "Assertion `have_guest_base' failed.", Aleksandar Markovic, 2020/05/22
- [Bug 1880225] Re: Emulation of some arm programs fail with "Assertion `have_guest_base' failed.", Alex Bennée, 2020/05/23
- [Bug 1880225] Re: Emulation of some arm programs fail with "Assertion `have_guest_base' failed.",
Aleksandar Markovic <=