Browse Source
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>pull/197/head
committed by
Warner Losh
7 changed files with 218 additions and 43 deletions
@ -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_ */ |
|||
@ -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); |
|||
} |
|||
|
|||
@ -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_ */ |
|||
@ -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); |
|||
} |
|||
Loading…
Reference in new issue