From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Ostrovsky Subject: [PATCH v6 01/19] common/symbols: Export hypervisor symbols to privileged guest Date: Tue, 13 May 2014 11:53:15 -0400 Message-ID: <1399996413-1998-2-git-send-email-boris.ostrovsky@oracle.com> References: <1399996413-1998-1-git-send-email-boris.ostrovsky@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1399996413-1998-1-git-send-email-boris.ostrovsky@oracle.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: JBeulich@suse.com, kevin.tian@intel.com, dietmar.hahn@ts.fujitsu.com, suravee.suthikulpanit@amd.com Cc: keir@xen.org, andrew.cooper3@citrix.com, donald.d.dugger@intel.com, xen-devel@lists.xen.org, jun.nakajima@intel.com, boris.ostrovsky@oracle.com List-Id: xen-devel@lists.xenproject.org Export Xen's symbols as {
} triplet via new XENPF_get_symbol hypercall Signed-off-by: Boris Ostrovsky Reviewed-by: Dietmar Hahn Tested-by: Dietmar Hahn --- xen/arch/x86/platform_hypercall.c | 18 ++++++++++++ xen/arch/x86/x86_64/platform_hypercall.c | 2 ++ xen/common/symbols.c | 50 +++++++++++++++++++++++++++++++- xen/common/vsprintf.c | 2 +- xen/include/public/platform.h | 16 ++++++++++ xen/include/xen/symbols.h | 6 ++-- xen/include/xlat.lst | 1 + 7 files changed, 91 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c index 2162811..0a93037 100644 --- a/xen/arch/x86/platform_hypercall.c +++ b/xen/arch/x86/platform_hypercall.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -601,6 +602,23 @@ ret_t do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op) } break; + case XENPF_get_symbol: + { + char name[XEN_KSYM_NAME_LEN + 1]; + XEN_GUEST_HANDLE(char) nameh; + + guest_from_compat_handle(nameh, op->u.symdata.name); + + ret = xensyms_read(&op->u.symdata.symnum, &op->u.symdata.type, + &op->u.symdata.address, name); + + if ( !ret && copy_to_guest(nameh, name, strlen(name)) ) + ret = -EFAULT; + if ( !ret && __copy_field_to_guest(u_xenpf_op, op, u.symdata) ) + ret = -EFAULT; + } + break; + default: ret = -ENOSYS; break; diff --git a/xen/arch/x86/x86_64/platform_hypercall.c b/xen/arch/x86/x86_64/platform_hypercall.c index b6f380e..795837f 100644 --- a/xen/arch/x86/x86_64/platform_hypercall.c +++ b/xen/arch/x86/x86_64/platform_hypercall.c @@ -32,6 +32,8 @@ CHECK_pf_pcpu_version; CHECK_pf_enter_acpi_sleep; #undef xen_pf_enter_acpi_sleep +#define xenpf_symdata compat_pf_symdata + #define COMPAT #define _XEN_GUEST_HANDLE(t) XEN_GUEST_HANDLE(t) #define _XEN_GUEST_HANDLE_PARAM(t) XEN_GUEST_HANDLE_PARAM(t) diff --git a/xen/common/symbols.c b/xen/common/symbols.c index 45941e1..bc83f76 100644 --- a/xen/common/symbols.c +++ b/xen/common/symbols.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include #ifdef SYMBOLS_ORIGIN extern const unsigned int symbols_offsets[1]; @@ -107,7 +109,7 @@ const char *symbols_lookup(unsigned long addr, unsigned long i, low, high, mid; unsigned long symbol_end = 0; - namebuf[KSYM_NAME_LEN] = 0; + namebuf[XEN_KSYM_NAME_LEN] = 0; namebuf[0] = 0; if (!is_active_kernel_text(addr)) @@ -148,3 +150,49 @@ const char *symbols_lookup(unsigned long addr, *offset = addr - symbols_address(low); return namebuf; } + +/* + * Get symbol type information. This is encoded as a single char at the + * beginning of the symbol name. + */ +static char symbols_get_symbol_type(unsigned int off) +{ + /* + * Get just the first code, look it up in the token table, + * and return the first char from this token. + */ + return symbols_token_table[symbols_token_index[symbols_names[off + 1]]]; +} + +/* + * Symbols are most likely accessed sequentially so we remember position from + * previous read. This can help us avoid the extra call to get_symbol_offset(). + */ +static uint64_t next_symbol, next_offset; +static DEFINE_SPINLOCK(symbols_mutex); + +int xensyms_read(uint32_t *symnum, uint32_t *type, uint64_t *address, char *name) +{ + if ( *symnum > symbols_num_syms ) + return -ERANGE; + if ( *symnum == symbols_num_syms ) + return 0; + + spin_lock(&symbols_mutex); + + if ( *symnum == 0 ) + next_offset = next_symbol = 0; + if ( next_symbol != *symnum ) + /* Non-sequential access */ + next_offset = get_symbol_offset(*symnum); + + *type = symbols_get_symbol_type(next_offset); + next_offset = symbols_expand_symbol(next_offset, name); + *address = symbols_offsets[*symnum] + SYMBOLS_ORIGIN; + + next_symbol = ++*symnum; + + spin_unlock(&symbols_mutex); + + return 0; +} diff --git a/xen/common/vsprintf.c b/xen/common/vsprintf.c index 8c43282..696c3e9 100644 --- a/xen/common/vsprintf.c +++ b/xen/common/vsprintf.c @@ -276,7 +276,7 @@ static char *pointer(char *str, char *end, const char **fmt_ptr, case 'S': /* Symbol name unconditionally with offset and size */ { unsigned long sym_size, sym_offset; - char namebuf[KSYM_NAME_LEN+1]; + char namebuf[XEN_KSYM_NAME_LEN+1]; /* Advance parents fmt string, as we have consumed 's' or 'S' */ ++*fmt_ptr; diff --git a/xen/include/public/platform.h b/xen/include/public/platform.h index 053b9fa..f52448c 100644 --- a/xen/include/public/platform.h +++ b/xen/include/public/platform.h @@ -527,6 +527,21 @@ struct xenpf_core_parking { typedef struct xenpf_core_parking xenpf_core_parking_t; DEFINE_XEN_GUEST_HANDLE(xenpf_core_parking_t); +#define XENPF_get_symbol 61 +#define XEN_KSYM_NAME_LEN 127 +struct xenpf_symdata { + /* IN variables */ + uint32_t symnum; + + /* OUT variables */ + uint32_t type; + uint64_t address; + + XEN_GUEST_HANDLE(char) name; +}; +typedef struct xenpf_symdata xenpf_symdata_t; +DEFINE_XEN_GUEST_HANDLE(xenpf_symdata_t); + /* * ` enum neg_errnoval * ` HYPERVISOR_platform_op(const struct xen_platform_op*); @@ -553,6 +568,7 @@ struct xen_platform_op { struct xenpf_cpu_hotadd cpu_add; struct xenpf_mem_hotadd mem_add; struct xenpf_core_parking core_parking; + struct xenpf_symdata symdata; uint8_t pad[128]; } u; }; diff --git a/xen/include/xen/symbols.h b/xen/include/xen/symbols.h index 87cd77d..3017449 100644 --- a/xen/include/xen/symbols.h +++ b/xen/include/xen/symbols.h @@ -2,8 +2,7 @@ #define _XEN_SYMBOLS_H #include - -#define KSYM_NAME_LEN 127 +#include /* Lookup an address. */ const char *symbols_lookup(unsigned long addr, @@ -11,4 +10,7 @@ const char *symbols_lookup(unsigned long addr, unsigned long *offset, char *namebuf); +int xensyms_read(uint32_t *symnum, uint32_t *type, + uint64_t *address, char *name); + #endif /*_XEN_SYMBOLS_H*/ diff --git a/xen/include/xlat.lst b/xen/include/xlat.lst index 9a35dd7..c8fafef 100644 --- a/xen/include/xlat.lst +++ b/xen/include/xlat.lst @@ -86,6 +86,7 @@ ? processor_px platform.h ! psd_package platform.h ? xenpf_enter_acpi_sleep platform.h +! xenpf_symdata platform.h ? xenpf_pcpuinfo platform.h ? xenpf_pcpu_version platform.h ! sched_poll sched.h -- 1.8.1.4