Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
cf6d64bf
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看板
提交
cf6d64bf
编写于
6月 19, 2010
作者:
B
Blue Swirl
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
apic: avoid passing CPUState from devices
Pass only APICState from pc.c. Signed-off-by:
N
Blue Swirl
<
blauwirbel@gmail.com
>
上级
96051119
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
25 addition
and
25 deletion
+25
-25
hw/apic.c
hw/apic.c
+14
-18
hw/apic.h
hw/apic.h
+5
-3
hw/pc.c
hw/pc.c
+6
-4
未找到文件。
hw/apic.c
浏览文件 @
cf6d64bf
...
@@ -94,7 +94,7 @@
...
@@ -94,7 +94,7 @@
#define MSI_ADDR_BASE 0xfee00000
#define MSI_ADDR_BASE 0xfee00000
#define MSI_ADDR_SIZE 0x100000
#define MSI_ADDR_SIZE 0x100000
typedef
struct
APICState
{
struct
APICState
{
CPUState
*
cpu_env
;
CPUState
*
cpu_env
;
uint32_t
apicbase
;
uint32_t
apicbase
;
uint8_t
id
;
uint8_t
id
;
...
@@ -118,7 +118,7 @@ typedef struct APICState {
...
@@ -118,7 +118,7 @@ typedef struct APICState {
QEMUTimer
*
timer
;
QEMUTimer
*
timer
;
int
sipi_vector
;
int
sipi_vector
;
int
wait_for_sipi
;
int
wait_for_sipi
;
}
APICState
;
};
static
int
apic_io_memory
;
static
int
apic_io_memory
;
static
APICState
*
local_apics
[
MAX_APICS
+
1
];
static
APICState
*
local_apics
[
MAX_APICS
+
1
];
...
@@ -167,9 +167,8 @@ static inline int get_bit(uint32_t *tab, int index)
...
@@ -167,9 +167,8 @@ static inline int get_bit(uint32_t *tab, int index)
return
!!
(
tab
[
i
]
&
mask
);
return
!!
(
tab
[
i
]
&
mask
);
}
}
static
void
apic_local_deliver
(
CPUState
*
env
,
int
vector
)
static
void
apic_local_deliver
(
APICState
*
s
,
int
vector
)
{
{
APICState
*
s
=
env
->
apic_state
;
uint32_t
lvt
=
s
->
lvt
[
vector
];
uint32_t
lvt
=
s
->
lvt
[
vector
];
int
trigger_mode
;
int
trigger_mode
;
...
@@ -180,15 +179,15 @@ static void apic_local_deliver(CPUState *env, int vector)
...
@@ -180,15 +179,15 @@ static void apic_local_deliver(CPUState *env, int vector)
switch
((
lvt
>>
8
)
&
7
)
{
switch
((
lvt
>>
8
)
&
7
)
{
case
APIC_DM_SMI
:
case
APIC_DM_SMI
:
cpu_interrupt
(
env
,
CPU_INTERRUPT_SMI
);
cpu_interrupt
(
s
->
cpu_
env
,
CPU_INTERRUPT_SMI
);
break
;
break
;
case
APIC_DM_NMI
:
case
APIC_DM_NMI
:
cpu_interrupt
(
env
,
CPU_INTERRUPT_NMI
);
cpu_interrupt
(
s
->
cpu_
env
,
CPU_INTERRUPT_NMI
);
break
;
break
;
case
APIC_DM_EXTINT
:
case
APIC_DM_EXTINT
:
cpu_interrupt
(
env
,
CPU_INTERRUPT_HARD
);
cpu_interrupt
(
s
->
cpu_
env
,
CPU_INTERRUPT_HARD
);
break
;
break
;
case
APIC_DM_FIXED
:
case
APIC_DM_FIXED
:
...
@@ -200,12 +199,11 @@ static void apic_local_deliver(CPUState *env, int vector)
...
@@ -200,12 +199,11 @@ static void apic_local_deliver(CPUState *env, int vector)
}
}
}
}
void
apic_deliver_pic_intr
(
CPUState
*
env
,
int
level
)
void
apic_deliver_pic_intr
(
APICState
*
s
,
int
level
)
{
{
if
(
level
)
if
(
level
)
{
apic_local_deliver
(
env
,
APIC_LVT_LINT0
);
apic_local_deliver
(
s
,
APIC_LVT_LINT0
);
else
{
}
else
{
APICState
*
s
=
env
->
apic_state
;
uint32_t
lvt
=
s
->
lvt
[
APIC_LVT_LINT0
];
uint32_t
lvt
=
s
->
lvt
[
APIC_LVT_LINT0
];
switch
((
lvt
>>
8
)
&
7
)
{
switch
((
lvt
>>
8
)
&
7
)
{
...
@@ -215,7 +213,7 @@ void apic_deliver_pic_intr(CPUState *env, int level)
...
@@ -215,7 +213,7 @@ void apic_deliver_pic_intr(CPUState *env, int level)
reset_bit
(
s
->
irr
,
lvt
&
0xff
);
reset_bit
(
s
->
irr
,
lvt
&
0xff
);
/* fall through */
/* fall through */
case
APIC_DM_EXTINT
:
case
APIC_DM_EXTINT
:
cpu_reset_interrupt
(
env
,
CPU_INTERRUPT_HARD
);
cpu_reset_interrupt
(
s
->
cpu_
env
,
CPU_INTERRUPT_HARD
);
break
;
break
;
}
}
}
}
...
@@ -591,9 +589,8 @@ static void apic_deliver(APICState *s, uint8_t dest, uint8_t dest_mode,
...
@@ -591,9 +589,8 @@ static void apic_deliver(APICState *s, uint8_t dest, uint8_t dest_mode,
trigger_mode
);
trigger_mode
);
}
}
int
apic_get_interrupt
(
CPUState
*
env
)
int
apic_get_interrupt
(
APICState
*
s
)
{
{
APICState
*
s
=
env
->
apic_state
;
int
intno
;
int
intno
;
/* if the APIC is installed or enabled, we let the 8259 handle the
/* if the APIC is installed or enabled, we let the 8259 handle the
...
@@ -615,9 +612,8 @@ int apic_get_interrupt(CPUState *env)
...
@@ -615,9 +612,8 @@ int apic_get_interrupt(CPUState *env)
return
intno
;
return
intno
;
}
}
int
apic_accept_pic_intr
(
CPUState
*
env
)
int
apic_accept_pic_intr
(
APICState
*
s
)
{
{
APICState
*
s
=
env
->
apic_state
;
uint32_t
lvt0
;
uint32_t
lvt0
;
if
(
!
s
)
if
(
!
s
)
...
@@ -679,7 +675,7 @@ static void apic_timer(void *opaque)
...
@@ -679,7 +675,7 @@ static void apic_timer(void *opaque)
{
{
APICState
*
s
=
opaque
;
APICState
*
s
=
opaque
;
apic_local_deliver
(
s
->
cpu_env
,
APIC_LVT_TIMER
);
apic_local_deliver
(
s
,
APIC_LVT_TIMER
);
apic_timer_update
(
s
,
s
->
next_time
);
apic_timer_update
(
s
,
s
->
next_time
);
}
}
...
...
hw/apic.h
浏览文件 @
cf6d64bf
#ifndef APIC_H
#ifndef APIC_H
#define APIC_H
#define APIC_H
/* apic.c */
typedef
struct
APICState
APICState
;
void
apic_deliver_irq
(
uint8_t
dest
,
uint8_t
dest_mode
,
void
apic_deliver_irq
(
uint8_t
dest
,
uint8_t
dest_mode
,
uint8_t
delivery_mode
,
uint8_t
delivery_mode
,
uint8_t
vector_num
,
uint8_t
polarity
,
uint8_t
vector_num
,
uint8_t
polarity
,
uint8_t
trigger_mode
);
uint8_t
trigger_mode
);
int
apic_init
(
CPUState
*
env
);
int
apic_init
(
CPUState
*
env
);
int
apic_accept_pic_intr
(
CPUState
*
env
);
int
apic_accept_pic_intr
(
APICState
*
s
);
void
apic_deliver_pic_intr
(
CPUState
*
env
,
int
level
);
void
apic_deliver_pic_intr
(
APICState
*
s
,
int
level
);
int
apic_get_interrupt
(
CPUState
*
env
);
int
apic_get_interrupt
(
APICState
*
s
);
void
apic_reset_irq_delivered
(
void
);
void
apic_reset_irq_delivered
(
void
);
int
apic_get_irq_delivered
(
void
);
int
apic_get_irq_delivered
(
void
);
...
...
hw/pc.c
浏览文件 @
cf6d64bf
...
@@ -145,7 +145,7 @@ int cpu_get_pic_interrupt(CPUState *env)
...
@@ -145,7 +145,7 @@ int cpu_get_pic_interrupt(CPUState *env)
{
{
int
intno
;
int
intno
;
intno
=
apic_get_interrupt
(
env
);
intno
=
apic_get_interrupt
(
env
->
apic_state
);
if
(
intno
>=
0
)
{
if
(
intno
>=
0
)
{
/* set irq request if a PIC irq is still pending */
/* set irq request if a PIC irq is still pending */
/* XXX: improve that */
/* XXX: improve that */
...
@@ -153,8 +153,9 @@ int cpu_get_pic_interrupt(CPUState *env)
...
@@ -153,8 +153,9 @@ int cpu_get_pic_interrupt(CPUState *env)
return
intno
;
return
intno
;
}
}
/* read the irq from the PIC */
/* read the irq from the PIC */
if
(
!
apic_accept_pic_intr
(
env
))
if
(
!
apic_accept_pic_intr
(
env
->
apic_state
))
{
return
-
1
;
return
-
1
;
}
intno
=
pic_read_irq
(
isa_pic
);
intno
=
pic_read_irq
(
isa_pic
);
return
intno
;
return
intno
;
...
@@ -167,8 +168,9 @@ static void pic_irq_request(void *opaque, int irq, int level)
...
@@ -167,8 +168,9 @@ static void pic_irq_request(void *opaque, int irq, int level)
DPRINTF
(
"pic_irqs: %s irq %d
\n
"
,
level
?
"raise"
:
"lower"
,
irq
);
DPRINTF
(
"pic_irqs: %s irq %d
\n
"
,
level
?
"raise"
:
"lower"
,
irq
);
if
(
env
->
apic_state
)
{
if
(
env
->
apic_state
)
{
while
(
env
)
{
while
(
env
)
{
if
(
apic_accept_pic_intr
(
env
))
if
(
apic_accept_pic_intr
(
env
->
apic_state
))
{
apic_deliver_pic_intr
(
env
,
level
);
apic_deliver_pic_intr
(
env
->
apic_state
,
level
);
}
env
=
env
->
next_cpu
;
env
=
env
->
next_cpu
;
}
}
}
else
{
}
else
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录