mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-11 03:24:58 -06:00
linux-user/host/x86: Populate host_signal.h
Split host_signal_pc and host_signal_write out of user-exec.c. Drop the *BSD code, to be re-created under bsd-user/ later. Reviewed-by: Warner Losh <imp@bsdimp.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
e6037d04c5
commit
85442fce49
4 changed files with 51 additions and 138 deletions
|
@ -29,19 +29,6 @@
|
||||||
#include "trace/trace-root.h"
|
#include "trace/trace-root.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#undef EAX
|
|
||||||
#undef ECX
|
|
||||||
#undef EDX
|
|
||||||
#undef EBX
|
|
||||||
#undef ESP
|
|
||||||
#undef EBP
|
|
||||||
#undef ESI
|
|
||||||
#undef EDI
|
|
||||||
#undef EIP
|
|
||||||
#ifdef __linux__
|
|
||||||
#include <sys/ucontext.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
__thread uintptr_t helper_retaddr;
|
__thread uintptr_t helper_retaddr;
|
||||||
|
|
||||||
//#define DEBUG_SIGNAL
|
//#define DEBUG_SIGNAL
|
||||||
|
@ -266,123 +253,7 @@ void *probe_access(CPUArchState *env, target_ulong addr, int size,
|
||||||
return size ? g2h(env_cpu(env), addr) : NULL;
|
return size ? g2h(env_cpu(env), addr) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__i386__)
|
#if defined(_ARCH_PPC)
|
||||||
|
|
||||||
#if defined(__NetBSD__)
|
|
||||||
#include <ucontext.h>
|
|
||||||
#include <machine/trap.h>
|
|
||||||
|
|
||||||
#define EIP_sig(context) ((context)->uc_mcontext.__gregs[_REG_EIP])
|
|
||||||
#define TRAP_sig(context) ((context)->uc_mcontext.__gregs[_REG_TRAPNO])
|
|
||||||
#define ERROR_sig(context) ((context)->uc_mcontext.__gregs[_REG_ERR])
|
|
||||||
#define MASK_sig(context) ((context)->uc_sigmask)
|
|
||||||
#define PAGE_FAULT_TRAP T_PAGEFLT
|
|
||||||
#elif defined(__FreeBSD__) || defined(__DragonFly__)
|
|
||||||
#include <ucontext.h>
|
|
||||||
#include <machine/trap.h>
|
|
||||||
|
|
||||||
#define EIP_sig(context) (*((unsigned long *)&(context)->uc_mcontext.mc_eip))
|
|
||||||
#define TRAP_sig(context) ((context)->uc_mcontext.mc_trapno)
|
|
||||||
#define ERROR_sig(context) ((context)->uc_mcontext.mc_err)
|
|
||||||
#define MASK_sig(context) ((context)->uc_sigmask)
|
|
||||||
#define PAGE_FAULT_TRAP T_PAGEFLT
|
|
||||||
#elif defined(__OpenBSD__)
|
|
||||||
#include <machine/trap.h>
|
|
||||||
#define EIP_sig(context) ((context)->sc_eip)
|
|
||||||
#define TRAP_sig(context) ((context)->sc_trapno)
|
|
||||||
#define ERROR_sig(context) ((context)->sc_err)
|
|
||||||
#define MASK_sig(context) ((context)->sc_mask)
|
|
||||||
#define PAGE_FAULT_TRAP T_PAGEFLT
|
|
||||||
#else
|
|
||||||
#define EIP_sig(context) ((context)->uc_mcontext.gregs[REG_EIP])
|
|
||||||
#define TRAP_sig(context) ((context)->uc_mcontext.gregs[REG_TRAPNO])
|
|
||||||
#define ERROR_sig(context) ((context)->uc_mcontext.gregs[REG_ERR])
|
|
||||||
#define MASK_sig(context) ((context)->uc_sigmask)
|
|
||||||
#define PAGE_FAULT_TRAP 0xe
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int cpu_signal_handler(int host_signum, void *pinfo,
|
|
||||||
void *puc)
|
|
||||||
{
|
|
||||||
siginfo_t *info = pinfo;
|
|
||||||
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
|
|
||||||
ucontext_t *uc = puc;
|
|
||||||
#elif defined(__OpenBSD__)
|
|
||||||
struct sigcontext *uc = puc;
|
|
||||||
#else
|
|
||||||
ucontext_t *uc = puc;
|
|
||||||
#endif
|
|
||||||
unsigned long pc;
|
|
||||||
int trapno;
|
|
||||||
|
|
||||||
#ifndef REG_EIP
|
|
||||||
/* for glibc 2.1 */
|
|
||||||
#define REG_EIP EIP
|
|
||||||
#define REG_ERR ERR
|
|
||||||
#define REG_TRAPNO TRAPNO
|
|
||||||
#endif
|
|
||||||
pc = EIP_sig(uc);
|
|
||||||
trapno = TRAP_sig(uc);
|
|
||||||
return handle_cpu_signal(pc, info,
|
|
||||||
trapno == PAGE_FAULT_TRAP ?
|
|
||||||
(ERROR_sig(uc) >> 1) & 1 : 0,
|
|
||||||
&MASK_sig(uc));
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(__x86_64__)
|
|
||||||
|
|
||||||
#ifdef __NetBSD__
|
|
||||||
#include <machine/trap.h>
|
|
||||||
#define PC_sig(context) _UC_MACHINE_PC(context)
|
|
||||||
#define TRAP_sig(context) ((context)->uc_mcontext.__gregs[_REG_TRAPNO])
|
|
||||||
#define ERROR_sig(context) ((context)->uc_mcontext.__gregs[_REG_ERR])
|
|
||||||
#define MASK_sig(context) ((context)->uc_sigmask)
|
|
||||||
#define PAGE_FAULT_TRAP T_PAGEFLT
|
|
||||||
#elif defined(__OpenBSD__)
|
|
||||||
#include <machine/trap.h>
|
|
||||||
#define PC_sig(context) ((context)->sc_rip)
|
|
||||||
#define TRAP_sig(context) ((context)->sc_trapno)
|
|
||||||
#define ERROR_sig(context) ((context)->sc_err)
|
|
||||||
#define MASK_sig(context) ((context)->sc_mask)
|
|
||||||
#define PAGE_FAULT_TRAP T_PAGEFLT
|
|
||||||
#elif defined(__FreeBSD__) || defined(__DragonFly__)
|
|
||||||
#include <ucontext.h>
|
|
||||||
#include <machine/trap.h>
|
|
||||||
|
|
||||||
#define PC_sig(context) (*((unsigned long *)&(context)->uc_mcontext.mc_rip))
|
|
||||||
#define TRAP_sig(context) ((context)->uc_mcontext.mc_trapno)
|
|
||||||
#define ERROR_sig(context) ((context)->uc_mcontext.mc_err)
|
|
||||||
#define MASK_sig(context) ((context)->uc_sigmask)
|
|
||||||
#define PAGE_FAULT_TRAP T_PAGEFLT
|
|
||||||
#else
|
|
||||||
#define PC_sig(context) ((context)->uc_mcontext.gregs[REG_RIP])
|
|
||||||
#define TRAP_sig(context) ((context)->uc_mcontext.gregs[REG_TRAPNO])
|
|
||||||
#define ERROR_sig(context) ((context)->uc_mcontext.gregs[REG_ERR])
|
|
||||||
#define MASK_sig(context) ((context)->uc_sigmask)
|
|
||||||
#define PAGE_FAULT_TRAP 0xe
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int cpu_signal_handler(int host_signum, void *pinfo,
|
|
||||||
void *puc)
|
|
||||||
{
|
|
||||||
siginfo_t *info = pinfo;
|
|
||||||
unsigned long pc;
|
|
||||||
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
|
|
||||||
ucontext_t *uc = puc;
|
|
||||||
#elif defined(__OpenBSD__)
|
|
||||||
struct sigcontext *uc = puc;
|
|
||||||
#else
|
|
||||||
ucontext_t *uc = puc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pc = PC_sig(uc);
|
|
||||||
return handle_cpu_signal(pc, info,
|
|
||||||
TRAP_sig(uc) == PAGE_FAULT_TRAP ?
|
|
||||||
(ERROR_sig(uc) >> 1) & 1 : 0,
|
|
||||||
&MASK_sig(uc));
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(_ARCH_PPC)
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* signal context platform-specific definitions
|
* signal context platform-specific definitions
|
||||||
|
@ -893,11 +764,6 @@ int cpu_signal_handler(int host_signum, void *pinfo,
|
||||||
|
|
||||||
return handle_cpu_signal(pc, info, is_write, &uc->uc_sigmask);
|
return handle_cpu_signal(pc, info, is_write, &uc->uc_sigmask);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#error host CPU specific signal handler needed
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The softmmu versions of these helpers are in cputlb.c. */
|
/* The softmmu versions of these helpers are in cputlb.c. */
|
||||||
|
|
|
@ -1 +1,25 @@
|
||||||
#define HOST_SIGNAL_PLACEHOLDER
|
/*
|
||||||
|
* host-signal.h: signal info dependent on the host architecture
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003-2005 Fabrice Bellard
|
||||||
|
* Copyright (c) 2021 Linaro Limited
|
||||||
|
*
|
||||||
|
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
||||||
|
* See the COPYING file in the top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef I386_HOST_SIGNAL_H
|
||||||
|
#define I386_HOST_SIGNAL_H
|
||||||
|
|
||||||
|
static inline uintptr_t host_signal_pc(ucontext_t *uc)
|
||||||
|
{
|
||||||
|
return uc->uc_mcontext.gregs[REG_EIP];
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
|
||||||
|
{
|
||||||
|
return uc->uc_mcontext.gregs[REG_TRAPNO] == 0xe
|
||||||
|
&& (uc->uc_mcontext.gregs[REG_ERR] & 0x2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
#define HOST_SIGNAL_PLACEHOLDER
|
#include "../x86_64/host-signal.h"
|
||||||
|
|
|
@ -1 +1,24 @@
|
||||||
#define HOST_SIGNAL_PLACEHOLDER
|
/*
|
||||||
|
* host-signal.h: signal info dependent on the host architecture
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 Linaro Limited
|
||||||
|
*
|
||||||
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||||
|
* See the COPYING file in the top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef X86_64_HOST_SIGNAL_H
|
||||||
|
#define X86_64_HOST_SIGNAL_H
|
||||||
|
|
||||||
|
static inline uintptr_t host_signal_pc(ucontext_t *uc)
|
||||||
|
{
|
||||||
|
return uc->uc_mcontext.gregs[REG_RIP];
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
|
||||||
|
{
|
||||||
|
return uc->uc_mcontext.gregs[REG_TRAPNO] == 0xe
|
||||||
|
&& (uc->uc_mcontext.gregs[REG_ERR] & 0x2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue