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);
|
||||
}
|
||||
|
||||
#if defined(TARGET_I386)
|
||||
int cpu_get_pic_interrupt(CPUX86State *env)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
void fork_start(void)
|
||||
{
|
||||
}
|
||||
@ -94,11 +87,6 @@ void fork_end(int child)
|
||||
/***********************************************************/
|
||||
/* 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,
|
||||
int flags)
|
||||
{
|
||||
@ -570,29 +558,6 @@ int main(int argc, char **argv)
|
||||
*/
|
||||
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,
|
||||
&bprm) != 0) {
|
||||
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)
|
||||
bsd="yes"
|
||||
bsd_user="yes"
|
||||
make="${MAKE-gmake}"
|
||||
audio_drv_list="oss try-sdl"
|
||||
audio_possible_drivers="oss sdl pa"
|
||||
@ -782,12 +783,6 @@ Linux)
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "$bsd" = "yes" ] ; then
|
||||
if [ "$darwin" != "yes" ] ; then
|
||||
bsd_user="yes"
|
||||
fi
|
||||
fi
|
||||
|
||||
: ${make=${MAKE-make}}
|
||||
|
||||
# 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
|
||||
base_dir = 'linux-user'
|
||||
target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
|
||||
else
|
||||
endif
|
||||
if 'CONFIG_BSD_USER' in config_target
|
||||
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
|
||||
target_inc += include_directories(
|
||||
base_dir,
|
||||
|
Loading…
Reference in New Issue
Block a user