Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
66e85a21
Q
qemu
项目概览
openeuler
/
qemu
通知
10
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Q
qemu
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
66e85a21
编写于
6月 24, 2003
作者:
B
bellard
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
MMU support
git-svn-id:
svn://svn.savannah.nongnu.org/qemu/trunk@262
c046a42c-6fe2-441c-8c8c-71466251a162
上级
90a9fdae
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
86 addition
and
8 deletion
+86
-8
cpu-i386.h
cpu-i386.h
+49
-4
exec.c
exec.c
+31
-1
exec.h
exec.h
+6
-3
未找到文件。
cpu-i386.h
浏览文件 @
66e85a21
...
@@ -50,7 +50,8 @@
...
@@ -50,7 +50,8 @@
/* segment descriptor fields */
/* segment descriptor fields */
#define DESC_G_MASK (1 << 23)
#define DESC_G_MASK (1 << 23)
#define DESC_B_MASK (1 << 22)
#define DESC_B_SHIFT 22
#define DESC_B_MASK (1 << DESC_B_SHIFT)
#define DESC_AVL_MASK (1 << 20)
#define DESC_AVL_MASK (1 << 20)
#define DESC_P_MASK (1 << 15)
#define DESC_P_MASK (1 << 15)
#define DESC_DPL_SHIFT 13
#define DESC_DPL_SHIFT 13
...
@@ -95,6 +96,34 @@
...
@@ -95,6 +96,34 @@
#define CR4_PVI_MASK (1 << 1)
#define CR4_PVI_MASK (1 << 1)
#define CR4_TSD_MASK (1 << 2)
#define CR4_TSD_MASK (1 << 2)
#define CR4_DE_MASK (1 << 3)
#define CR4_DE_MASK (1 << 3)
#define CR4_PSE_MASK (1 << 4)
#define PG_PRESENT_BIT 0
#define PG_RW_BIT 1
#define PG_USER_BIT 2
#define PG_PWT_BIT 3
#define PG_PCD_BIT 4
#define PG_ACCESSED_BIT 5
#define PG_DIRTY_BIT 6
#define PG_PSE_BIT 7
#define PG_GLOBAL_BIT 8
#define PG_PRESENT_MASK (1 << PG_PRESENT_BIT)
#define PG_RW_MASK (1 << PG_RW_BIT)
#define PG_USER_MASK (1 << PG_USER_BIT)
#define PG_PWT_MASK (1 << PG_PWT_BIT)
#define PG_PCD_MASK (1 << PG_PCD_BIT)
#define PG_ACCESSED_MASK (1 << PG_ACCESSED_BIT)
#define PG_DIRTY_MASK (1 << PG_DIRTY_BIT)
#define PG_PSE_MASK (1 << PG_PSE_BIT)
#define PG_GLOBAL_MASK (1 << PG_GLOBAL_BIT)
#define PG_ERROR_W_BIT 1
#define PG_ERROR_P_MASK 0x01
#define PG_ERROR_W_MASK (1 << PG_ERROR_W_BIT)
#define PG_ERROR_U_MASK 0x04
#define PG_ERROR_RSVD_MASK 0x08
#define EXCP00_DIVZ 0
#define EXCP00_DIVZ 0
#define EXCP01_SSTP 1
#define EXCP01_SSTP 1
...
@@ -116,6 +145,7 @@
...
@@ -116,6 +145,7 @@
#define EXCP12_MCHK 18
#define EXCP12_MCHK 18
#define EXCP_INTERRUPT 256
/* async interruption */
#define EXCP_INTERRUPT 256
/* async interruption */
#define EXCP_HLT 257
/* hlt instruction reached */
enum
{
enum
{
CC_OP_DYNAMIC
,
/* must use dynamic code to get cc_op */
CC_OP_DYNAMIC
,
/* must use dynamic code to get cc_op */
...
@@ -174,8 +204,8 @@ typedef double CPU86_LDouble;
...
@@ -174,8 +204,8 @@ typedef double CPU86_LDouble;
typedef
struct
SegmentCache
{
typedef
struct
SegmentCache
{
uint32_t
selector
;
uint32_t
selector
;
uint8_t
*
base
;
uint8_t
*
base
;
u
nsigned
long
limit
;
u
int32_t
limit
;
uint
8_t
seg_32bit
;
uint
32_t
flags
;
}
SegmentCache
;
}
SegmentCache
;
typedef
struct
CPUX86State
{
typedef
struct
CPUX86State
{
...
@@ -219,9 +249,16 @@ typedef struct CPUX86State {
...
@@ -219,9 +249,16 @@ typedef struct CPUX86State {
jmp_buf
jmp_env
;
jmp_buf
jmp_env
;
int
exception_index
;
int
exception_index
;
int
error_code
;
int
error_code
;
int
exception_is_int
;
int
exception_next_eip
;
uint32_t
cr
[
5
];
/* NOTE: cr1 is unused */
uint32_t
cr
[
5
];
/* NOTE: cr1 is unused */
uint32_t
dr
[
8
];
/* debug registers */
uint32_t
dr
[
8
];
/* debug registers */
int
interrupt_request
;
int
interrupt_request
;
/* if true, will exit from cpu_exec() ASAP */
/* if true, will call cpu_x86_get_pic_interrupt() ASAP to get the
request interrupt number */
int
hard_interrupt_request
;
int
user_mode_only
;
/* user mode only simulation */
/* user data */
/* user data */
void
*
opaque
;
void
*
opaque
;
...
@@ -240,6 +277,7 @@ CPUX86State *cpu_x86_init(void);
...
@@ -240,6 +277,7 @@ CPUX86State *cpu_x86_init(void);
int
cpu_x86_exec
(
CPUX86State
*
s
);
int
cpu_x86_exec
(
CPUX86State
*
s
);
void
cpu_x86_interrupt
(
CPUX86State
*
s
);
void
cpu_x86_interrupt
(
CPUX86State
*
s
);
void
cpu_x86_close
(
CPUX86State
*
s
);
void
cpu_x86_close
(
CPUX86State
*
s
);
int
cpu_x86_get_pic_interrupt
(
CPUX86State
*
s
);
/* needed to load some predefinied segment registers */
/* needed to load some predefinied segment registers */
void
cpu_x86_load_seg
(
CPUX86State
*
s
,
int
seg_reg
,
int
selector
);
void
cpu_x86_load_seg
(
CPUX86State
*
s
,
int
seg_reg
,
int
selector
);
...
@@ -255,6 +293,13 @@ struct siginfo;
...
@@ -255,6 +293,13 @@ struct siginfo;
int
cpu_x86_signal_handler
(
int
host_signum
,
struct
siginfo
*
info
,
int
cpu_x86_signal_handler
(
int
host_signum
,
struct
siginfo
*
info
,
void
*
puc
);
void
*
puc
);
/* MMU defines */
void
cpu_x86_init_mmu
(
CPUX86State
*
env
);
extern
CPUX86State
*
global_env
;
extern
int
phys_ram_size
;
extern
int
phys_ram_fd
;
extern
uint8_t
*
phys_ram_base
;
/* used to debug */
/* used to debug */
#define X86_DUMP_FPU 0x0001
/* dump FPU state too */
#define X86_DUMP_FPU 0x0001
/* dump FPU state too */
#define X86_DUMP_CCOP 0x0002
/* dump qemu flag cache */
#define X86_DUMP_CCOP 0x0002
/* dump qemu flag cache */
...
...
exec.c
浏览文件 @
66e85a21
...
@@ -30,7 +30,7 @@
...
@@ -30,7 +30,7 @@
#include "exec.h"
#include "exec.h"
//#define DEBUG_TB_INVALIDATE
//#define DEBUG_TB_INVALIDATE
#define DEBUG_FLUSH
//
#define DEBUG_FLUSH
/* make various TB consistency checks */
/* make various TB consistency checks */
//#define DEBUG_TB_CHECK
//#define DEBUG_TB_CHECK
...
@@ -579,3 +579,33 @@ void cpu_abort(CPUState *env, const char *fmt, ...)
...
@@ -579,3 +579,33 @@ void cpu_abort(CPUState *env, const char *fmt, ...)
abort
();
abort
();
}
}
#ifdef TARGET_I386
/* unmap all maped pages and flush all associated code */
void
page_unmap
(
void
)
{
PageDesc
*
p
,
*
pmap
;
unsigned
long
addr
;
int
i
,
j
,
ret
;
for
(
i
=
0
;
i
<
L1_SIZE
;
i
++
)
{
pmap
=
l1_map
[
i
];
if
(
pmap
)
{
p
=
pmap
;
for
(
j
=
0
;
j
<
L2_SIZE
;
j
++
)
{
if
(
p
->
flags
&
PAGE_VALID
)
{
addr
=
(
i
<<
(
32
-
L1_BITS
))
|
(
j
<<
TARGET_PAGE_BITS
);
ret
=
munmap
((
void
*
)
addr
,
TARGET_PAGE_SIZE
);
if
(
ret
!=
0
)
{
fprintf
(
stderr
,
"Could not unmap page 0x%08lx
\n
"
,
addr
);
exit
(
1
);
}
}
p
++
;
}
free
(
pmap
);
l1_map
[
i
]
=
NULL
;
}
}
tb_flush
();
}
#endif
exec.h
浏览文件 @
66e85a21
...
@@ -39,6 +39,7 @@ struct TranslationBlock;
...
@@ -39,6 +39,7 @@ struct TranslationBlock;
extern
uint16_t
gen_opc_buf
[
OPC_BUF_SIZE
];
extern
uint16_t
gen_opc_buf
[
OPC_BUF_SIZE
];
extern
uint32_t
gen_opparam_buf
[
OPPARAM_BUF_SIZE
];
extern
uint32_t
gen_opparam_buf
[
OPPARAM_BUF_SIZE
];
extern
uint32_t
gen_opc_pc
[
OPC_BUF_SIZE
];
extern
uint32_t
gen_opc_pc
[
OPC_BUF_SIZE
];
extern
uint8_t
gen_opc_cc_op
[
OPC_BUF_SIZE
];
extern
uint8_t
gen_opc_instr_start
[
OPC_BUF_SIZE
];
extern
uint8_t
gen_opc_instr_start
[
OPC_BUF_SIZE
];
#if defined(TARGET_I386)
#if defined(TARGET_I386)
...
@@ -57,14 +58,16 @@ extern uint8_t gen_opc_instr_start[OPC_BUF_SIZE];
...
@@ -57,14 +58,16 @@ extern uint8_t gen_opc_instr_start[OPC_BUF_SIZE];
extern
FILE
*
logfile
;
extern
FILE
*
logfile
;
extern
int
loglevel
;
extern
int
loglevel
;
int
gen_intermediate_code
(
struct
TranslationBlock
*
tb
,
int
search_pc
);
int
gen_intermediate_code
(
struct
TranslationBlock
*
tb
);
int
gen_intermediate_code_pc
(
struct
TranslationBlock
*
tb
);
void
dump_ops
(
const
uint16_t
*
opc_buf
,
const
uint32_t
*
opparam_buf
);
void
dump_ops
(
const
uint16_t
*
opc_buf
,
const
uint32_t
*
opparam_buf
);
int
cpu_gen_code
(
struct
TranslationBlock
*
tb
,
int
cpu_gen_code
(
struct
TranslationBlock
*
tb
,
int
max_code_size
,
int
*
gen_code_size_ptr
);
int
max_code_size
,
int
*
gen_code_size_ptr
);
int
cpu_
search_pc
(
struct
TranslationBlock
*
tb
,
int
cpu_
restore_state
(
struct
TranslationBlock
*
tb
,
uint32_t
*
found_pc
,
unsigned
long
searched_pc
);
CPUState
*
env
,
unsigned
long
searched_pc
);
void
cpu_exec_init
(
void
);
void
cpu_exec_init
(
void
);
int
page_unprotect
(
unsigned
long
address
);
int
page_unprotect
(
unsigned
long
address
);
void
page_unmap
(
void
);
#define CODE_GEN_MAX_SIZE 65536
#define CODE_GEN_MAX_SIZE 65536
#define CODE_GEN_ALIGN 16
/* must be >= of the size of a icache line */
#define CODE_GEN_ALIGN 16
/* must be >= of the size of a icache line */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录