Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
a5f0d190
提交
a5f0d190
10月 23, 2011
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
The start of lapic.c 64-bitification.
上级
25a3ddf9
显示空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
24 行增加
和
26 行删除
+24
-26
Makefile
Makefile
+1
-0
lapic.c
lapic.c
+15
-26
main.c
main.c
+2
-0
x86.h
x86.h
+6
-0
没有找到文件。
Makefile
浏览文件 @
a5f0d190
...
...
@@ -4,6 +4,7 @@ OBJS = \
asm.o
\
cga.o
\
console.o
\
lapic.o
\
main.o
\
mp.o
\
spinlock.o
\
...
...
lapic.c
浏览文件 @
a5f0d190
...
...
@@ -2,11 +2,11 @@
// See Chapter 8 & Appendix C of Intel processor manual volume 3.
#include "types.h"
#include "defs.h"
#include "traps.h"
#include "mmu.h"
#include "x86.h"
#include "param.h"
#include "kernel.h"
#include "traps.h"
#include "bits.h"
// Local APIC registers, divided by 4 for use as uint[] indices.
#define ID (0x0020/4) // ID
...
...
@@ -39,7 +39,7 @@
#define TCCR (0x0390/4) // Timer Current Count
#define TDCR (0x03E0/4) // Timer Divide Configuration
volatile
u
int
*
lapic
;
// Initialized in mp.c
volatile
u
32
*
lapic
=
(
u32
*
)(
KBASE
+
0xfee00000
);
static
void
lapicw
(
int
index
,
int
value
)
...
...
@@ -48,8 +48,8 @@ lapicw(int index, int value)
lapic
[
ID
];
// wait for write to finish, by reading
}
static
u
int
lapicr
(
u
int
off
)
static
u
32
lapicr
(
u
32
off
)
{
return
lapic
[
off
];
}
...
...
@@ -57,7 +57,7 @@ lapicr(uint off)
static
int
apic_icr_wait
()
{
u
int
i
=
100000
;
int
i
=
100000
;
while
((
lapicr
(
ICRLO
)
&
BUSY
)
!=
0
)
{
nop_pause
();
i
--
;
...
...
@@ -69,17 +69,13 @@ apic_icr_wait()
return
0
;
}
//PAGEBREAK!
void
lapicinit
(
int
c
)
initlapic
(
void
)
{
cprintf
(
"lapicinit: %d 0x%x
\n
"
,
c
,
lapic
);
if
(
!
lapic
)
return
;
// Enable local APIC; set spurious interrupt vector.
lapicw
(
SVR
,
ENABLE
|
(
T_IRQ0
+
IRQ_SPURIOUS
));
// XXX(sbw)
// The timer repeatedly counts down at bus frequency
// from lapic[TICR] and then issues an interrupt.
// If xv6 cared more about precise timekeeping,
...
...
@@ -125,8 +121,8 @@ cpunum(void)
// Would prefer to panic but even printing is chancy here:
// almost everything, including cprintf and panic, calls cpu,
// often indirectly through acquire and release.
if
(
read
e
flags
()
&
FL_IF
){
static
int
n
__
attribute__
((
aligned
(
CACHELINE
)))
;
if
(
read
r
flags
()
&
FL_IF
){
static
int
n
__
mpalign__
;
if
(
n
==
0
)
{
n
++
;
cprintf
(
"cpu called from %x with interrupts enabled
\n
"
,
...
...
@@ -147,13 +143,6 @@ lapiceoi(void)
lapicw
(
EOI
,
0
);
}
// Spin for a given number of microseconds.
// On real hardware would want to tune this dynamically.
void
microdelay
(
int
us
)
{
}
// Send IPI
void
lapic_ipi
(
int
cpu
,
int
ino
)
...
...
@@ -165,7 +154,7 @@ lapic_ipi(int cpu, int ino)
}
void
lapic_tlbflush
(
u
int
cpu
)
lapic_tlbflush
(
u
32
cpu
)
{
lapic_ipi
(
cpu
,
T_TLBFLUSH
);
}
...
...
@@ -175,17 +164,17 @@ lapic_tlbflush(uint cpu)
// Start additional processor running bootstrap code at addr.
// See Appendix B of MultiProcessor Specification.
void
lapicstartap
(
u
char
apicid
,
uint
addr
)
lapicstartap
(
u
8
apicid
,
u32
addr
)
{
int
i
;
u
short
*
wrv
;
u
16
*
wrv
;
// "The BSP must initialize CMOS shutdown code to 0AH
// and the warm reset vector (DWORD based at 40:67) to point at
// the AP startup code prior to the [universal startup algorithm]."
outb
(
IO_RTC
,
0xF
);
// offset 0xF is shutdown code
outb
(
IO_RTC
+
1
,
0x0A
);
wrv
=
(
u
short
*
)(
0x40
<<
4
|
0x67
);
// Warm reset vector
wrv
=
(
u
16
*
)(
0x40
<<
4
|
0x67
);
// Warm reset vector
wrv
[
0
]
=
0
;
wrv
[
1
]
=
addr
>>
4
;
...
...
main.c
浏览文件 @
a5f0d190
...
...
@@ -6,6 +6,7 @@ extern void inituart(void);
extern
void
initcga
(
void
);
extern
void
initconsole
(
void
);
extern
void
initmp
(
void
);
extern
void
initlapic
(
void
);
extern
void
inittrap
(
void
);
void
...
...
@@ -15,6 +16,7 @@ cmain(void)
initcga
();
initconsole
();
initmp
();
initlapic
();
#if 0
inittrap();
#endif
...
...
x86.h
浏览文件 @
a5f0d190
...
...
@@ -63,3 +63,9 @@ sti(void)
{
__asm
volatile
(
"sti"
);
}
static
inline
void
nop_pause
(
void
)
{
__asm
volatile
(
"pause"
:
:
);
}
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论