mirror of https://gitee.com/openkylin/qemu.git
get rid of hostregs_helper.h
Since b567b38
(target-arm: remove T0 and T1, 2009-10-16) the only global
register that is used is AREG0, so the complexity of hostregs_helper.h
is unused. Use regular assignments and a compiler optimization barrier.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
df2a54e698
commit
24ebf5f31a
15
cpu-exec.c
15
cpu-exec.c
|
@ -210,8 +210,7 @@ static void cpu_handle_debug_exception(CPUState *env)
|
|||
|
||||
int cpu_exec(CPUState *env1)
|
||||
{
|
||||
#define DECLARE_HOST_REGS 1
|
||||
#include "hostregs_helper.h"
|
||||
host_reg_t saved_env_reg;
|
||||
int ret, interrupt_request;
|
||||
TranslationBlock *tb;
|
||||
uint8_t *tc_ptr;
|
||||
|
@ -222,9 +221,12 @@ int cpu_exec(CPUState *env1)
|
|||
|
||||
cpu_single_env = env1;
|
||||
|
||||
/* first we save global registers */
|
||||
#define SAVE_HOST_REGS 1
|
||||
#include "hostregs_helper.h"
|
||||
/* the access to env below is actually saving the global register's
|
||||
value, so that files not including target-xyz/exec.h are free to
|
||||
use it. */
|
||||
QEMU_BUILD_BUG_ON (sizeof (saved_env_reg) != sizeof (env));
|
||||
saved_env_reg = (host_reg_t) env;
|
||||
asm("");
|
||||
env = env1;
|
||||
|
||||
#if defined(TARGET_I386)
|
||||
|
@ -669,7 +671,8 @@ int cpu_exec(CPUState *env1)
|
|||
#endif
|
||||
|
||||
/* restore global registers */
|
||||
#include "hostregs_helper.h"
|
||||
asm("");
|
||||
env = (void *) saved_env_reg;
|
||||
|
||||
/* fail safe : never use cpu_single_env outside cpu_exec() */
|
||||
cpu_single_env = NULL;
|
||||
|
|
|
@ -1,61 +0,0 @@
|
|||
/*
|
||||
* Save/restore host registers.
|
||||
*
|
||||
* Copyright (c) 2007 CodeSourcery
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* The GCC global register variable extension is used to reserve some
|
||||
host registers for use by generated code. However only the core parts of
|
||||
the translation engine are compiled with these settings. We must manually
|
||||
save/restore these registers when called from regular code.
|
||||
It is not sufficient to save/restore T0 et. al. as these may be declared
|
||||
with a datatype smaller than the actual register. */
|
||||
|
||||
#if defined(DECLARE_HOST_REGS)
|
||||
|
||||
#define DO_REG(REG) \
|
||||
register host_reg_t reg_AREG##REG asm(AREG##REG); \
|
||||
volatile host_reg_t saved_AREG##REG;
|
||||
|
||||
#elif defined(SAVE_HOST_REGS)
|
||||
|
||||
#define DO_REG(REG) \
|
||||
__asm__ __volatile__ ("" : "=r" (reg_AREG##REG)); \
|
||||
saved_AREG##REG = reg_AREG##REG;
|
||||
|
||||
#else
|
||||
|
||||
#define DO_REG(REG) \
|
||||
reg_AREG##REG = saved_AREG##REG; \
|
||||
__asm__ __volatile__ ("" : : "r" (reg_AREG##REG));
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef AREG0
|
||||
DO_REG(0)
|
||||
#endif
|
||||
|
||||
#ifdef AREG1
|
||||
DO_REG(1)
|
||||
#endif
|
||||
|
||||
#ifdef AREG2
|
||||
DO_REG(2)
|
||||
#endif
|
||||
|
||||
#undef SAVE_HOST_REGS
|
||||
#undef DECLARE_HOST_REGS
|
||||
#undef DO_REG
|
|
@ -11,6 +11,8 @@
|
|||
#define QEMU_WARN_UNUSED_RESULT
|
||||
#endif
|
||||
|
||||
#define QEMU_BUILD_BUG_ON(x) typedef char __build_bug_on__##__LINE__[(x)?-1:1];
|
||||
|
||||
/* Hack around the mess dyngen-exec.h causes: We need QEMU_NORETURN in files that
|
||||
cannot include the following headers without conflicts. This condition has
|
||||
to be removed once dyngen is gone. */
|
||||
|
|
Loading…
Reference in New Issue