From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: [PATCH v11 for-xen-4.5 01/20] common/symbols: Export hypervisor symbols to privileged guest Date: Tue, 23 Sep 2014 10:28:45 -0400 Message-ID: <20140923142845.GD3007@laptop.dumpdata.com> References: <1411430281-6132-1-git-send-email-boris.ostrovsky@oracle.com> <1411430281-6132-2-git-send-email-boris.ostrovsky@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <1411430281-6132-2-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: Boris Ostrovsky Cc: kevin.tian@intel.com, keir@xen.org, jbeulich@suse.com, jun.nakajima@intel.com, andrew.cooper3@citrix.com, tim@xen.org, dietmar.hahn@ts.fujitsu.com, xen-devel@lists.xen.org, Aravind.Gopalakrishnan@amd.com, suravee.suthikulpanit@amd.com List-Id: xen-devel@lists.xenproject.org On Mon, Sep 22, 2014 at 07:57:42PM -0400, Boris Ostrovsky wrote: > 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 Reviewed-by: Konrad Rzeszutek Wilk > --- > xen/arch/x86/platform_hypercall.c | 33 ++++++++++++++++++++++++ > xen/common/symbols.c | 54 +++++++++++++++++++++++++++++++++++++++ > xen/include/public/platform.h | 19 ++++++++++++++ > xen/include/xen/symbols.h | 3 +++ > xen/include/xlat.lst | 1 + > 5 files changed, 110 insertions(+) > > diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c > index 2162811..68bc6d9 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,38 @@ ret_t do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op) > } > break; > > + case XENPF_get_symbol: > + { > + static char name[KSYM_NAME_LEN + 1]; /* protected by xenpf_lock */ > + XEN_GUEST_HANDLE(char) nameh; > + uint32_t namelen, copylen; > + > + 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); > + > + namelen = strlen(name) + 1; > + > + if ( namelen > op->u.symdata.namelen ) > + { > + /* Caller's buffer is too small for the whole string */ > + if ( op->u.symdata.namelen ) > + name[op->u.symdata.namelen] = '\0'; > + copylen = op->u.symdata.namelen; > + } > + else > + copylen = namelen; > + > + op->u.symdata.namelen = namelen; > + > + if ( !ret && copy_to_guest(nameh, name, copylen) ) > + 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/common/symbols.c b/xen/common/symbols.c > index bc2fde6..2c0942d 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]; > @@ -148,3 +150,55 @@ 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]]]; > +} > + > +int xensyms_read(uint32_t *symnum, char *type, > + uint64_t *address, char *name) > +{ > + /* > + * 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); > + > + if ( *symnum > symbols_num_syms ) > + return -ERANGE; > + if ( *symnum == symbols_num_syms ) > + { > + /* No more symbols */ > + name[0] = '\0'; > + 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/include/public/platform.h b/xen/include/public/platform.h > index 053b9fa..4f21b17 100644 > --- a/xen/include/public/platform.h > +++ b/xen/include/public/platform.h > @@ -527,6 +527,24 @@ 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 > +struct xenpf_symdata { > + /* IN/OUT variables */ > + uint32_t namelen; /* IN: size of name buffer */ > + /* OUT: strlen(name) of hypervisor symbol (may be */ > + /* larger than what's been copied to guest) */ > + uint32_t symnum; /* IN: Symbol to read */ > + /* OUT: Next available symbol. If same as IN then */ > + /* we reached the end */ > + > + /* OUT variables */ > + char type; > + XEN_GUEST_HANDLE(char) name; > + uint64_t address; > +}; > +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 +571,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..1fa0537 100644 > --- a/xen/include/xen/symbols.h > +++ b/xen/include/xen/symbols.h > @@ -11,4 +11,7 @@ const char *symbols_lookup(unsigned long addr, > unsigned long *offset, > char *namebuf); > > +int xensyms_read(uint32_t *symnum, char *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 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel