2022-10-12 06:40:56 -04:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef __TRACE_PROBE_KERNEL_H_
# define __TRACE_PROBE_KERNEL_H_
2022-10-12 06:40:57 -04:00
# define FAULT_STRING "(fault)"
2022-10-12 06:40:56 -04:00
/*
* This depends on trace_probe . h , but can not include it due to
* the way trace_probe_tmpl . h is used by trace_kprobe . c and trace_eprobe . c .
* Which means that any other user must include trace_probe . h before including
* this file .
*/
/* Return the length of string -- including null terminal byte */
static nokprobe_inline int
kernel/trace: Provide default impelentations defined in trace_probe_tmpl.h
There are 6 function definitions in trace_probe_tmpl.h, they are:
1, fetch_store_strlen
2, fetch_store_string
3, fetch_store_strlen_user
4, fetch_store_string_user
5, probe_mem_read
6, probe_mem_read_user
Every C file which includes trace_probe_tmpl.h has to implement them,
otherwise it gets warnings and errors. However, some of them are identical,
like kprobe and eprobe, as a result, there is a lot redundant code in those
2 files.
This patch would like to provide default behaviors for those functions
which kprobe and eprobe can share by just including trace_probe_kernel.h
with trace_probe_tmpl.h together.
It removes redundant code, increases readability, and more importantly,
makes it easier to introduce a new feature based on trace probe
(it's possible).
Link: https://lore.kernel.org/all/1672382018-18347-1-git-send-email-chensong_2000@189.cn/
Signed-off-by: Song Chen <chensong_2000@189.cn>
Reported-by: kernel test robot <lkp@intel.com>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
2022-12-30 14:33:38 +08:00
fetch_store_strlen_user ( unsigned long addr )
2022-10-12 06:40:56 -04:00
{
const void __user * uaddr = ( __force const void __user * ) addr ;
2022-10-12 06:40:57 -04:00
int ret ;
2022-10-12 06:40:56 -04:00
2022-10-12 06:40:57 -04:00
ret = strnlen_user_nofault ( uaddr , MAX_STRING_SIZE ) ;
/*
* strnlen_user_nofault returns zero on fault , insert the
* FAULT_STRING when that occurs .
*/
if ( ret < = 0 )
return strlen ( FAULT_STRING ) + 1 ;
return ret ;
2022-10-12 06:40:56 -04:00
}
/* Return the length of string -- including null terminal byte */
static nokprobe_inline int
kernel/trace: Provide default impelentations defined in trace_probe_tmpl.h
There are 6 function definitions in trace_probe_tmpl.h, they are:
1, fetch_store_strlen
2, fetch_store_string
3, fetch_store_strlen_user
4, fetch_store_string_user
5, probe_mem_read
6, probe_mem_read_user
Every C file which includes trace_probe_tmpl.h has to implement them,
otherwise it gets warnings and errors. However, some of them are identical,
like kprobe and eprobe, as a result, there is a lot redundant code in those
2 files.
This patch would like to provide default behaviors for those functions
which kprobe and eprobe can share by just including trace_probe_kernel.h
with trace_probe_tmpl.h together.
It removes redundant code, increases readability, and more importantly,
makes it easier to introduce a new feature based on trace probe
(it's possible).
Link: https://lore.kernel.org/all/1672382018-18347-1-git-send-email-chensong_2000@189.cn/
Signed-off-by: Song Chen <chensong_2000@189.cn>
Reported-by: kernel test robot <lkp@intel.com>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
2022-12-30 14:33:38 +08:00
fetch_store_strlen ( unsigned long addr )
2022-10-12 06:40:56 -04:00
{
int ret , len = 0 ;
u8 c ;
# ifdef CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
if ( addr < TASK_SIZE )
kernel/trace: Provide default impelentations defined in trace_probe_tmpl.h
There are 6 function definitions in trace_probe_tmpl.h, they are:
1, fetch_store_strlen
2, fetch_store_string
3, fetch_store_strlen_user
4, fetch_store_string_user
5, probe_mem_read
6, probe_mem_read_user
Every C file which includes trace_probe_tmpl.h has to implement them,
otherwise it gets warnings and errors. However, some of them are identical,
like kprobe and eprobe, as a result, there is a lot redundant code in those
2 files.
This patch would like to provide default behaviors for those functions
which kprobe and eprobe can share by just including trace_probe_kernel.h
with trace_probe_tmpl.h together.
It removes redundant code, increases readability, and more importantly,
makes it easier to introduce a new feature based on trace probe
(it's possible).
Link: https://lore.kernel.org/all/1672382018-18347-1-git-send-email-chensong_2000@189.cn/
Signed-off-by: Song Chen <chensong_2000@189.cn>
Reported-by: kernel test robot <lkp@intel.com>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
2022-12-30 14:33:38 +08:00
return fetch_store_strlen_user ( addr ) ;
2022-10-12 06:40:56 -04:00
# endif
do {
ret = copy_from_kernel_nofault ( & c , ( u8 * ) addr + len , 1 ) ;
len + + ;
} while ( c & & ret = = 0 & & len < MAX_STRING_SIZE ) ;
2022-10-12 06:40:57 -04:00
/* For faults, return enough to hold the FAULT_STRING */
return ( ret < 0 ) ? strlen ( FAULT_STRING ) + 1 : len ;
}
static nokprobe_inline void set_data_loc ( int ret , void * dest , void * __dest , void * base , int len )
{
if ( ret > = 0 ) {
* ( u32 * ) dest = make_data_loc ( ret , __dest - base ) ;
} else {
strscpy ( __dest , FAULT_STRING , len ) ;
ret = strlen ( __dest ) + 1 ;
}
2022-10-12 06:40:56 -04:00
}
/*
* Fetch a null - terminated string from user . Caller MUST set * ( u32 * ) buf
* with max length and relative data location .
*/
static nokprobe_inline int
kernel/trace: Provide default impelentations defined in trace_probe_tmpl.h
There are 6 function definitions in trace_probe_tmpl.h, they are:
1, fetch_store_strlen
2, fetch_store_string
3, fetch_store_strlen_user
4, fetch_store_string_user
5, probe_mem_read
6, probe_mem_read_user
Every C file which includes trace_probe_tmpl.h has to implement them,
otherwise it gets warnings and errors. However, some of them are identical,
like kprobe and eprobe, as a result, there is a lot redundant code in those
2 files.
This patch would like to provide default behaviors for those functions
which kprobe and eprobe can share by just including trace_probe_kernel.h
with trace_probe_tmpl.h together.
It removes redundant code, increases readability, and more importantly,
makes it easier to introduce a new feature based on trace probe
(it's possible).
Link: https://lore.kernel.org/all/1672382018-18347-1-git-send-email-chensong_2000@189.cn/
Signed-off-by: Song Chen <chensong_2000@189.cn>
Reported-by: kernel test robot <lkp@intel.com>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
2022-12-30 14:33:38 +08:00
fetch_store_string_user ( unsigned long addr , void * dest , void * base )
2022-10-12 06:40:56 -04:00
{
const void __user * uaddr = ( __force const void __user * ) addr ;
int maxlen = get_loc_len ( * ( u32 * ) dest ) ;
void * __dest ;
long ret ;
if ( unlikely ( ! maxlen ) )
return - ENOMEM ;
__dest = get_loc_data ( dest , base ) ;
ret = strncpy_from_user_nofault ( __dest , uaddr , maxlen ) ;
2022-10-12 06:40:57 -04:00
set_data_loc ( ret , dest , __dest , base , maxlen ) ;
2022-10-12 06:40:56 -04:00
return ret ;
}
/*
* Fetch a null - terminated string . Caller MUST set * ( u32 * ) buf with max
* length and relative data location .
*/
static nokprobe_inline int
kernel/trace: Provide default impelentations defined in trace_probe_tmpl.h
There are 6 function definitions in trace_probe_tmpl.h, they are:
1, fetch_store_strlen
2, fetch_store_string
3, fetch_store_strlen_user
4, fetch_store_string_user
5, probe_mem_read
6, probe_mem_read_user
Every C file which includes trace_probe_tmpl.h has to implement them,
otherwise it gets warnings and errors. However, some of them are identical,
like kprobe and eprobe, as a result, there is a lot redundant code in those
2 files.
This patch would like to provide default behaviors for those functions
which kprobe and eprobe can share by just including trace_probe_kernel.h
with trace_probe_tmpl.h together.
It removes redundant code, increases readability, and more importantly,
makes it easier to introduce a new feature based on trace probe
(it's possible).
Link: https://lore.kernel.org/all/1672382018-18347-1-git-send-email-chensong_2000@189.cn/
Signed-off-by: Song Chen <chensong_2000@189.cn>
Reported-by: kernel test robot <lkp@intel.com>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
2022-12-30 14:33:38 +08:00
fetch_store_string ( unsigned long addr , void * dest , void * base )
2022-10-12 06:40:56 -04:00
{
int maxlen = get_loc_len ( * ( u32 * ) dest ) ;
void * __dest ;
long ret ;
# ifdef CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
if ( ( unsigned long ) addr < TASK_SIZE )
kernel/trace: Provide default impelentations defined in trace_probe_tmpl.h
There are 6 function definitions in trace_probe_tmpl.h, they are:
1, fetch_store_strlen
2, fetch_store_string
3, fetch_store_strlen_user
4, fetch_store_string_user
5, probe_mem_read
6, probe_mem_read_user
Every C file which includes trace_probe_tmpl.h has to implement them,
otherwise it gets warnings and errors. However, some of them are identical,
like kprobe and eprobe, as a result, there is a lot redundant code in those
2 files.
This patch would like to provide default behaviors for those functions
which kprobe and eprobe can share by just including trace_probe_kernel.h
with trace_probe_tmpl.h together.
It removes redundant code, increases readability, and more importantly,
makes it easier to introduce a new feature based on trace probe
(it's possible).
Link: https://lore.kernel.org/all/1672382018-18347-1-git-send-email-chensong_2000@189.cn/
Signed-off-by: Song Chen <chensong_2000@189.cn>
Reported-by: kernel test robot <lkp@intel.com>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
2022-12-30 14:33:38 +08:00
return fetch_store_string_user ( addr , dest , base ) ;
2022-10-12 06:40:56 -04:00
# endif
if ( unlikely ( ! maxlen ) )
return - ENOMEM ;
__dest = get_loc_data ( dest , base ) ;
/*
* Try to get string again , since the string can be changed while
* probing .
*/
ret = strncpy_from_kernel_nofault ( __dest , ( void * ) addr , maxlen ) ;
2022-10-12 06:40:57 -04:00
set_data_loc ( ret , dest , __dest , base , maxlen ) ;
2022-10-12 06:40:56 -04:00
return ret ;
}
kernel/trace: Provide default impelentations defined in trace_probe_tmpl.h
There are 6 function definitions in trace_probe_tmpl.h, they are:
1, fetch_store_strlen
2, fetch_store_string
3, fetch_store_strlen_user
4, fetch_store_string_user
5, probe_mem_read
6, probe_mem_read_user
Every C file which includes trace_probe_tmpl.h has to implement them,
otherwise it gets warnings and errors. However, some of them are identical,
like kprobe and eprobe, as a result, there is a lot redundant code in those
2 files.
This patch would like to provide default behaviors for those functions
which kprobe and eprobe can share by just including trace_probe_kernel.h
with trace_probe_tmpl.h together.
It removes redundant code, increases readability, and more importantly,
makes it easier to introduce a new feature based on trace probe
(it's possible).
Link: https://lore.kernel.org/all/1672382018-18347-1-git-send-email-chensong_2000@189.cn/
Signed-off-by: Song Chen <chensong_2000@189.cn>
Reported-by: kernel test robot <lkp@intel.com>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
2022-12-30 14:33:38 +08:00
static nokprobe_inline int
probe_mem_read_user ( void * dest , void * src , size_t size )
{
const void __user * uaddr = ( __force const void __user * ) src ;
return copy_from_user_nofault ( dest , uaddr , size ) ;
}
static nokprobe_inline int
probe_mem_read ( void * dest , void * src , size_t size )
{
# ifdef CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
if ( ( unsigned long ) src < TASK_SIZE )
return probe_mem_read_user ( dest , src , size ) ;
# endif
return copy_from_kernel_nofault ( dest , src , size ) ;
}
2022-10-12 06:40:56 -04:00
# endif /* __TRACE_PROBE_KERNEL_H_ */