From aeb73b7040f46c50a50b17ae94d69df2e7a04b5a Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 26 Jun 2017 10:14:45 -0700 Subject: [PATCH] Add __label__ for each deref_fault in tapsets When adding our own error handling, privatize the label. --- tapset/arm/registers.stp | 11 +++++------ tapset/i386/registers.stp | 11 +++++------ tapset/linux/conversions-guru.stp | 7 +++++++ tapset/linux/conversions.stp | 9 +++++++++ tapset/s390/registers.stp | 11 +++++------ tapset/uconversions-guru.stp | 7 +++++++ tapset/uconversions.stp | 2 ++ tapset/x86_64/registers.stp | 12 +++++------- 8 files changed, 45 insertions(+), 25 deletions(-) diff --git a/tapset/arm/registers.stp b/tapset/arm/registers.stp index 63e25e778..b28dd6292 100644 --- a/tapset/arm/registers.stp +++ b/tapset/arm/registers.stp @@ -122,6 +122,7 @@ function u_register:long (name:string) { function _stp_get_stack_nth:long (n:long) %{ /* pure */ + __label__ deref_fault; unsigned int n = (unsigned int)STAP_ARG_n; struct pt_regs *regs; long *addr; @@ -153,13 +154,11 @@ function _stp_get_stack_nth:long (n:long) STAP_RETVALUE = kread(addr); return; - if (0) { deref_fault: /* branched to from kread() */ - snprintf(CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer), - "kernel fault at %#lx accessing stack arg(%d)", - (unsigned long)addr, n); - CONTEXT->last_error = CONTEXT->error_buffer; - } + snprintf(CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer), + "kernel fault at %#lx accessing stack arg(%d)", + (unsigned long)addr, n); + CONTEXT->last_error = CONTEXT->error_buffer; %} diff --git a/tapset/i386/registers.stp b/tapset/i386/registers.stp index aa5fd0301..af792b40a 100644 --- a/tapset/i386/registers.stp +++ b/tapset/i386/registers.stp @@ -128,6 +128,7 @@ function u_register:long (name:string) { /* Return the value of function arg #argnum (1=first arg) as a signed value. */ function _stp_arg:long (argnum:long) %{ /* pure */ + __label__ deref_fault; long val; int n, nr_regargs, result; struct pt_regs *regs; @@ -184,13 +185,11 @@ bad_argnum: CONTEXT->last_error = CONTEXT->error_buffer; return; - if (0) { deref_fault: /* branched to from kread() */ - snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer), - "kernel fault at %#lx accessing arg(%lld)", val, - STAP_ARG_argnum); - CONTEXT->last_error = CONTEXT->error_buffer; - } + snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer), + "kernel fault at %#lx accessing arg(%lld)", val, + STAP_ARG_argnum); + CONTEXT->last_error = CONTEXT->error_buffer; %} /* Return the value of function arg #argnum as a signed int. */ diff --git a/tapset/linux/conversions-guru.stp b/tapset/linux/conversions-guru.stp index 60e1440da..79fd4b2a5 100644 --- a/tapset/linux/conversions-guru.stp +++ b/tapset/linux/conversions-guru.stp @@ -16,6 +16,7 @@ * Requires the use of guru mode (-g). */ function set_kernel_string (addr:long, val:string) %{ /* guru */ + __label__ deref_fault; store_kderef_string (STAP_ARG_val, STAP_ARG_addr, MAXSTRINGLEN); if (0) { deref_fault: /* branched to from store_deref_string() */ @@ -36,6 +37,7 @@ deref_fault: /* branched to from store_deref_string() */ * Requires the use of guru mode (-g). */ function set_kernel_string_n (addr:long, n:long, val:string) %{ /* guru */ + __label__ deref_fault; int64_t len = clamp_t(int64_t, STAP_ARG_n + 1, 1, MAXSTRINGLEN); store_kderef_string (STAP_ARG_val, STAP_ARG_addr, len); if (0) { @@ -56,6 +58,7 @@ deref_fault: /* branched to from store_deref_string() */ * Requires the use of guru mode (-g). */ function set_kernel_long (addr:long, val:long) %{ /* guru */ + __label__ deref_fault; kwrite((long *) (intptr_t) STAP_ARG_addr, STAP_ARG_val); if (0) { deref_fault: /* branched to from kwrite() */ @@ -75,6 +78,7 @@ deref_fault: /* branched to from kwrite() */ * Requires the use of guru mode (-g). */ function set_kernel_int (addr:long, val:long) %{ /* guru */ + __label__ deref_fault; kwrite((int *) (intptr_t) STAP_ARG_addr, STAP_ARG_val); if (0) { deref_fault: /* branched to from kwrite() */ @@ -94,6 +98,7 @@ deref_fault: /* branched to from kwrite() */ * Requires the use of guru mode (-g). */ function set_kernel_short (addr:long, val:long) %{ /* guru */ + __label__ deref_fault; kwrite((short *) (intptr_t) STAP_ARG_addr, STAP_ARG_val); if (0) { deref_fault: /* branched to from kwrite() */ @@ -113,6 +118,7 @@ deref_fault: /* branched to from kwrite() */ * Requires the use of guru mode (-g). */ function set_kernel_char (addr:long, val:long) %{ /* guru */ + __label__ deref_fault; kwrite((char *) (intptr_t) STAP_ARG_addr, STAP_ARG_val); if (0) { deref_fault: /* branched to from kwrite() */ @@ -132,6 +138,7 @@ deref_fault: /* branched to from kwrite() */ * Requires the use of guru mode (-g). */ function set_kernel_pointer (addr:long, val:long) %{ /* guru */ + __label__ deref_fault; kwrite((void **) (uintptr_t) STAP_ARG_addr, (uintptr_t)STAP_ARG_val); if (0) { deref_fault: /* branched to from kwrite() */ diff --git a/tapset/linux/conversions.stp b/tapset/linux/conversions.stp index ca03afbcb..c3cc008b2 100644 --- a/tapset/linux/conversions.stp +++ b/tapset/linux/conversions.stp @@ -16,6 +16,7 @@ * copy fault. */ function kernel_string:string (addr:long) %{ /* pure */ + __label__ deref_fault; char *destination = STAP_RETVALUE; kderef_string (destination, STAP_ARG_addr, MAXSTRINGLEN); if (0) { @@ -78,6 +79,7 @@ function kernel_string_quoted:string (addr:long) * given kernel memory address. Reports an error on string copy fault. */ function kernel_string_n:string (addr:long, n:long) %{ /* pure */ + __label__ deref_fault; char *destination = STAP_RETVALUE; int64_t len = clamp_t(int64_t, STAP_ARG_n + 1, 1, MAXSTRINGLEN); kderef_string (destination, STAP_ARG_addr, len); @@ -98,6 +100,7 @@ deref_fault: /* branched to from deref_string() */ * string copy fault or conversion error. */ function kernel_string_utf32:string (addr:long) %{ /* pure */ + __label__ deref_fault; int rc = 0, len = MAXSTRINGLEN; uint32_t c32, *source = (uint32_t*)(intptr_t)STAP_ARG_addr; char *destination = STAP_RETVALUE; @@ -162,6 +165,7 @@ function kernel_string_quoted_utf32:string (addr:long) { * string copy fault or conversion error. */ function kernel_string_utf16:string (addr:long) %{ /* pure */ + __label__ deref_fault; int rc = 0, len = MAXSTRINGLEN; uint32_t c32; uint16_t c16low, *source = (uint16_t*)(intptr_t)STAP_ARG_addr; @@ -240,6 +244,7 @@ function kernel_string_quoted_utf16:string (addr:long) { * Reports an error when reading from the given address fails. */ function kernel_long:long (addr:long) %{ /* pure */ + __label__ deref_fault; STAP_RETVALUE = kread((long *) (intptr_t) STAP_ARG_addr); if (0) { deref_fault: /* branched to from kread() */ @@ -257,6 +262,7 @@ deref_fault: /* branched to from kread() */ * Reports an error when reading from the given address fails. */ function kernel_int:long (addr:long) %{ /* pure */ + __label__ deref_fault; STAP_RETVALUE = kread((int *) (intptr_t) STAP_ARG_addr); if (0) { deref_fault: /* branched to from kread() */ @@ -274,6 +280,7 @@ deref_fault: /* branched to from kread() */ * Reports an error when reading from the given address fails. */ function kernel_short:long (addr:long) %{ /* pure */ + __label__ deref_fault; STAP_RETVALUE = kread((short *) (intptr_t) STAP_ARG_addr); if (0) { deref_fault: /* branched to from kread() */ @@ -291,6 +298,7 @@ deref_fault: /* branched to from kread() */ * Reports an error when reading from the given address fails. */ function kernel_char:long (addr:long) %{ /* pure */ + __label__ deref_fault; STAP_RETVALUE = kread((char *) (intptr_t) STAP_ARG_addr); if (0) { deref_fault: /* branched to from kread() */ @@ -309,6 +317,7 @@ deref_fault: /* branched to from kread() */ * fails. */ function kernel_pointer:long (addr:long) %{ /* pure */ + __label__ deref_fault; STAP_RETVALUE = (uintptr_t) kread((void **) (uintptr_t) STAP_ARG_addr); if (0) { deref_fault: /* branched to from kread() */ diff --git a/tapset/s390/registers.stp b/tapset/s390/registers.stp index 733d8daaf..b3986cdd9 100644 --- a/tapset/s390/registers.stp +++ b/tapset/s390/registers.stp @@ -47,6 +47,7 @@ _stp_regs_within_kernel_stack(struct pt_regs *regs, unsigned long addr) */ function _stp_get_kernel_stack_param:long(n:long) %{ + __label__ deref_fault; unsigned long addr; struct pt_regs *regs; @@ -66,13 +67,11 @@ function _stp_get_kernel_stack_param:long(n:long) STAP_RETVALUE = kread((unsigned long *)addr); return; - if (0) { deref_fault: /* branched to from kread() */ - snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer), - "kernel fault at %#lx accessing stack param(%d)", - addr, (int)STAP_ARG_n); - CONTEXT->last_error = CONTEXT->error_buffer; - } + snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer), + "kernel fault at %#lx accessing stack param(%d)", + addr, (int)STAP_ARG_n); + CONTEXT->last_error = CONTEXT->error_buffer; %} probe init { diff --git a/tapset/uconversions-guru.stp b/tapset/uconversions-guru.stp index 9725a0ffe..8b6a4e07b 100644 --- a/tapset/uconversions-guru.stp +++ b/tapset/uconversions-guru.stp @@ -8,6 +8,7 @@ * Requires the use of guru mode (-g). */ function set_user_string (addr:long, val:string) %{ /* guru */ + __label__ deref_fault; store_uderef_string (STAP_ARG_val, STAP_ARG_addr, MAXSTRINGLEN); if (0) { deref_fault: /* branched to from store_deref_string() */ @@ -28,6 +29,7 @@ deref_fault: /* branched to from store_deref_string() */ * Requires the use of guru mode (-g). */ function set_user_string_n (addr:long, n:long, val:string) %{ /* guru */ + __label__ deref_fault; int64_t len = clamp_t(int64_t, STAP_ARG_n + 1, 1, MAXSTRINGLEN); store_uderef_string (STAP_ARG_val, STAP_ARG_addr, len); if (0) { @@ -48,6 +50,7 @@ deref_fault: /* branched to from store_deref_string() */ * Requires the use of guru mode (-g). */ function set_user_long (addr:long, val:long) %{ /* guru */ + __label__ deref_fault; uwrite((long *) (intptr_t) STAP_ARG_addr, STAP_ARG_val); if (0) { deref_fault: /* branched to from uwrite() */ @@ -67,6 +70,7 @@ deref_fault: /* branched to from uwrite() */ * Requires the use of guru mode (-g). */ function set_user_int (addr:long, val:long) %{ /* guru */ + __label__ deref_fault; uwrite((int *) (intptr_t) STAP_ARG_addr, STAP_ARG_val); if (0) { deref_fault: /* branched to from uwrite() */ @@ -86,6 +90,7 @@ deref_fault: /* branched to from uwrite() */ * Requires the use of guru mode (-g). */ function set_user_short (addr:long, val:long) %{ /* guru */ + __label__ deref_fault; uwrite((short *) (intptr_t) STAP_ARG_addr, STAP_ARG_val); if (0) { deref_fault: /* branched to from uwrite() */ @@ -105,6 +110,7 @@ deref_fault: /* branched to from uwrite() */ * Requires the use of guru mode (-g). */ function set_user_char (addr:long, val:long) %{ /* guru */ + __label__ deref_fault; uwrite((char *) (intptr_t) STAP_ARG_addr, STAP_ARG_val); if (0) { deref_fault: /* branched to from uwrite() */ @@ -124,6 +130,7 @@ deref_fault: /* branched to from uwrite() */ * Requires the use of guru mode (-g). */ function set_user_pointer (addr:long, val:long) %{ /* guru */ + __label__ deref_fault; uwrite((void **) (uintptr_t) STAP_ARG_addr, (uintptr_t)STAP_ARG_val); if (0) { deref_fault: /* branched to from uwrite() */ diff --git a/tapset/uconversions.stp b/tapset/uconversions.stp index 0d7ec03c3..6ad9ab5e5 100644 --- a/tapset/uconversions.stp +++ b/tapset/uconversions.stp @@ -307,6 +307,7 @@ function user_string_n2_quoted:string (addr:long, inlen:long, outlen:long) { * string copy fault or conversion error. */ function user_string_utf32:string (addr:long) %{ /* pure */ /* myproc-unprivileged */ + __label__ deref_fault; int rc = 0, len = MAXSTRINGLEN; uint32_t c32, *source = (uint32_t*)(intptr_t)STAP_ARG_addr; char *destination = STAP_RETVALUE; @@ -373,6 +374,7 @@ function user_string_quoted_utf32:string (addr:long) { * string copy fault or conversion error. */ function user_string_utf16:string (addr:long) %{ /* pure */ /* myproc-unprivileged */ + __label__ deref_fault; int rc = 0, len = MAXSTRINGLEN; uint32_t c32; uint16_t c16low, *source = (uint16_t*)(intptr_t)STAP_ARG_addr; diff --git a/tapset/x86_64/registers.stp b/tapset/x86_64/registers.stp index c1aff82d7..864983bd9 100644 --- a/tapset/x86_64/registers.stp +++ b/tapset/x86_64/registers.stp @@ -115,7 +115,7 @@ function _stp_arg:long (argnum:long, sign_extend:long, truncate:long) function _stp_arg2:long (argnum:long, sign_extend:long, truncate:long, force64:long) %{ /* pure */ - + __label__ deref_fault; long val; struct pt_regs *regs; int result, n, nr_regargs; @@ -186,13 +186,11 @@ bad_argnum: CONTEXT->last_error = CONTEXT->error_buffer; return; - if (0) { deref_fault: /* branched to from kread() */ - snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer), - "kernel fault at %#lx accessing arg(%lld)", val, - STAP_ARG_argnum); - CONTEXT->last_error = CONTEXT->error_buffer; - } + snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer), + "kernel fault at %#lx accessing arg(%lld)", val, + STAP_ARG_argnum); + CONTEXT->last_error = CONTEXT->error_buffer; %} function probing_32bit_app:long() %{ /* pure */ -- 2.43.5