mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 18:23:57 -06:00
Userspace guest address offsetting
Re-implement GUEST_BASE support. Offset guest ddress space by default if the guest binary contains regions below the host mmap_min_addr. Implement support for i386, x86-64 and arm hosts. Signed-off-by: Riku Voipio <riku.voipio@iki.fi> Signed-off-by: Paul Brook <paul@codesourcery.com>
This commit is contained in:
parent
a9ff9df188
commit
379f6698d7
13 changed files with 206 additions and 36 deletions
|
@ -990,7 +990,22 @@ static inline void tcg_out_qemu_ld(TCGContext *s, int cond,
|
|||
# endif
|
||||
|
||||
*label_ptr += ((void *) s->code_ptr - (void *) label_ptr - 8) >> 2;
|
||||
#else
|
||||
#else /* !CONFIG_SOFTMMU */
|
||||
if (GUEST_BASE) {
|
||||
uint32_t offset = GUEST_BASE;
|
||||
int i;
|
||||
int rot;
|
||||
|
||||
while (offset) {
|
||||
i = ctz32(offset) & ~1;
|
||||
rot = ((32 - i) << 7) & 0xf00;
|
||||
|
||||
tcg_out_dat_imm(s, COND_AL, ARITH_ADD, 8, addr_reg,
|
||||
((offset >> i) & 0xff) | rot);
|
||||
addr_reg = 8;
|
||||
offset &= ~(0xff << i);
|
||||
}
|
||||
}
|
||||
switch (opc) {
|
||||
case 0:
|
||||
tcg_out_ld8_12(s, COND_AL, data_reg, addr_reg, 0);
|
||||
|
@ -1200,7 +1215,22 @@ static inline void tcg_out_qemu_st(TCGContext *s, int cond,
|
|||
# endif
|
||||
|
||||
*label_ptr += ((void *) s->code_ptr - (void *) label_ptr - 8) >> 2;
|
||||
#else
|
||||
#else /* !CONFIG_SOFTMMU */
|
||||
if (GUEST_BASE) {
|
||||
uint32_t offset = GUEST_BASE;
|
||||
int i;
|
||||
int rot;
|
||||
|
||||
while (offset) {
|
||||
i = ctz32(offset) & ~1;
|
||||
rot = ((32 - i) << 7) & 0xf00;
|
||||
|
||||
tcg_out_dat_imm(s, COND_AL, ARITH_ADD, 8, addr_reg,
|
||||
((offset >> i) & 0xff) | rot);
|
||||
addr_reg = 8;
|
||||
offset &= ~(0xff << i);
|
||||
}
|
||||
}
|
||||
switch (opc) {
|
||||
case 0:
|
||||
tcg_out_st8_12(s, COND_AL, data_reg, addr_reg, 0);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue