From 28afb45ff5151bd0e1c6d2796a12fac36b960b1b Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Mon, 25 Dec 2017 04:40:41 -0500 Subject: libre/{qemu-static => qemu-user-static}: upgpkg 2.11.0-3.parabola1 --- ...init_guest_space-Clean-up-control-flow-a-.patch | 94 ++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 libre/qemu-user-static/0007-linux-user-init_guest_space-Clean-up-control-flow-a-.patch (limited to 'libre/qemu-user-static/0007-linux-user-init_guest_space-Clean-up-control-flow-a-.patch') diff --git a/libre/qemu-user-static/0007-linux-user-init_guest_space-Clean-up-control-flow-a-.patch b/libre/qemu-user-static/0007-linux-user-init_guest_space-Clean-up-control-flow-a-.patch new file mode 100644 index 000000000..59be04cf9 --- /dev/null +++ b/libre/qemu-user-static/0007-linux-user-init_guest_space-Clean-up-control-flow-a-.patch @@ -0,0 +1,94 @@ +From dbbba45fa37da85ac213fbbe1f7eab3e1de74b41 Mon Sep 17 00:00:00 2001 +From: Luke Shumaker +Date: Wed, 27 Dec 2017 21:17:52 -0500 +Subject: [PATCH 07/10] linux-user: init_guest_space: Clean up control flow a + bit + +Instead of doing + + if (check1) { + if (check2) { + success; + } + } + + retry; + +Do a clearer + + if (!check1) { + goto try_again; + } + + if (!check2) { + goto try_again; + } + + success; + + try_again: + retry; + +Besides being clearer, this makes it easier to insert more checks that +need to trigger a retry on check failure, or rearrange them, or anything +like that. + +Because some indentation is changing, "ignore space change" may be useful +for viewing this patch. + +Signed-off-by: Luke Shumaker +--- + linux-user/elfload.c | 34 +++++++++++++++++++--------------- + 1 file changed, 19 insertions(+), 15 deletions(-) + +diff --git a/linux-user/elfload.c b/linux-user/elfload.c +index b560f5d6fe..5c0ad65611 100644 +--- a/linux-user/elfload.c ++++ b/linux-user/elfload.c +@@ -1906,24 +1906,28 @@ unsigned long init_guest_space(unsigned long host_start, + } + + /* Check to see if the address is valid. */ +- if (!host_start || aligned_start == current_start) { ++ if (host_start && aligned_start != current_start) { ++ goto try_again; ++ } ++ + #if defined(TARGET_ARM) && !defined(TARGET_AARCH64) +- /* On 32-bit ARM, we need to also be able to map the commpage. */ +- int valid = init_guest_commpage(aligned_start - guest_start, +- aligned_size + guest_start); +- if (valid == 1) { +- break; +- } else if (valid == -1) { +- munmap((void *)real_start, real_size); +- return (unsigned long)-1; +- } +- /* valid == 0, so try again. */ +-#else +- /* On other architectures, whatever we have here is fine. */ +- break; +-#endif ++ /* On 32-bit ARM, we need to also be able to map the commpage. */ ++ int valid = init_guest_commpage(aligned_start - guest_start, ++ aligned_size + guest_start); ++ if (valid == -1) { ++ munmap((void *)real_start, real_size); ++ return (unsigned long)-1; ++ } else if (valid == -1) { ++ goto try_again; + } ++#endif ++ ++ /* If nothing has said `return -1` or `goto try_again` yet, ++ * then the address we have is good. ++ */ ++ break; + ++ try_again: + /* That address didn't work. Unmap and try a different one. + * The address the host picked because is typically right at + * the top of the host address space and leaves the guest with +-- +2.15.1 + -- cgit v1.2.3