Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
bcf8677b
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
bcf8677b
编写于
6月 05, 2018
作者:
P
Petr Mladek
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-4.18-vsprintf-cleanup' into for-4.18
上级
554755be
cdb7e52d
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
54 addition
and
78 deletion
+54
-78
lib/test_printf.c
lib/test_printf.c
+1
-1
lib/vsprintf.c
lib/vsprintf.c
+53
-77
未找到文件。
lib/test_printf.c
浏览文件 @
bcf8677b
...
...
@@ -204,7 +204,7 @@ test_string(void)
#if BITS_PER_LONG == 64
#define PTR_WIDTH 16
#define PTR ((void *)0xffff0123456789ab)
#define PTR ((void *)0xffff0123456789ab
UL
)
#define PTR_STR "ffff0123456789ab"
#define ZEROS "00000000"
/* hex 32 zero bits */
...
...
lib/vsprintf.c
浏览文件 @
bcf8677b
...
...
@@ -693,6 +693,22 @@ char *symbol_string(char *buf, char *end, void *ptr,
#endif
}
static
const
struct
printf_spec
default_str_spec
=
{
.
field_width
=
-
1
,
.
precision
=
-
1
,
};
static
const
struct
printf_spec
default_flag_spec
=
{
.
base
=
16
,
.
precision
=
-
1
,
.
flags
=
SPECIAL
|
SMALL
,
};
static
const
struct
printf_spec
default_dec_spec
=
{
.
base
=
10
,
.
precision
=
-
1
,
};
static
noinline_for_stack
char
*
resource_string
(
char
*
buf
,
char
*
end
,
struct
resource
*
res
,
struct
printf_spec
spec
,
const
char
*
fmt
)
...
...
@@ -722,21 +738,11 @@ char *resource_string(char *buf, char *end, struct resource *res,
.
precision
=
-
1
,
.
flags
=
SMALL
|
ZEROPAD
,
};
static
const
struct
printf_spec
dec_spec
=
{
.
base
=
10
,
.
precision
=
-
1
,
.
flags
=
0
,
};
static
const
struct
printf_spec
str_spec
=
{
.
field_width
=
-
1
,
.
precision
=
10
,
.
flags
=
LEFT
,
};
static
const
struct
printf_spec
flag_spec
=
{
.
base
=
16
,
.
precision
=
-
1
,
.
flags
=
SPECIAL
|
SMALL
,
};
/* 32-bit res (sizeof==4): 10 chars in dec, 10 in hex ("0x" + 8)
* 64-bit res (sizeof==8): 20 chars in dec, 18 in hex ("0x" + 16) */
...
...
@@ -760,10 +766,10 @@ char *resource_string(char *buf, char *end, struct resource *res,
specp
=
&
mem_spec
;
}
else
if
(
res
->
flags
&
IORESOURCE_IRQ
)
{
p
=
string
(
p
,
pend
,
"irq "
,
str_spec
);
specp
=
&
dec_spec
;
specp
=
&
de
fault_de
c_spec
;
}
else
if
(
res
->
flags
&
IORESOURCE_DMA
)
{
p
=
string
(
p
,
pend
,
"dma "
,
str_spec
);
specp
=
&
dec_spec
;
specp
=
&
de
fault_de
c_spec
;
}
else
if
(
res
->
flags
&
IORESOURCE_BUS
)
{
p
=
string
(
p
,
pend
,
"bus "
,
str_spec
);
specp
=
&
bus_spec
;
...
...
@@ -793,7 +799,7 @@ char *resource_string(char *buf, char *end, struct resource *res,
p
=
string
(
p
,
pend
,
" disabled"
,
str_spec
);
}
else
{
p
=
string
(
p
,
pend
,
" flags "
,
str_spec
);
p
=
number
(
p
,
pend
,
res
->
flags
,
flag_spec
);
p
=
number
(
p
,
pend
,
res
->
flags
,
default_
flag_spec
);
}
*
p
++
=
']'
;
*
p
=
'\0'
;
...
...
@@ -903,9 +909,6 @@ char *bitmap_list_string(char *buf, char *end, unsigned long *bitmap,
int
cur
,
rbot
,
rtop
;
bool
first
=
true
;
/* reused to print numbers */
spec
=
(
struct
printf_spec
){
.
base
=
10
};
rbot
=
cur
=
find_first_bit
(
bitmap
,
nr_bits
);
while
(
cur
<
nr_bits
)
{
rtop
=
cur
;
...
...
@@ -920,13 +923,13 @@ char *bitmap_list_string(char *buf, char *end, unsigned long *bitmap,
}
first
=
false
;
buf
=
number
(
buf
,
end
,
rbot
,
spec
);
buf
=
number
(
buf
,
end
,
rbot
,
default_dec_
spec
);
if
(
rbot
<
rtop
)
{
if
(
buf
<
end
)
*
buf
=
'-'
;
buf
++
;
buf
=
number
(
buf
,
end
,
rtop
,
spec
);
buf
=
number
(
buf
,
end
,
rtop
,
default_dec_
spec
);
}
rbot
=
cur
;
...
...
@@ -1344,11 +1347,9 @@ char *uuid_string(char *buf, char *end, const u8 *addr,
return
string
(
buf
,
end
,
uuid
,
spec
);
}
int
kptr_restrict
__read_mostly
;
static
noinline_for_stack
char
*
restricted_pointer
(
char
*
buf
,
char
*
end
,
const
void
*
ptr
,
struct
printf_spec
spec
)
char
*
pointer_string
(
char
*
buf
,
char
*
end
,
const
void
*
ptr
,
struct
printf_spec
spec
)
{
spec
.
base
=
16
;
spec
.
flags
|=
SMALL
;
...
...
@@ -1357,6 +1358,15 @@ char *restricted_pointer(char *buf, char *end, const void *ptr,
spec
.
flags
|=
ZEROPAD
;
}
return
number
(
buf
,
end
,
(
unsigned
long
int
)
ptr
,
spec
);
}
int
kptr_restrict
__read_mostly
;
static
noinline_for_stack
char
*
restricted_pointer
(
char
*
buf
,
char
*
end
,
const
void
*
ptr
,
struct
printf_spec
spec
)
{
switch
(
kptr_restrict
)
{
case
0
:
/* Always print %pK values */
...
...
@@ -1368,8 +1378,11 @@ char *restricted_pointer(char *buf, char *end, const void *ptr,
* kptr_restrict==1 cannot be used in IRQ context
* because its test for CAP_SYSLOG would be meaningless.
*/
if
(
in_irq
()
||
in_serving_softirq
()
||
in_nmi
())
if
(
in_irq
()
||
in_serving_softirq
()
||
in_nmi
())
{
if
(
spec
.
field_width
==
-
1
)
spec
.
field_width
=
2
*
sizeof
(
ptr
);
return
string
(
buf
,
end
,
"pK-error"
,
spec
);
}
/*
* Only print the real pointer value if the current
...
...
@@ -1394,7 +1407,7 @@ char *restricted_pointer(char *buf, char *end, const void *ptr,
break
;
}
return
number
(
buf
,
end
,
(
unsigned
long
)
ptr
,
spec
);
return
pointer_string
(
buf
,
end
,
ptr
,
spec
);
}
static
noinline_for_stack
...
...
@@ -1464,23 +1477,13 @@ char *format_flags(char *buf, char *end, unsigned long flags,
const
struct
trace_print_flags
*
names
)
{
unsigned
long
mask
;
const
struct
printf_spec
strspec
=
{
.
field_width
=
-
1
,
.
precision
=
-
1
,
};
const
struct
printf_spec
numspec
=
{
.
flags
=
SPECIAL
|
SMALL
,
.
field_width
=
-
1
,
.
precision
=
-
1
,
.
base
=
16
,
};
for
(
;
flags
&&
names
->
name
;
names
++
)
{
mask
=
names
->
mask
;
if
((
flags
&
mask
)
!=
mask
)
continue
;
buf
=
string
(
buf
,
end
,
names
->
name
,
str
spec
);
buf
=
string
(
buf
,
end
,
names
->
name
,
default_str_
spec
);
flags
&=
~
mask
;
if
(
flags
)
{
...
...
@@ -1491,7 +1494,7 @@ char *format_flags(char *buf, char *end, unsigned long flags,
}
if
(
flags
)
buf
=
number
(
buf
,
end
,
flags
,
num
spec
);
buf
=
number
(
buf
,
end
,
flags
,
default_flag_
spec
);
return
buf
;
}
...
...
@@ -1538,22 +1541,18 @@ char *device_node_gen_full_name(const struct device_node *np, char *buf, char *e
{
int
depth
;
const
struct
device_node
*
parent
=
np
->
parent
;
static
const
struct
printf_spec
strspec
=
{
.
field_width
=
-
1
,
.
precision
=
-
1
,
};
/* special case for root node */
if
(
!
parent
)
return
string
(
buf
,
end
,
"/"
,
str
spec
);
return
string
(
buf
,
end
,
"/"
,
default_str_
spec
);
for
(
depth
=
0
;
parent
->
parent
;
depth
++
)
parent
=
parent
->
parent
;
for
(
;
depth
>=
0
;
depth
--
)
{
buf
=
string
(
buf
,
end
,
"/"
,
str
spec
);
buf
=
string
(
buf
,
end
,
"/"
,
default_str_
spec
);
buf
=
string
(
buf
,
end
,
device_node_name_for_depth
(
np
,
depth
),
str
spec
);
default_str_
spec
);
}
return
buf
;
}
...
...
@@ -1645,20 +1644,6 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
return
widen_string
(
buf
,
buf
-
buf_start
,
end
,
spec
);
}
static
noinline_for_stack
char
*
pointer_string
(
char
*
buf
,
char
*
end
,
const
void
*
ptr
,
struct
printf_spec
spec
)
{
spec
.
base
=
16
;
spec
.
flags
|=
SMALL
;
if
(
spec
.
field_width
==
-
1
)
{
spec
.
field_width
=
2
*
sizeof
(
ptr
);
spec
.
flags
|=
ZEROPAD
;
}
return
number
(
buf
,
end
,
(
unsigned
long
int
)
ptr
,
spec
);
}
static
bool
have_filled_random_ptr_key
__read_mostly
;
static
siphash_key_t
ptr_key
__read_mostly
;
...
...
@@ -1696,13 +1681,13 @@ early_initcall(initialize_ptr_random);
/* Maps a pointer to a 32 bit unique identifier. */
static
char
*
ptr_to_id
(
char
*
buf
,
char
*
end
,
void
*
ptr
,
struct
printf_spec
spec
)
{
const
char
*
str
=
sizeof
(
ptr
)
==
8
?
"(____ptrval____)"
:
"(ptrval)"
;
unsigned
long
hashval
;
const
int
default_width
=
2
*
sizeof
(
ptr
);
if
(
unlikely
(
!
have_filled_random_ptr_key
))
{
spec
.
field_width
=
default_width
;
spec
.
field_width
=
2
*
sizeof
(
ptr
)
;
/* string length must be less than default_width */
return
string
(
buf
,
end
,
"(ptrval)"
,
spec
);
return
string
(
buf
,
end
,
str
,
spec
);
}
#ifdef CONFIG_64BIT
...
...
@@ -1715,15 +1700,7 @@ static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec)
#else
hashval
=
(
unsigned
long
)
siphash_1u32
((
u32
)
ptr
,
&
ptr_key
);
#endif
spec
.
flags
|=
SMALL
;
if
(
spec
.
field_width
==
-
1
)
{
spec
.
field_width
=
default_width
;
spec
.
flags
|=
ZEROPAD
;
}
spec
.
base
=
16
;
return
number
(
buf
,
end
,
hashval
,
spec
);
return
pointer_string
(
buf
,
end
,
(
const
void
*
)
hashval
,
spec
);
}
/*
...
...
@@ -1736,10 +1713,10 @@ static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec)
*
* Right now we handle:
*
* - '
F' For symbolic function descriptor pointers
with offset
* - '
f' For simple symbolic function names
without offset
* - '
S' For symbolic direct pointers with offset
* - '
s' For symbolic direct pointers without offset
* - '
S' For symbolic direct pointers (or function descriptors)
with offset
* - '
s' For symbolic direct pointers (or function descriptors)
without offset
* - '
F' Same as 'S'
* - '
f' Same as 's'
* - '[FfSs]R' as above with __builtin_extract_return_addr() translation
* - 'B' For backtraced symbolic direct pointers with offset
* - 'R' For decoded struct resource, e.g., [mem 0x0-0x1f 64bit pref]
...
...
@@ -1836,10 +1813,6 @@ static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec)
* ** When making changes please also update:
* Documentation/core-api/printk-formats.rst
*
* Note: The difference between 'S' and 'F' is that on ia64 and ppc64
* function pointers are really function descriptors, which contain a
* pointer to the real address.
*
* Note: The default behaviour (unadorned %p) is to hash the address,
* rendering it useful as a unique identifier.
*/
...
...
@@ -2115,6 +2088,7 @@ int format_decode(const char *fmt, struct printf_spec *spec)
case
'x'
:
spec
->
flags
|=
SMALL
;
/* fall through */
case
'X'
:
spec
->
base
=
16
;
...
...
@@ -3069,8 +3043,10 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
break
;
case
'i'
:
base
=
0
;
/* fall through */
case
'd'
:
is_sign
=
true
;
/* fall through */
case
'u'
:
break
;
case
'%'
:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录