mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 19:49:43 +00:00
bsd-user: start to move target CPU functions to target_arch*
Move the CPU functions into target_arch_cpu.c that are unique to each CPU. These are defined in target_arch.h. Signed-off-by: Stacey Son <sson@FreeBSD.org> Signed-off-by: Warner Losh <imp@bsdimp.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
01a298a57e
commit
e2a7472918
31
bsd-user/i386/target_arch.h
Normal file
31
bsd-user/i386/target_arch.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Intel x86 specific prototypes for bsd-user
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013 Stacey D. Son
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _TARGET_ARCH_H_
|
||||||
|
#define _TARGET_ARCH_H_
|
||||||
|
|
||||||
|
/* target_arch_cpu.c */
|
||||||
|
void bsd_i386_write_dt(void *ptr, unsigned long addr, unsigned long limit,
|
||||||
|
int flags);
|
||||||
|
void bsd_i386_set_idt(int n, unsigned int dpl);
|
||||||
|
void bsd_i386_set_idt_base(uint64_t base);
|
||||||
|
|
||||||
|
#define target_cpu_set_tls(env, newtls)
|
||||||
|
|
||||||
|
#endif /* ! _TARGET_ARCH_H_ */
|
75
bsd-user/i386/target_arch_cpu.c
Normal file
75
bsd-user/i386/target_arch_cpu.c
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* i386 cpu related code
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
#include "cpu.h"
|
||||||
|
#include "qemu.h"
|
||||||
|
#include "qemu/timer.h"
|
||||||
|
|
||||||
|
#include "target_arch.h"
|
||||||
|
|
||||||
|
static uint64_t *idt_table;
|
||||||
|
|
||||||
|
uint64_t cpu_get_tsc(CPUX86State *env)
|
||||||
|
{
|
||||||
|
return cpu_get_host_ticks();
|
||||||
|
}
|
||||||
|
|
||||||
|
int cpu_get_pic_interrupt(CPUX86State *env)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bsd_i386_write_dt(void *ptr, unsigned long addr, unsigned long limit,
|
||||||
|
int flags)
|
||||||
|
{
|
||||||
|
unsigned int e1, e2;
|
||||||
|
uint32_t *p;
|
||||||
|
e1 = (addr << 16) | (limit & 0xffff);
|
||||||
|
e2 = ((addr >> 16) & 0xff) | (addr & 0xff000000) | (limit & 0x000f0000);
|
||||||
|
e2 |= flags;
|
||||||
|
p = ptr;
|
||||||
|
p[0] = tswap32(e1);
|
||||||
|
p[1] = tswap32(e2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void set_gate(void *ptr, unsigned int type, unsigned int dpl,
|
||||||
|
uint32_t addr, unsigned int sel)
|
||||||
|
{
|
||||||
|
uint32_t *p, e1, e2;
|
||||||
|
e1 = (addr & 0xffff) | (sel << 16);
|
||||||
|
e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8);
|
||||||
|
p = ptr;
|
||||||
|
p[0] = tswap32(e1);
|
||||||
|
p[1] = tswap32(e2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* only dpl matters as we do only user space emulation */
|
||||||
|
void bsd_i386_set_idt(int n, unsigned int dpl)
|
||||||
|
{
|
||||||
|
set_gate(idt_table + n, 0, dpl, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bsd_i386_set_idt_base(uint64_t base)
|
||||||
|
{
|
||||||
|
idt_table = g2h_untagged(base);
|
||||||
|
}
|
||||||
|
|
@ -72,13 +72,6 @@ void gemu_log(const char *fmt, ...)
|
|||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(TARGET_I386)
|
|
||||||
int cpu_get_pic_interrupt(CPUX86State *env)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void fork_start(void)
|
void fork_start(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -94,11 +87,6 @@ void fork_end(int child)
|
|||||||
/***********************************************************/
|
/***********************************************************/
|
||||||
/* CPUX86 core interface */
|
/* CPUX86 core interface */
|
||||||
|
|
||||||
uint64_t cpu_get_tsc(CPUX86State *env)
|
|
||||||
{
|
|
||||||
return cpu_get_host_ticks();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void write_dt(void *ptr, unsigned long addr, unsigned long limit,
|
static void write_dt(void *ptr, unsigned long addr, unsigned long limit,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
@ -570,29 +558,6 @@ int main(int argc, char **argv)
|
|||||||
*/
|
*/
|
||||||
guest_base = HOST_PAGE_ALIGN(guest_base);
|
guest_base = HOST_PAGE_ALIGN(guest_base);
|
||||||
|
|
||||||
/*
|
|
||||||
* Read in mmap_min_addr kernel parameter. This value is used
|
|
||||||
* When loading the ELF image to determine whether guest_base
|
|
||||||
* is needed.
|
|
||||||
*
|
|
||||||
* When user has explicitly set the quest base, we skip this
|
|
||||||
* test.
|
|
||||||
*/
|
|
||||||
if (!have_guest_base) {
|
|
||||||
FILE *fp;
|
|
||||||
|
|
||||||
fp = fopen("/proc/sys/vm/mmap_min_addr", "r");
|
|
||||||
if (fp != NULL) {
|
|
||||||
unsigned long tmp;
|
|
||||||
if (fscanf(fp, "%lu", &tmp) == 1) {
|
|
||||||
mmap_min_addr = tmp;
|
|
||||||
qemu_log_mask(CPU_LOG_PAGE, "host mmap_min_addr=0x%lx\n",
|
|
||||||
mmap_min_addr);
|
|
||||||
}
|
|
||||||
fclose(fp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (loader_exec(filename, argv + optind, target_environ, regs, info,
|
if (loader_exec(filename, argv + optind, target_environ, regs, info,
|
||||||
&bprm) != 0) {
|
&bprm) != 0) {
|
||||||
printf("Error loading %s\n", filename);
|
printf("Error loading %s\n", filename);
|
||||||
|
31
bsd-user/x86_64/target_arch.h
Normal file
31
bsd-user/x86_64/target_arch.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Intel x86_64 specific prototypes for bsd-user
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013 Stacey D. Son
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _TARGET_ARCH_H_
|
||||||
|
#define _TARGET_ARCH_H_
|
||||||
|
|
||||||
|
/* target_arch_cpu.c */
|
||||||
|
void bsd_x86_64_write_dt(void *ptr, unsigned long addr, unsigned long limit,
|
||||||
|
int flags);
|
||||||
|
void bsd_x86_64_set_idt(int n, unsigned int dpl);
|
||||||
|
void bsd_x86_64_set_idt_base(uint64_t base);
|
||||||
|
|
||||||
|
#define target_cpu_set_tls(env, newtls)
|
||||||
|
|
||||||
|
#endif /* !_TARGET_ARCH_H_ */
|
75
bsd-user/x86_64/target_arch_cpu.c
Normal file
75
bsd-user/x86_64/target_arch_cpu.c
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* x86_64 cpu related code
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
#include "cpu.h"
|
||||||
|
#include "qemu.h"
|
||||||
|
#include "qemu/timer.h"
|
||||||
|
|
||||||
|
#include "target_arch.h"
|
||||||
|
|
||||||
|
static uint64_t *idt_table;
|
||||||
|
|
||||||
|
uint64_t cpu_get_tsc(CPUX86State *env)
|
||||||
|
{
|
||||||
|
return cpu_get_host_ticks();
|
||||||
|
}
|
||||||
|
|
||||||
|
int cpu_get_pic_interrupt(CPUX86State *env)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bsd_x86_64_write_dt(void *ptr, unsigned long addr,
|
||||||
|
unsigned long limit, int flags)
|
||||||
|
{
|
||||||
|
unsigned int e1, e2;
|
||||||
|
uint32_t *p;
|
||||||
|
e1 = (addr << 16) | (limit & 0xffff);
|
||||||
|
e2 = ((addr >> 16) & 0xff) | (addr & 0xff000000) | (limit & 0x000f0000);
|
||||||
|
e2 |= flags;
|
||||||
|
p = ptr;
|
||||||
|
p[0] = tswap32(e1);
|
||||||
|
p[1] = tswap32(e2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_gate64(void *ptr, unsigned int type, unsigned int dpl,
|
||||||
|
uint64_t addr, unsigned int sel)
|
||||||
|
{
|
||||||
|
uint32_t *p, e1, e2;
|
||||||
|
e1 = (addr & 0xffff) | (sel << 16);
|
||||||
|
e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8);
|
||||||
|
p = ptr;
|
||||||
|
p[0] = tswap32(e1);
|
||||||
|
p[1] = tswap32(e2);
|
||||||
|
p[2] = tswap32(addr >> 32);
|
||||||
|
p[3] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* only dpl matters as we do only user space emulation */
|
||||||
|
void bsd_x86_64_set_idt(int n, unsigned int dpl)
|
||||||
|
{
|
||||||
|
set_gate64(idt_table + n * 2, 0, dpl, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bsd_x86_64_set_idt_base(uint64_t base)
|
||||||
|
{
|
||||||
|
idt_table = g2h_untagged(base);
|
||||||
|
}
|
7
configure
vendored
7
configure
vendored
@ -721,6 +721,7 @@ GNU/kFreeBSD)
|
|||||||
;;
|
;;
|
||||||
FreeBSD)
|
FreeBSD)
|
||||||
bsd="yes"
|
bsd="yes"
|
||||||
|
bsd_user="yes"
|
||||||
make="${MAKE-gmake}"
|
make="${MAKE-gmake}"
|
||||||
audio_drv_list="oss try-sdl"
|
audio_drv_list="oss try-sdl"
|
||||||
audio_possible_drivers="oss sdl pa"
|
audio_possible_drivers="oss sdl pa"
|
||||||
@ -782,12 +783,6 @@ Linux)
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [ "$bsd" = "yes" ] ; then
|
|
||||||
if [ "$darwin" != "yes" ] ; then
|
|
||||||
bsd_user="yes"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
: ${make=${MAKE-make}}
|
: ${make=${MAKE-make}}
|
||||||
|
|
||||||
# We prefer python 3.x. A bare 'python' is traditionally
|
# We prefer python 3.x. A bare 'python' is traditionally
|
||||||
|
@ -2569,9 +2569,12 @@ foreach target : target_dirs
|
|||||||
if 'CONFIG_LINUX_USER' in config_target
|
if 'CONFIG_LINUX_USER' in config_target
|
||||||
base_dir = 'linux-user'
|
base_dir = 'linux-user'
|
||||||
target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
|
target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
|
||||||
else
|
endif
|
||||||
|
if 'CONFIG_BSD_USER' in config_target
|
||||||
base_dir = 'bsd-user'
|
base_dir = 'bsd-user'
|
||||||
target_inc += include_directories('bsd-user/freebsd')
|
target_inc += include_directories('bsd-user/' / targetos)
|
||||||
|
dir = base_dir / abi
|
||||||
|
arch_srcs += files(dir / 'target_arch_cpu.c')
|
||||||
endif
|
endif
|
||||||
target_inc += include_directories(
|
target_inc += include_directories(
|
||||||
base_dir,
|
base_dir,
|
||||||
|
Loading…
Reference in New Issue
Block a user