Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
btwise
openssl
提交
2688d999
O
openssl
项目概览
btwise
/
openssl
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
openssl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2688d999
编写于
11月 14, 2015
作者:
A
Andy Polyakov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
crypto/ppccap.c: add SIGILL-free processor capability detection code.
Reviewed-by:
N
Kurt Roeckx
<
kurt@openssl.org
>
上级
f562aeda
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
119 addition
and
21 deletion
+119
-21
crypto/ppc_arch.h
crypto/ppc_arch.h
+6
-0
crypto/ppccap.c
crypto/ppccap.c
+113
-21
未找到文件。
crypto/ppc_arch.h
浏览文件 @
2688d999
...
@@ -3,8 +3,14 @@
...
@@ -3,8 +3,14 @@
extern
unsigned
int
OPENSSL_ppccap_P
;
extern
unsigned
int
OPENSSL_ppccap_P
;
/*
* Flags' usage can appear ambiguous, because they are set rather
* to reflect OpenSSL performance preferences than actual processor
* capabilities.
*/
# define PPC_FPU64 (1<<0)
# define PPC_FPU64 (1<<0)
# define PPC_ALTIVEC (1<<1)
# define PPC_ALTIVEC (1<<1)
# define PPC_CRYPTO207 (1<<2)
# define PPC_CRYPTO207 (1<<2)
# define PPC_FPU (1<<3)
#endif
#endif
crypto/ppccap.c
浏览文件 @
2688d999
...
@@ -7,6 +7,12 @@
...
@@ -7,6 +7,12 @@
#if defined(__linux) || defined(_AIX)
#if defined(__linux) || defined(_AIX)
# include <sys/utsname.h>
# include <sys/utsname.h>
#endif
#endif
#if defined(_AIX53)
/* defined even on post-5.3 */
# include <sys/systemcfg.h>
# if !defined(__power_set)
# define __power_set(a) (_system_configuration.implementation & (a))
# endif
#endif
#include <openssl/crypto.h>
#include <openssl/crypto.h>
#include <openssl/bn.h>
#include <openssl/bn.h>
...
@@ -79,10 +85,37 @@ static void ill_handler(int sig)
...
@@ -79,10 +85,37 @@ static void ill_handler(int sig)
siglongjmp
(
ill_jmp
,
sig
);
siglongjmp
(
ill_jmp
,
sig
);
}
}
void
OPENSSL_fpu_probe
(
void
);
void
OPENSSL_ppc64_probe
(
void
);
void
OPENSSL_ppc64_probe
(
void
);
void
OPENSSL_altivec_probe
(
void
);
void
OPENSSL_altivec_probe
(
void
);
void
OPENSSL_crypto207_probe
(
void
);
void
OPENSSL_crypto207_probe
(
void
);
/*
* Use a weak reference to getauxval() so we can use it if it is available
* but don't break the build if it is not. Note that this is *link-time*
* feature detection, not *run-time*. In other words if we link with
* symbol present, it's expected to be present even at run-time.
*/
#if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__)
extern
unsigned
long
getauxval
(
unsigned
long
type
)
__attribute__
((
weak
));
#else
static
unsigned
long
(
*
getauxval
)
(
unsigned
long
)
=
NULL
;
#endif
/* I wish <sys/auxv.h> was universally available */
#define HWCAP 16
/* AT_HWCAP */
#define HWCAP_PPC64 (1U << 30)
#define HWCAP_ALTIVEC (1U << 28)
#define HWCAP_FPU (1U << 27)
#define HWCAP_POWER6_EXT (1U << 9)
#define HWCAP_VSX (1U << 7)
#define HWCAP2 26
/* AT_HWCAP2 */
#define HWCAP_VEC_CRYPTO (1U << 25)
# if defined(__GNUC__) && __GNUC__>=2
__attribute__
((
constructor
))
# endif
void
OPENSSL_cpuid_setup
(
void
)
void
OPENSSL_cpuid_setup
(
void
)
{
{
char
*
e
;
char
*
e
;
...
@@ -94,16 +127,6 @@ void OPENSSL_cpuid_setup(void)
...
@@ -94,16 +127,6 @@ void OPENSSL_cpuid_setup(void)
return
;
return
;
trigger
=
1
;
trigger
=
1
;
sigfillset
(
&
all_masked
);
sigdelset
(
&
all_masked
,
SIGILL
);
sigdelset
(
&
all_masked
,
SIGTRAP
);
#ifdef SIGEMT
sigdelset
(
&
all_masked
,
SIGEMT
);
#endif
sigdelset
(
&
all_masked
,
SIGFPE
);
sigdelset
(
&
all_masked
,
SIGBUS
);
sigdelset
(
&
all_masked
,
SIGSEGV
);
if
((
e
=
getenv
(
"OPENSSL_ppccap"
)))
{
if
((
e
=
getenv
(
"OPENSSL_ppccap"
)))
{
OPENSSL_ppccap_P
=
strtoul
(
e
,
NULL
,
0
);
OPENSSL_ppccap_P
=
strtoul
(
e
,
NULL
,
0
);
return
;
return
;
...
@@ -112,6 +135,8 @@ void OPENSSL_cpuid_setup(void)
...
@@ -112,6 +135,8 @@ void OPENSSL_cpuid_setup(void)
OPENSSL_ppccap_P
=
0
;
OPENSSL_ppccap_P
=
0
;
#if defined(_AIX)
#if defined(_AIX)
OPENSSL_ppccap_P
|=
PPC_FPU
;
if
(
sizeof
(
size_t
)
==
4
)
{
if
(
sizeof
(
size_t
)
==
4
)
{
struct
utsname
uts
;
struct
utsname
uts
;
# if defined(_SC_AIX_KERNEL_BITMODE)
# if defined(_SC_AIX_KERNEL_BITMODE)
...
@@ -121,7 +146,69 @@ void OPENSSL_cpuid_setup(void)
...
@@ -121,7 +146,69 @@ void OPENSSL_cpuid_setup(void)
if
(
uname
(
&
uts
)
!=
0
||
atoi
(
uts
.
version
)
<
6
)
if
(
uname
(
&
uts
)
!=
0
||
atoi
(
uts
.
version
)
<
6
)
return
;
return
;
}
}
# if defined(__power_set)
/*
* Value used in __power_set is a single-bit 1<<n one denoting
* specific processor class. Incidentally 0xffffffff<<n can be
* used to denote specific processor and its successors.
*/
if
(
sizeof
(
size_t
)
==
4
)
{
/* In 32-bit case PPC_FPU64 is always fastest [if option] */
if
(
__power_set
(
0xffffffffU
<<
13
))
/* POWER5 and later */
OPENSSL_ppccap_P
|=
PPC_FPU64
;
}
else
{
/* In 64-bit case PPC_FPU64 is fastest only on POWER6 */
if
(
__power_set
(
0x1U
<<
14
))
/* POWER6 */
OPENSSL_ppccap_P
|=
PPC_FPU64
;
}
if
(
__power_set
(
0xffffffffU
<<
14
))
/* POWER6 and later */
OPENSSL_ppccap_P
|=
PPC_ALTIVEC
;
if
(
__power_set
(
0xffffffffU
<<
16
))
/* POWER8 and later */
OPENSSL_ppccap_P
|=
PPC_CRYPTO207
;
return
;
# endif
#endif
if
(
getauxval
!=
NULL
)
{
unsigned
long
hwcap
=
getauxval
(
HWCAP
);
if
(
hwcap
&
HWCAP_FPU
)
{
OPENSSL_ppccap_P
|=
PPC_FPU
;
if
(
sizeof
(
size_t
)
==
4
)
{
/* In 32-bit case PPC_FPU64 is always fastest [if option] */
if
(
hwcap
&
HWCAP_PPC64
)
OPENSSL_ppccap_P
|=
PPC_FPU64
;
}
else
{
/* In 64-bit case PPC_FPU64 is fastest only on POWER6 */
if
(
hwcap
&
HWCAP_POWER6_EXT
)
OPENSSL_ppccap_P
|=
PPC_FPU64
;
}
}
if
(
hwcap
&
HWCAP_ALTIVEC
)
{
OPENSSL_ppccap_P
|=
PPC_ALTIVEC
;
if
((
hwcap
&
HWCAP_VSX
)
&&
(
getauxval
(
HWCAP2
)
&
HWCAP_VEC_CRYPTO
))
OPENSSL_ppccap_P
|=
PPC_CRYPTO207
;
}
return
;
}
sigfillset
(
&
all_masked
);
sigdelset
(
&
all_masked
,
SIGILL
);
sigdelset
(
&
all_masked
,
SIGTRAP
);
#ifdef SIGEMT
sigdelset
(
&
all_masked
,
SIGEMT
);
#endif
#endif
sigdelset
(
&
all_masked
,
SIGFPE
);
sigdelset
(
&
all_masked
,
SIGBUS
);
sigdelset
(
&
all_masked
,
SIGSEGV
);
memset
(
&
ill_act
,
0
,
sizeof
(
ill_act
));
memset
(
&
ill_act
,
0
,
sizeof
(
ill_act
));
ill_act
.
sa_handler
=
ill_handler
;
ill_act
.
sa_handler
=
ill_handler
;
...
@@ -130,19 +217,24 @@ void OPENSSL_cpuid_setup(void)
...
@@ -130,19 +217,24 @@ void OPENSSL_cpuid_setup(void)
sigprocmask
(
SIG_SETMASK
,
&
ill_act
.
sa_mask
,
&
oset
);
sigprocmask
(
SIG_SETMASK
,
&
ill_act
.
sa_mask
,
&
oset
);
sigaction
(
SIGILL
,
&
ill_act
,
&
ill_oact
);
sigaction
(
SIGILL
,
&
ill_act
,
&
ill_oact
);
if
(
sizeof
(
size_t
)
==
4
)
{
if
(
sigsetjmp
(
ill_jmp
,
1
)
==
0
)
{
OPENSSL_fpu_probe
();
OPENSSL_ppccap_P
|=
PPC_FPU
;
if
(
sizeof
(
size_t
)
==
4
)
{
#ifdef __linux
#ifdef __linux
struct
utsname
uts
;
struct
utsname
uts
;
if
(
uname
(
&
uts
)
==
0
&&
strcmp
(
uts
.
machine
,
"ppc64"
)
==
0
)
if
(
uname
(
&
uts
)
==
0
&&
strcmp
(
uts
.
machine
,
"ppc64"
)
==
0
)
#endif
#endif
if
(
sigsetjmp
(
ill_jmp
,
1
)
==
0
)
{
if
(
sigsetjmp
(
ill_jmp
,
1
)
==
0
)
{
OPENSSL_ppc64_probe
();
OPENSSL_ppc64_probe
();
OPENSSL_ppccap_P
|=
PPC_FPU64
;
OPENSSL_ppccap_P
|=
PPC_FPU64
;
}
}
}
else
{
}
else
{
/*
/*
* Wanted code detecting POWER6 CPU and setting PPC_FPU64
* Wanted code detecting POWER6 CPU and setting PPC_FPU64
*/
*/
}
}
}
if
(
sigsetjmp
(
ill_jmp
,
1
)
==
0
)
{
if
(
sigsetjmp
(
ill_jmp
,
1
)
==
0
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录