mirror of https://github.com/xqemu/xqemu.git
-----BEGIN PGP SIGNATURE-----
iQIcBAABAgAGBQJasXJ5AAoJEPMMOL0/L7483GIP/j9Xc5sL3rYDHu6wPH63Zi0G BAkIXbg2U40AzIyMcysCvChJMBXaJNLZ+ofSH/7MJtAJDa72ICNOLNnaR0/8f0+A imoM3Ntss3A0l8bxfDaLmC8tC0bz0PAV+xlyBqe5uEbd5hTBtjR1HQc3E/38sYIW uq9r+L0OPQiRAdGhQvqheXdncr8DN3KhaZ0QVlWwIs1ZP4Svv54Kau5OE3LSbk0A Qfod/K51JUH0TZWh4hdgHtDujacTuk4iexfiAhHtN+ms/A9hp6fo1IMMvhx+SSxt 4xeGCEOcEE0F7Ij45Gem13uRGSr6GMYkVn6kUXZkgePUnwsqu5hpgREvBuN0Sz9X OxRbhQmkwJZDMShDlOTG8T3jyK0jOiegr9FNkPC8BV3ncebnv5HJhte28uAE2qZB qFnF/ULks0lGuad2HEeKBeg+O9we+XG1CMmziiR9BkoIjw0m7qD+4JLImhnl5WKL gtlpkxhkGAR4nKC0Xp/jFsaLtmhiqjdLJEPm7js2Nmn01oXcxluP5lpvK6Oq4cLC apM/9y+b+K33ipcXXDKQQtC+suO0CQKQm4aRsGRvj0DalwraAm+HMGhW93z1b1Cp xpO+oF0YBZm7b7thvwBvC6V93p/DvXEbei23sFCSotoMlhCN2uYAcFm0aMqs62gj vhg49SfF/Qh01XvCXf/T =t6iE -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/vivier2/tags/linux-user-for-2.12-pull-request' into staging # gpg: Signature made Tue 20 Mar 2018 20:43:37 GMT # gpg: using RSA key F30C38BD3F2FBE3C # gpg: Good signature from "Laurent Vivier <lvivier@redhat.com>" # gpg: aka "Laurent Vivier <laurent@vivier.eu>" # gpg: aka "Laurent Vivier (Red Hat) <lvivier@redhat.com>" # Primary key fingerprint: CD2F 75DD C8E3 A4DC 2E4F 5173 F30C 38BD 3F2F BE3C * remotes/vivier2/tags/linux-user-for-2.12-pull-request: linux-user: init_guest_space: Try to make ARM space+commpage continuous Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
3be2e41b33
|
@ -1889,6 +1889,55 @@ unsigned long init_guest_space(unsigned long host_start,
|
|||
|
||||
/* Otherwise, a non-zero size region of memory needs to be mapped
|
||||
* and validated. */
|
||||
|
||||
#if defined(TARGET_ARM) && !defined(TARGET_AARCH64)
|
||||
/* On 32-bit ARM, we need to map not just the usable memory, but
|
||||
* also the commpage. Try to find a suitable place by allocating
|
||||
* a big chunk for all of it. If host_start, then the naive
|
||||
* strategy probably does good enough.
|
||||
*/
|
||||
if (!host_start) {
|
||||
unsigned long guest_full_size, host_full_size, real_start;
|
||||
|
||||
guest_full_size =
|
||||
(0xffff0f00 & qemu_host_page_mask) + qemu_host_page_size;
|
||||
host_full_size = guest_full_size - guest_start;
|
||||
real_start = (unsigned long)
|
||||
mmap(NULL, host_full_size, PROT_NONE, flags, -1, 0);
|
||||
if (real_start == (unsigned long)-1) {
|
||||
if (host_size < host_full_size - qemu_host_page_size) {
|
||||
/* We failed to map a continous segment, but we're
|
||||
* allowed to have a gap between the usable memory and
|
||||
* the commpage where other things can be mapped.
|
||||
* This sparseness gives us more flexibility to find
|
||||
* an address range.
|
||||
*/
|
||||
goto naive;
|
||||
}
|
||||
return (unsigned long)-1;
|
||||
}
|
||||
munmap((void *)real_start, host_full_size);
|
||||
if (real_start & ~qemu_host_page_mask) {
|
||||
/* The same thing again, but with an extra qemu_host_page_size
|
||||
* so that we can shift around alignment.
|
||||
*/
|
||||
unsigned long real_size = host_full_size + qemu_host_page_size;
|
||||
real_start = (unsigned long)
|
||||
mmap(NULL, real_size, PROT_NONE, flags, -1, 0);
|
||||
if (real_start == (unsigned long)-1) {
|
||||
if (host_size < host_full_size - qemu_host_page_size) {
|
||||
goto naive;
|
||||
}
|
||||
return (unsigned long)-1;
|
||||
}
|
||||
munmap((void *)real_start, real_size);
|
||||
real_start = HOST_PAGE_ALIGN(real_start);
|
||||
}
|
||||
current_start = real_start;
|
||||
}
|
||||
naive:
|
||||
#endif
|
||||
|
||||
while (1) {
|
||||
unsigned long real_start, real_size, aligned_size;
|
||||
aligned_size = real_size = host_size;
|
||||
|
|
Loading…
Reference in New Issue