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