From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16752 invoked by alias); 29 Jun 2007 13:16:43 -0000 Received: (qmail 16736 invoked by uid 22791); 29 Jun 2007 13:16:43 -0000 X-Spam-Check-By: sourceware.org Received: from mtagate2.de.ibm.com (HELO mtagate2.de.ibm.com) (195.212.29.151) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 29 Jun 2007 13:16:39 +0000 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate2.de.ibm.com (8.13.8/8.13.8) with ESMTP id l5TDGaga126180 for ; Fri, 29 Jun 2007 13:16:36 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v8.3) with ESMTP id l5TDGajG2175136 for ; Fri, 29 Jun 2007 15:16:36 +0200 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id l5TDGaJ2018360 for ; Fri, 29 Jun 2007 15:16:36 +0200 Received: from [9.152.198.78] (dyn-9-152-198-78.boeblingen.de.ibm.com [9.152.198.78]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id l5TDGaLC018357 for ; Fri, 29 Jun 2007 15:16:36 +0200 Subject: [patch] s390: add hwcaps support. From: Martin Schwidefsky Reply-To: schwidefsky@de.ibm.com To: Glibc hackers Content-Type: text/plain Date: Fri, 29 Jun 2007 13:16:00 -0000 Message-Id: <1183123120.28897.12.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.10.2 Content-Transfer-Encoding: 7bit Mailing-List: contact libc-hacker-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sourceware.org X-SW-Source: 2007-06/txt/msg00020.txt.bz2 Hi, the s390 hwcaps support for the kernel is upstream since May, this patch adds the glibc support for it. There are 4 platforms and 7 capabilities: "g5" : for machine type 9672 "z900" : for machine type 2064 and 2066 "z990" : for machine type 2084 and 2086 "z9-109": for machine type 2094 HWCAP_S390_ESAN3 / "esan3" : instructions named N3, "backported" to esa-mode HWCAP_S390_ZARCH / "zarch" : z/Architecture mode is active HWCAP_S390_STFLE / "stfle" : store-facility-list-extended facility is installed HWCAP_S390_MSA / "msa" : message-security assist is installed HWCAP_S390_LDISP / "ldisp" : long-displacement facility is installed HWCAP_S390_EIMM / "eimm" : extended-immediate facility is installed HWCAP_S390_DFP / "dfp" : decimal-floating-point facility is installed -- blue skies, Martin. "Reality continues to ruin my life." - Calvin. --- 2007-06-29 Martin Schwidefsky * sysdeps/s390/dl-procinfo.c: New file. * sysdeps/s390/dl-procinfo.h: New file. * sysdeps/unix/sysv/linux/s390/dl-procinfo.h: New file. diff -urpN libc/sysdeps/s390/dl-procinfo.c libc-s390/sysdeps/s390/dl-procinfo.c --- libc/sysdeps/s390/dl-procinfo.c 1970-01-01 01:00:00.000000000 +0100 +++ libc-s390/sysdeps/s390/dl-procinfo.c 2006-07-12 16:29:59.000000000 +0200 @@ -0,0 +1,80 @@ +/* Data for s390 version of processor capability information. + Copyright (C) 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Martin Schwidefsky , 2006. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* This information must be kept in sync with the _DL_HWCAP_COUNT and + _DL_PLATFORM_COUNT definitions in procinfo.h. + + If anything should be added here check whether the size of each string + is still ok with the given array size. + + All the #ifdefs in the definitions are quite irritating but + necessary if we want to avoid duplicating the information. There + are three different modes: + + - PROCINFO_DECL is defined. This means we are only interested in + declarations. + + - PROCINFO_DECL is not defined: + + + if SHARED is defined the file is included in an array + initializer. The .element = { ... } syntax is needed. + + + if SHARED is not defined a normal array initialization is + needed. + */ + +#ifndef PROCINFO_CLASS +# define PROCINFO_CLASS +#endif + +#if !defined PROCINFO_DECL && defined SHARED + ._dl_s390_cap_flags +#else +PROCINFO_CLASS const char _dl_s390_cap_flags[7][6] +#endif +#ifndef PROCINFO_DECL += { + "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp" + } +#endif +#if !defined SHARED || defined PROCINFO_DECL +; +#else +, +#endif + +#if !defined PROCINFO_DECL && defined SHARED + ._dl_s390_platforms +#else +PROCINFO_CLASS const char _dl_s390_platforms[4][7] +#endif +#ifndef PROCINFO_DECL += { + "g5", "z900", "z990", "z9-109" + } +#endif +#if !defined SHARED || defined PROCINFO_DECL +; +#else +, +#endif + +#undef PROCINFO_DECL +#undef PROCINFO_CLASS diff -urpN libc/sysdeps/s390/dl-procinfo.h libc-s390/sysdeps/s390/dl-procinfo.h --- libc/sysdeps/s390/dl-procinfo.h 1970-01-01 01:00:00.000000000 +0100 +++ libc-s390/sysdeps/s390/dl-procinfo.h 2006-07-12 16:28:40.000000000 +0200 @@ -0,0 +1,99 @@ +/* s390 version of processor capability information handling macros. + Copyright (C) 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Martin Schwidefsky , 2006. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _DL_PROCINFO_H +#define _DL_PROCINFO_H 1 +#include + +#define _DL_HWCAP_COUNT 7 + +#define _DL_PLATFORMS_COUNT 4 + +/* The kernel provides up to 32 capability bits with elf_hwcap. */ +#define _DL_FIRST_PLATFORM 32 +/* Mask to filter out platforms. */ +#define _DL_HWCAP_PLATFORM (((1ULL << _DL_PLATFORMS_COUNT) - 1) \ + << _DL_FIRST_PLATFORM) + +/* Hardware capablity bit numbers are derived directly from the + facility indications as stored by the "store facility list" (STFL) + instruction. */ + +enum +{ + HWCAP_S390_ESAN3 = 1 << 0, + HWCAP_S390_ZARCH = 1 << 1, + HWCAP_S390_STFLE = 1 << 2, + HWCAP_S390_MSA = 1 << 3, + HWCAP_S390_LDISP = 1 << 4, + HWCAP_S390_EIMM = 1 << 5, + HWCAP_S390_DFP = 1 << 6, +}; + +#define HWCAP_IMPORTANT (HWCAP_S390_ZARCH | HWCAP_S390_LDISP \ + | HWCAP_S390_EIMM | HWCAP_S390_DFP) + +/* We cannot provide a general printing function. */ +#define _dl_procinfo(word) -1 + +static inline const char * +__attribute__ ((unused)) +_dl_hwcap_string (int idx) +{ + return GLRO(dl_s390_cap_flags)[idx]; +}; + +static inline const char * +__attribute__ ((unused)) +_dl_platform_string (int idx) +{ + return GLRO(dl_s390_platforms)[idx - _DL_FIRST_PLATFORM]; +}; + +static inline int +__attribute__ ((unused, always_inline)) +_dl_string_hwcap (const char *str) +{ + int i; + + for (i = 0; i < _DL_HWCAP_COUNT; i++) + { + if (strcmp (str, GLRO(dl_s390_cap_flags)[i]) == 0) + return i; + } + return -1; +}; + +static inline int +__attribute__ ((unused, always_inline)) +_dl_string_platform (const char *str) +{ + int i; + + if (str != NULL) + for (i = 0; i < _DL_PLATFORMS_COUNT; ++i) + { + if (strcmp (str, GLRO(dl_s390_platforms)[i]) == 0) + return _DL_FIRST_PLATFORM + i; + } + return -1; +}; + +#endif /* dl-procinfo.h */ diff -urpN libc/sysdeps/unix/sysv/linux/s390/dl-procinfo.h libc-s390/sysdeps/unix/sysv/linux/s390/dl-procinfo.h --- libc/sysdeps/unix/sysv/linux/s390/dl-procinfo.h 1970-01-01 01:00:00.000000000 +0100 +++ libc-s390/sysdeps/unix/sysv/linux/s390/dl-procinfo.h 2006-07-12 16:31:10.000000000 +0200 @@ -0,0 +1,43 @@ +/* Linux/s390 version of processor capability information handling macros. + Copyright (C) 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Martin Schwidefsky , 2006. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include + + +#undef _dl_procinfo +static inline int +__attribute__ ((unused)) +_dl_procinfo (int word) +{ + /* This table should match the information from arch/s390/kernel/setup.c + in the kernel sources. */ + int i; + + _dl_printf ("AT_HWCAP: "); + + for (i = 0; i < _DL_HWCAP_COUNT; ++i) + if (word & (1UL << i)) + _dl_printf (" %s", GLRO(dl_s390_cap_flags)[i]); + + _dl_printf ("\n"); + + return 0; +}