mirror of https://github.com/xemu-project/xemu.git
linux-user fixes:
- netlink fixes (add missing types, fix MSG_TRUNC) - sh4 fix (tcg state) - sparc32plus fix (truncate address space to 32bit) - add x86_64 binfmt data -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJbeyOIAAoJEPMMOL0/L74843oQAJCbDedfagKvmhMBFxWqFsp6 En7UuUjh6MtOgb++5W47RY4LoVi12IGys5qvXLM3+Gar1l5oFgQaG58jnsUgl4uO o+QnsM+KqsTnYlrlQOviY8US+9eNoMP/dp/sAwF0NbpQpKUTiiWv/QQ6B8YC/x5O yv016xn+9ul7HrS7H57ah4lrm5YJcFh54pnKMzW6f40ekPiXIrbKicgXKUbR9Fg4 c1Kxqwo+rxGS4tZ6aB+RFvu5dQ8NMxX4DhQUYXL1H8JSMR+fxPY3nzYTNqyFUwu9 Qb8wkf/sP4hPz3QIay/ha1ThmAJQJqJfrWDD9Kx5JrMF1YLFSR9dfx2lmjlgHjbr TsAkpKHSsM0azqnFlJ5khmEjC7aJSxmsd9PQwH0VOnmuszAej9a13E9A1kwdA54N JAzRBjuxO5Y2W7MXiqlfNI+XNBLa7BnXIRR1pa8icSHCyFfXxhQSsa80YF0JZ6JE j7ACiXkxmcMdJUjxRLL24rCERnanSwIHPjsxdVkJHaMaO+L0eiMH2ZcboQbTcnlK L6Pl0sD4kBBGlyN5V0MVLSMMWfm9OXyTSz8bAGUt7MV574oq6vyub37I44l6FXKK RPUMaSuFBOD3kaA2HP+bmRumrCHZ/eGhsmkFcquPxML/F+tXDAT6WCd2FuBGmA5c UkCSNXY6zdESgnc76G1u =wHSV -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/vivier2/tags/linux-user-for-3.1-pull-request' into staging linux-user fixes: - netlink fixes (add missing types, fix MSG_TRUNC) - sh4 fix (tcg state) - sparc32plus fix (truncate address space to 32bit) - add x86_64 binfmt data # gpg: Signature made Mon 20 Aug 2018 21:24:40 BST # 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-3.1-pull-request: linux-user: add QEMU_IFLA_INFO_KIND nested type for tun linux-user: update netlink route types linux-user: introduce QEMU_RTA_* to use with rtattr_type_t linux-user: fix recvmsg()/recvfrom() with netlink and MSG_TRUNC sh4: fix use_icount with linux-user linux-user: fix 32bit g2h()/h2g() qemu-binfmt-conf.sh: add x86_64 target Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
659b11e7a7
|
@ -48,8 +48,19 @@
|
|||
#define CPU_LDST_H
|
||||
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
/* sparc32plus has 64bit long but 32bit space address
|
||||
* this can make bad result with g2h() and h2g()
|
||||
*/
|
||||
#if TARGET_VIRT_ADDR_SPACE_BITS <= 32
|
||||
typedef uint32_t abi_ptr;
|
||||
#define TARGET_ABI_FMT_ptr "%x"
|
||||
#else
|
||||
typedef uint64_t abi_ptr;
|
||||
#define TARGET_ABI_FMT_ptr "%"PRIx64
|
||||
#endif
|
||||
|
||||
/* All direct uses of g2h and h2g need to go away for usermode softmmu. */
|
||||
#define g2h(x) ((void *)((unsigned long)(target_ulong)(x) + guest_base))
|
||||
#define g2h(x) ((void *)((unsigned long)(abi_ptr)(x) + guest_base))
|
||||
|
||||
#define guest_addr_valid(x) ((x) <= GUEST_ADDR_MAX)
|
||||
#define h2g_valid(x) guest_addr_valid((unsigned long)(x) - guest_base)
|
||||
|
@ -61,7 +72,7 @@ static inline int guest_range_valid(unsigned long start, unsigned long len)
|
|||
|
||||
#define h2g_nocheck(x) ({ \
|
||||
unsigned long __ret = (unsigned long)(x) - guest_base; \
|
||||
(abi_ulong)__ret; \
|
||||
(abi_ptr)__ret; \
|
||||
})
|
||||
|
||||
#define h2g(x) ({ \
|
||||
|
@ -69,7 +80,9 @@ static inline int guest_range_valid(unsigned long start, unsigned long len)
|
|||
assert(h2g_valid(x)); \
|
||||
h2g_nocheck(x); \
|
||||
})
|
||||
|
||||
#else
|
||||
typedef target_ulong abi_ptr;
|
||||
#define TARGET_ABI_FMT_ptr TARGET_ABI_FMT_lx
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
|
@ -397,7 +410,7 @@ extern __thread uintptr_t helper_retaddr;
|
|||
* This is the equivalent of the initial fast-path code used by
|
||||
* TCG backends for guest load and store accesses.
|
||||
*/
|
||||
static inline void *tlb_vaddr_to_host(CPUArchState *env, target_ulong addr,
|
||||
static inline void *tlb_vaddr_to_host(CPUArchState *env, abi_ptr addr,
|
||||
int access_type, int mmu_idx)
|
||||
{
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
|
@ -405,7 +418,7 @@ static inline void *tlb_vaddr_to_host(CPUArchState *env, target_ulong addr,
|
|||
#else
|
||||
int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
|
||||
CPUTLBEntry *tlbentry = &env->tlb_table[mmu_idx][index];
|
||||
target_ulong tlb_addr;
|
||||
abi_ptr tlb_addr;
|
||||
uintptr_t haddr;
|
||||
|
||||
switch (access_type) {
|
||||
|
|
|
@ -62,7 +62,7 @@
|
|||
#endif
|
||||
|
||||
static inline RES_TYPE
|
||||
glue(glue(cpu_ld, USUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr)
|
||||
glue(glue(cpu_ld, USUFFIX), MEMSUFFIX)(CPUArchState *env, abi_ptr ptr)
|
||||
{
|
||||
#if !defined(CODE_ACCESS)
|
||||
trace_guest_mem_before_exec(
|
||||
|
@ -74,7 +74,7 @@ glue(glue(cpu_ld, USUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr)
|
|||
|
||||
static inline RES_TYPE
|
||||
glue(glue(glue(cpu_ld, USUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
|
||||
target_ulong ptr,
|
||||
abi_ptr ptr,
|
||||
uintptr_t retaddr)
|
||||
{
|
||||
RES_TYPE ret;
|
||||
|
@ -86,7 +86,7 @@ glue(glue(glue(cpu_ld, USUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
|
|||
|
||||
#if DATA_SIZE <= 2
|
||||
static inline int
|
||||
glue(glue(cpu_lds, SUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr)
|
||||
glue(glue(cpu_lds, SUFFIX), MEMSUFFIX)(CPUArchState *env, abi_ptr ptr)
|
||||
{
|
||||
#if !defined(CODE_ACCESS)
|
||||
trace_guest_mem_before_exec(
|
||||
|
@ -98,7 +98,7 @@ glue(glue(cpu_lds, SUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr)
|
|||
|
||||
static inline int
|
||||
glue(glue(glue(cpu_lds, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
|
||||
target_ulong ptr,
|
||||
abi_ptr ptr,
|
||||
uintptr_t retaddr)
|
||||
{
|
||||
int ret;
|
||||
|
@ -111,7 +111,7 @@ glue(glue(glue(cpu_lds, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
|
|||
|
||||
#ifndef CODE_ACCESS
|
||||
static inline void
|
||||
glue(glue(cpu_st, SUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr,
|
||||
glue(glue(cpu_st, SUFFIX), MEMSUFFIX)(CPUArchState *env, abi_ptr ptr,
|
||||
RES_TYPE v)
|
||||
{
|
||||
#if !defined(CODE_ACCESS)
|
||||
|
@ -124,7 +124,7 @@ glue(glue(cpu_st, SUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr,
|
|||
|
||||
static inline void
|
||||
glue(glue(glue(cpu_st, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
|
||||
target_ulong ptr,
|
||||
abi_ptr ptr,
|
||||
RES_TYPE v,
|
||||
uintptr_t retaddr)
|
||||
{
|
||||
|
|
|
@ -501,6 +501,20 @@ enum {
|
|||
QEMU___IFLA_BRPORT_MAX
|
||||
};
|
||||
|
||||
enum {
|
||||
QEMU_IFLA_TUN_UNSPEC,
|
||||
QEMU_IFLA_TUN_OWNER,
|
||||
QEMU_IFLA_TUN_GROUP,
|
||||
QEMU_IFLA_TUN_TYPE,
|
||||
QEMU_IFLA_TUN_PI,
|
||||
QEMU_IFLA_TUN_VNET_HDR,
|
||||
QEMU_IFLA_TUN_PERSIST,
|
||||
QEMU_IFLA_TUN_MULTI_QUEUE,
|
||||
QEMU_IFLA_TUN_NUM_QUEUES,
|
||||
QEMU_IFLA_TUN_NUM_DISABLED_QUEUES,
|
||||
QEMU___IFLA_TUN_MAX,
|
||||
};
|
||||
|
||||
enum {
|
||||
QEMU_IFLA_INFO_UNSPEC,
|
||||
QEMU_IFLA_INFO_KIND,
|
||||
|
@ -539,6 +553,40 @@ enum {
|
|||
QEMU___IFLA_XDP_MAX,
|
||||
};
|
||||
|
||||
enum {
|
||||
QEMU_RTA_UNSPEC,
|
||||
QEMU_RTA_DST,
|
||||
QEMU_RTA_SRC,
|
||||
QEMU_RTA_IIF,
|
||||
QEMU_RTA_OIF,
|
||||
QEMU_RTA_GATEWAY,
|
||||
QEMU_RTA_PRIORITY,
|
||||
QEMU_RTA_PREFSRC,
|
||||
QEMU_RTA_METRICS,
|
||||
QEMU_RTA_MULTIPATH,
|
||||
QEMU_RTA_PROTOINFO, /* no longer used */
|
||||
QEMU_RTA_FLOW,
|
||||
QEMU_RTA_CACHEINFO,
|
||||
QEMU_RTA_SESSION, /* no longer used */
|
||||
QEMU_RTA_MP_ALGO, /* no longer used */
|
||||
QEMU_RTA_TABLE,
|
||||
QEMU_RTA_MARK,
|
||||
QEMU_RTA_MFC_STATS,
|
||||
QEMU_RTA_VIA,
|
||||
QEMU_RTA_NEWDST,
|
||||
QEMU_RTA_PREF,
|
||||
QEMU_RTA_ENCAP_TYPE,
|
||||
QEMU_RTA_ENCAP,
|
||||
QEMU_RTA_EXPIRES,
|
||||
QEMU_RTA_PAD,
|
||||
QEMU_RTA_UID,
|
||||
QEMU_RTA_TTL_PROPAGATE,
|
||||
QEMU_RTA_IP_PROTO,
|
||||
QEMU_RTA_SPORT,
|
||||
QEMU_RTA_DPORT,
|
||||
QEMU___RTA_MAX
|
||||
};
|
||||
|
||||
typedef abi_long (*TargetFdDataFunc)(void *, size_t);
|
||||
typedef abi_long (*TargetFdAddrFunc)(void *, abi_ulong, socklen_t);
|
||||
typedef struct TargetFdTrans {
|
||||
|
@ -2315,6 +2363,34 @@ static abi_long host_to_target_slave_data_bridge_nlattr(struct nlattr *nlattr,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static abi_long host_to_target_data_tun_nlattr(struct nlattr *nlattr,
|
||||
void *context)
|
||||
{
|
||||
uint32_t *u32;
|
||||
|
||||
switch (nlattr->nla_type) {
|
||||
/* uint8_t */
|
||||
case QEMU_IFLA_TUN_TYPE:
|
||||
case QEMU_IFLA_TUN_PI:
|
||||
case QEMU_IFLA_TUN_VNET_HDR:
|
||||
case QEMU_IFLA_TUN_PERSIST:
|
||||
case QEMU_IFLA_TUN_MULTI_QUEUE:
|
||||
break;
|
||||
/* uint32_t */
|
||||
case QEMU_IFLA_TUN_NUM_QUEUES:
|
||||
case QEMU_IFLA_TUN_NUM_DISABLED_QUEUES:
|
||||
case QEMU_IFLA_TUN_OWNER:
|
||||
case QEMU_IFLA_TUN_GROUP:
|
||||
u32 = NLA_DATA(nlattr);
|
||||
*u32 = tswap32(*u32);
|
||||
break;
|
||||
default:
|
||||
gemu_log("Unknown QEMU_IFLA_TUN type %d\n", nlattr->nla_type);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct linkinfo_context {
|
||||
int len;
|
||||
char *name;
|
||||
|
@ -2349,6 +2425,12 @@ static abi_long host_to_target_data_linkinfo_nlattr(struct nlattr *nlattr,
|
|||
nlattr->nla_len,
|
||||
NULL,
|
||||
host_to_target_data_bridge_nlattr);
|
||||
} else if (strncmp(li_context->name, "tun",
|
||||
li_context->len) == 0) {
|
||||
return host_to_target_for_each_nlattr(NLA_DATA(nlattr),
|
||||
nlattr->nla_len,
|
||||
NULL,
|
||||
host_to_target_data_tun_nlattr);
|
||||
} else {
|
||||
gemu_log("Unknown QEMU_IFLA_INFO_KIND %s\n", li_context->name);
|
||||
}
|
||||
|
@ -2659,19 +2741,38 @@ static abi_long host_to_target_data_addr_rtattr(struct rtattr *rtattr)
|
|||
static abi_long host_to_target_data_route_rtattr(struct rtattr *rtattr)
|
||||
{
|
||||
uint32_t *u32;
|
||||
struct rta_cacheinfo *ci;
|
||||
|
||||
switch (rtattr->rta_type) {
|
||||
/* binary: depends on family type */
|
||||
case RTA_GATEWAY:
|
||||
case RTA_DST:
|
||||
case RTA_PREFSRC:
|
||||
case QEMU_RTA_GATEWAY:
|
||||
case QEMU_RTA_DST:
|
||||
case QEMU_RTA_PREFSRC:
|
||||
break;
|
||||
/* u8 */
|
||||
case QEMU_RTA_PREF:
|
||||
break;
|
||||
/* u32 */
|
||||
case RTA_PRIORITY:
|
||||
case RTA_TABLE:
|
||||
case RTA_OIF:
|
||||
case QEMU_RTA_PRIORITY:
|
||||
case QEMU_RTA_TABLE:
|
||||
case QEMU_RTA_OIF:
|
||||
u32 = RTA_DATA(rtattr);
|
||||
*u32 = tswap32(*u32);
|
||||
break;
|
||||
/* struct rta_cacheinfo */
|
||||
case QEMU_RTA_CACHEINFO:
|
||||
ci = RTA_DATA(rtattr);
|
||||
ci->rta_clntref = tswap32(ci->rta_clntref);
|
||||
ci->rta_lastuse = tswap32(ci->rta_lastuse);
|
||||
ci->rta_expires = tswap32(ci->rta_expires);
|
||||
ci->rta_error = tswap32(ci->rta_error);
|
||||
ci->rta_used = tswap32(ci->rta_used);
|
||||
#if defined(RTNETLINK_HAVE_PEERINFO)
|
||||
ci->rta_id = tswap32(ci->rta_id);
|
||||
ci->rta_ts = tswap32(ci->rta_ts);
|
||||
ci->rta_tsage = tswap32(ci->rta_tsage);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
gemu_log("Unknown host RTA type: %d\n", rtattr->rta_type);
|
||||
break;
|
||||
|
@ -2808,13 +2909,13 @@ static abi_long target_to_host_data_route_rtattr(struct rtattr *rtattr)
|
|||
uint32_t *u32;
|
||||
switch (rtattr->rta_type) {
|
||||
/* binary: depends on family type */
|
||||
case RTA_DST:
|
||||
case RTA_SRC:
|
||||
case RTA_GATEWAY:
|
||||
case QEMU_RTA_DST:
|
||||
case QEMU_RTA_SRC:
|
||||
case QEMU_RTA_GATEWAY:
|
||||
break;
|
||||
/* u32 */
|
||||
case RTA_PRIORITY:
|
||||
case RTA_OIF:
|
||||
case QEMU_RTA_PRIORITY:
|
||||
case QEMU_RTA_OIF:
|
||||
u32 = RTA_DATA(rtattr);
|
||||
*u32 = tswap32(*u32);
|
||||
break;
|
||||
|
@ -3892,7 +3993,7 @@ static abi_long do_sendrecvmsg_locked(int fd, struct target_msghdr *msgp,
|
|||
len = ret;
|
||||
if (fd_trans_host_to_target_data(fd)) {
|
||||
ret = fd_trans_host_to_target_data(fd)(msg.msg_iov->iov_base,
|
||||
len);
|
||||
MIN(msg.msg_iov->iov_len, len));
|
||||
} else {
|
||||
ret = host_to_target_cmsg(msgp, &msg);
|
||||
}
|
||||
|
@ -4169,7 +4270,12 @@ static abi_long do_recvfrom(int fd, abi_ulong msg, size_t len, int flags,
|
|||
}
|
||||
if (!is_error(ret)) {
|
||||
if (fd_trans_host_to_target_data(fd)) {
|
||||
ret = fd_trans_host_to_target_data(fd)(host_msg, ret);
|
||||
abi_long trans;
|
||||
trans = fd_trans_host_to_target_data(fd)(host_msg, MIN(ret, len));
|
||||
if (is_error(trans)) {
|
||||
ret = trans;
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
if (target_addr) {
|
||||
host_to_target_sockaddr(target_addr, addr, addrlen);
|
||||
|
@ -7644,7 +7750,7 @@ static int open_self_maps(void *cpu_env, int fd)
|
|||
if (h2g(min) == ts->info->stack_limit) {
|
||||
pstrcpy(path, sizeof(path), " [stack]");
|
||||
}
|
||||
dprintf(fd, TARGET_ABI_FMT_lx "-" TARGET_ABI_FMT_lx
|
||||
dprintf(fd, TARGET_ABI_FMT_ptr "-" TARGET_ABI_FMT_ptr
|
||||
" %c%c%c%c %08" PRIx64 " %02x:%02x %d %s%s\n",
|
||||
h2g(min), h2g(max - 1) + 1, flag_r, flag_w,
|
||||
flag_x, flag_p, offset, dev_maj, dev_min, inode,
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
qemu_target_list="i386 i486 alpha arm armeb sparc32plus ppc ppc64 ppc64le m68k \
|
||||
mips mipsel mipsn32 mipsn32el mips64 mips64el \
|
||||
sh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb \
|
||||
microblaze microblazeel or1k"
|
||||
microblaze microblazeel or1k x86_64"
|
||||
|
||||
i386_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00'
|
||||
i386_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
|
||||
|
@ -14,6 +14,10 @@ i486_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\
|
|||
i486_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
|
||||
i486_family=i386
|
||||
|
||||
x86_64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00'
|
||||
x86_64_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
|
||||
x86_64_family=i386
|
||||
|
||||
alpha_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x26\x90'
|
||||
alpha_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
|
||||
alpha_family=alpha
|
||||
|
|
|
@ -293,6 +293,7 @@ static void gen_conditional_jump(DisasContext *ctx, target_ulong dest,
|
|||
disallow it in use_goto_tb, but it handles exit + singlestep. */
|
||||
gen_goto_tb(ctx, 0, dest);
|
||||
gen_set_label(l1);
|
||||
ctx->base.is_jmp = DISAS_NEXT;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue