From: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> To: <linux-kernel@vger.kernel.org> Cc: linuxppc-dev@ozlabs.org, Stephane Eranian <eranian@google.com>, Michael Ellerman <michaele@au1.ibm.com>, Paul Mackerras <paulus@samba.org>, Anshuman Khandual <khandual@linux.vnet.ibm.com> Subject: [PATCH 4/8][v4] powerpc/perf: Define big-endian version of perf_mem_data_src Date: Fri, 13 Sep 2013 17:49:11 -0700 [thread overview] Message-ID: <1379119755-21025-5-git-send-email-sukadev@linux.vnet.ibm.com> (raw) In-Reply-To: <1379119755-21025-1-git-send-email-sukadev@linux.vnet.ibm.com> perf_mem_data_src is an union that is initialized via the ->val field and accessed via the bitmap fields. For this to work on big endian platforms, we also need a big-endian represenation of perf_mem_data_src. Cc: Stephane Eranian <eranian@google.com> Cc: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> --- Changelog [v2]: - [Vince Weaver, Michael Ellerman] No __KERNEL__ in uapi headers. include/uapi/linux/perf_event.h | 58 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h index 62c25a2..7a4f9bb 100644 --- a/include/uapi/linux/perf_event.h +++ b/include/uapi/linux/perf_event.h @@ -19,6 +19,50 @@ #include <asm/byteorder.h> /* + * Kernel and userspace check for endianness in incompatible ways. + * In user space, <endian.h> defines both __BIG_ENDIAN and __LITTLE_ENDIAN + * but sets __BYTE_ORDER to one or the other. So user space uses checks are: + * + * #if __BYTE_ORDER == __LITTLE_ENDIAN + * + * In the kernel, __BYTE_ORDER is undefined, so using the above check doesn't + * work. Further, kernel code assumes that exactly one of __BIG_ENDIAN and + * __LITTLE_ENDIAN is defined. So the kernel checks are like: + * + * #if defined(__LITTLE_ENDIAN) + * + * But we can't use that check in user space since __LITTLE_ENDIAN (and + * __BIG_ENDIAN) are always defined. + * + * Since some perf data structures depend on endianness _and_ are shared + * between kernel and user, perf needs its own notion of endian macros (at + * least until user and kernel endian checks converge). + */ +#define __PERF_LE 1234 +#define __PERF_BE 4321 + +#if defined(__BYTE_ORDER) + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define __PERF_BYTE_ORDER __PERF_LE +#elif __BYTE_ORDER == __BIG_ENDIAN +#define __PERF_BYTE_ORDER __PERF_BE +#endif + +#else /* __BYTE_ORDER */ + +#if defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN) +#error "Cannot determine endianness" +#elif defined(__LITTLE_ENDIAN) +#define __PERF_BYTE_ORDER __PERF_LE +#elif defined(__BIG_ENDIAN) +#define __PERF_BYTE_ORDER __PERF_BE +#endif + + +#endif /* __BYTE_ORDER */ + +/* * User-space ABI bits: */ @@ -659,6 +703,7 @@ enum perf_callchain_context { #define PERF_FLAG_FD_OUTPUT (1U << 1) #define PERF_FLAG_PID_CGROUP (1U << 2) /* pid=cgroup id, per-cpu mode only */ +#if __PERF_BYTE_ORDER == __PERF_LE union perf_mem_data_src { __u64 val; struct { @@ -670,6 +715,19 @@ union perf_mem_data_src { mem_rsvd:31; }; }; +#elif __PERF_BYTE_ORDER == __PERF_BE +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_rsvd:31, + mem_dtlb:7, /* tlb access */ + mem_lock:2, /* lock instr */ + mem_snoop:5, /* snoop mode */ + mem_lvl:14, /* memory hierarchy level */ + mem_op:5; /* type of opcode */ + }; +}; +#endif /* type of opcode (load/store/prefetch,code) */ #define PERF_MEM_OP_NA 0x01 /* not available */ -- 1.7.9.5
WARNING: multiple messages have this Message-ID (diff)
From: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> To: <linux-kernel@vger.kernel.org> Cc: linuxppc-dev@ozlabs.org, Paul Mackerras <paulus@samba.org>, Michael Ellerman <michaele@au1.ibm.com>, Stephane Eranian <eranian@google.com>, Anshuman Khandual <khandual@linux.vnet.ibm.com> Subject: [PATCH 4/8][v4] powerpc/perf: Define big-endian version of perf_mem_data_src Date: Fri, 13 Sep 2013 17:49:11 -0700 [thread overview] Message-ID: <1379119755-21025-5-git-send-email-sukadev@linux.vnet.ibm.com> (raw) In-Reply-To: <1379119755-21025-1-git-send-email-sukadev@linux.vnet.ibm.com> perf_mem_data_src is an union that is initialized via the ->val field and accessed via the bitmap fields. For this to work on big endian platforms, we also need a big-endian represenation of perf_mem_data_src. Cc: Stephane Eranian <eranian@google.com> Cc: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> --- Changelog [v2]: - [Vince Weaver, Michael Ellerman] No __KERNEL__ in uapi headers. include/uapi/linux/perf_event.h | 58 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h index 62c25a2..7a4f9bb 100644 --- a/include/uapi/linux/perf_event.h +++ b/include/uapi/linux/perf_event.h @@ -19,6 +19,50 @@ #include <asm/byteorder.h> /* + * Kernel and userspace check for endianness in incompatible ways. + * In user space, <endian.h> defines both __BIG_ENDIAN and __LITTLE_ENDIAN + * but sets __BYTE_ORDER to one or the other. So user space uses checks are: + * + * #if __BYTE_ORDER == __LITTLE_ENDIAN + * + * In the kernel, __BYTE_ORDER is undefined, so using the above check doesn't + * work. Further, kernel code assumes that exactly one of __BIG_ENDIAN and + * __LITTLE_ENDIAN is defined. So the kernel checks are like: + * + * #if defined(__LITTLE_ENDIAN) + * + * But we can't use that check in user space since __LITTLE_ENDIAN (and + * __BIG_ENDIAN) are always defined. + * + * Since some perf data structures depend on endianness _and_ are shared + * between kernel and user, perf needs its own notion of endian macros (at + * least until user and kernel endian checks converge). + */ +#define __PERF_LE 1234 +#define __PERF_BE 4321 + +#if defined(__BYTE_ORDER) + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define __PERF_BYTE_ORDER __PERF_LE +#elif __BYTE_ORDER == __BIG_ENDIAN +#define __PERF_BYTE_ORDER __PERF_BE +#endif + +#else /* __BYTE_ORDER */ + +#if defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN) +#error "Cannot determine endianness" +#elif defined(__LITTLE_ENDIAN) +#define __PERF_BYTE_ORDER __PERF_LE +#elif defined(__BIG_ENDIAN) +#define __PERF_BYTE_ORDER __PERF_BE +#endif + + +#endif /* __BYTE_ORDER */ + +/* * User-space ABI bits: */ @@ -659,6 +703,7 @@ enum perf_callchain_context { #define PERF_FLAG_FD_OUTPUT (1U << 1) #define PERF_FLAG_PID_CGROUP (1U << 2) /* pid=cgroup id, per-cpu mode only */ +#if __PERF_BYTE_ORDER == __PERF_LE union perf_mem_data_src { __u64 val; struct { @@ -670,6 +715,19 @@ union perf_mem_data_src { mem_rsvd:31; }; }; +#elif __PERF_BYTE_ORDER == __PERF_BE +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_rsvd:31, + mem_dtlb:7, /* tlb access */ + mem_lock:2, /* lock instr */ + mem_snoop:5, /* snoop mode */ + mem_lvl:14, /* memory hierarchy level */ + mem_op:5; /* type of opcode */ + }; +}; +#endif /* type of opcode (load/store/prefetch,code) */ #define PERF_MEM_OP_NA 0x01 /* not available */ -- 1.7.9.5
next prev parent reply other threads:[~2013-09-14 0:51 UTC|newest] Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top 2013-09-14 0:49 [PATCH 0/8][v4] powerpc/perf: Export memory hierarchy level in Power7/8 Sukadev Bhattiprolu 2013-09-14 0:49 ` Sukadev Bhattiprolu 2013-09-14 0:49 ` [PATCH 1/8][v4] powerpc/perf: Rename Power8 macros to start with PME Sukadev Bhattiprolu 2013-09-14 0:49 ` Sukadev Bhattiprolu 2013-09-18 5:24 ` Anshuman Khandual 2013-09-18 5:24 ` Anshuman Khandual 2013-09-14 0:49 ` [PATCH 2/8][v4] powerpc/perf: Export Power8 generic events in sysfs Sukadev Bhattiprolu 2013-09-14 0:49 ` Sukadev Bhattiprolu 2013-09-14 0:49 ` [PATCH 3/8][v4] powerpc/perf: Add PM_MRK_GRP_CMPL event to sysfs Sukadev Bhattiprolu 2013-09-14 0:49 ` Sukadev Bhattiprolu 2013-09-14 0:49 ` Sukadev Bhattiprolu [this message] 2013-09-14 0:49 ` [PATCH 4/8][v4] powerpc/perf: Define big-endian version of perf_mem_data_src Sukadev Bhattiprolu 2013-09-14 0:49 ` [PATCH 5/8][v4] powerpc/perf: Export Power8 memory hierarchy info to user space Sukadev Bhattiprolu 2013-09-14 0:49 ` Sukadev Bhattiprolu 2013-09-14 0:49 ` [PATCH 6/8][v4] powerpc: Rename branch_opcode() to instr_opcode() Sukadev Bhattiprolu 2013-09-14 0:49 ` Sukadev Bhattiprolu 2013-09-14 0:49 ` [PATCH 7/8][v4] power: implement is_instr_load_store() Sukadev Bhattiprolu 2013-09-14 0:49 ` Sukadev Bhattiprolu 2013-09-16 12:22 ` Tom Musta 2013-09-14 0:49 ` [PATCH 8/8][v4] powerpc/perf: Export Power7 memory hierarchy info to user space Sukadev Bhattiprolu 2013-09-14 0:49 ` Sukadev Bhattiprolu 2013-09-18 10:47 ` Anshuman Khandual 2013-09-18 10:47 ` Anshuman Khandual 2013-09-19 8:41 ` Anshuman Khandual 2013-09-19 8:41 ` Anshuman Khandual 2013-09-24 22:30 ` Sukadev Bhattiprolu 2013-09-24 22:30 ` Sukadev Bhattiprolu
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1379119755-21025-5-git-send-email-sukadev@linux.vnet.ibm.com \ --to=sukadev@linux.vnet.ibm.com \ --cc=eranian@google.com \ --cc=khandual@linux.vnet.ibm.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linuxppc-dev@ozlabs.org \ --cc=michaele@au1.ibm.com \ --cc=paulus@samba.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.