Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xiphi1978
linux
提交
193dd2ce
L
linux
项目概览
xiphi1978
/
linux
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
193dd2ce
编写于
4月 04, 2006
作者:
R
Ralf Baechle
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[MIPS] R2: Implement shadow register allocation without spinlock.
Signed-off-by:
N
Ralf Baechle
<
ralf@linux-mips.org
>
上级
62a44215
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
18 addition
and
23 deletion
+18
-23
arch/mips/kernel/traps.c
arch/mips/kernel/traps.c
+18
-23
未找到文件。
arch/mips/kernel/traps.c
浏览文件 @
193dd2ce
...
...
@@ -961,15 +961,19 @@ void *set_except_vector(int n, void *addr)
#ifdef CONFIG_CPU_MIPSR2
/*
*
Shadow register
allocation
*
MIPSR2 shadow register set
allocation
* FIXME: SMP...
*/
/* MIPSR2 shadow register sets */
struct
shadow_registers
{
spinlock_t
sr_lock
;
/* */
int
sr_supported
;
/* Number of shadow register sets supported */
int
sr_allocated
;
/* Bitmap of allocated shadow registers */
static
struct
shadow_registers
{
/*
* Number of shadow register sets supported
*/
unsigned
long
sr_supported
;
/*
* Bitmap of allocated shadow registers
*/
unsigned
long
sr_allocated
;
}
shadow_registers
;
void
mips_srs_init
(
void
)
...
...
@@ -980,7 +984,6 @@ void mips_srs_init(void)
shadow_registers
.
sr_supported
);
#endif
shadow_registers
.
sr_allocated
=
1
;
/* Set 0 used by kernel */
spin_lock_init
(
&
shadow_registers
.
sr_lock
);
}
int
mips_srs_max
(
void
)
...
...
@@ -991,32 +994,24 @@ int mips_srs_max(void)
int
mips_srs_alloc
(
void
)
{
struct
shadow_registers
*
sr
=
&
shadow_registers
;
unsigned
long
flags
;
int
set
;
spin_lock_irqsave
(
&
sr
->
sr_lock
,
flags
);
again:
set
=
find_first_zero_bit
(
&
sr
->
sr_allocated
,
sr
->
sr_supported
);
if
(
set
>=
sr
->
sr_supported
)
return
-
1
;
for
(
set
=
0
;
set
<
sr
->
sr_supported
;
set
++
)
{
if
((
sr
->
sr_allocated
&
(
1
<<
set
))
==
0
)
{
sr
->
sr_allocated
|=
1
<<
set
;
spin_unlock_irqrestore
(
&
sr
->
sr_lock
,
flags
);
return
set
;
}
}
if
(
test_and_set_bit
(
set
,
&
sr
->
sr_allocated
))
goto
again
;
/* None available */
spin_unlock_irqrestore
(
&
sr
->
sr_lock
,
flags
);
return
-
1
;
return
set
;
}
void
mips_srs_free
(
int
set
)
{
struct
shadow_registers
*
sr
=
&
shadow_registers
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
sr
->
sr_lock
,
flags
);
sr
->
sr_allocated
&=
~
(
1
<<
set
);
spin_unlock_irqrestore
(
&
sr
->
sr_lock
,
flags
);
clear_bit
(
set
,
&
sr
->
sr_allocated
);
}
static
void
*
set_vi_srs_handler
(
int
n
,
void
*
addr
,
int
srs
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录