sl@0: /* sl@0: * LIBOIL - Library of Optimized Inner Loops sl@0: * Copyright (c) 2003,2004 David A. Schleef sl@0: * All rights reserved. sl@0: * sl@0: * Redistribution and use in source and binary forms, with or without sl@0: * modification, are permitted provided that the following conditions sl@0: * are met: sl@0: * 1. Redistributions of source code must retain the above copyright sl@0: * notice, this list of conditions and the following disclaimer. sl@0: * 2. Redistributions in binary form must reproduce the above copyright sl@0: * notice, this list of conditions and the following disclaimer in the sl@0: * documentation and/or other materials provided with the distribution. sl@0: * sl@0: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR sl@0: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED sl@0: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE sl@0: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, sl@0: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES sl@0: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR sl@0: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) sl@0: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, sl@0: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING sl@0: * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE sl@0: * POSSIBILITY OF SUCH DAMAGE. sl@0: */ sl@0: sl@0: #ifdef HAVE_CONFIG_H sl@0: #include "config.h" sl@0: #endif sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: /***** arm *****/ sl@0: sl@0: //#ifdef __arm__ sl@0: #if 0 sl@0: static unsigned long sl@0: oil_profile_stamp_xscale(void) sl@0: { sl@0: unsigned int ts; sl@0: __asm__ __volatile__ ( sl@0: " mrc p14, 0, %0, c1, c0, 0 \n" sl@0: : "=r" (ts)); sl@0: return ts; sl@0: } sl@0: #endif sl@0: sl@0: static void sl@0: oil_cpu_arm_getflags_cpuinfo (char *cpuinfo) sl@0: { sl@0: char *cpuinfo_flags; sl@0: char **flags; sl@0: char **f; sl@0: sl@0: cpuinfo_flags = get_cpuinfo_line(cpuinfo, "Features"); sl@0: if (cpuinfo_flags == NULL) { sl@0: free (cpuinfo); sl@0: return; sl@0: } sl@0: sl@0: flags = strsplit(cpuinfo_flags); sl@0: for (f = flags; *f; f++) { sl@0: if (strcmp (*f, "edsp") == 0) { sl@0: OIL_DEBUG ("cpu feature %s", *f); sl@0: oil_cpu_flags |= OIL_IMPL_FLAG_EDSP; sl@0: } sl@0: if (strcmp (*f, "vfp") == 0) { sl@0: OIL_DEBUG ("cpu feature %s", *f); sl@0: oil_cpu_flags |= OIL_IMPL_FLAG_VFP; sl@0: } sl@0: sl@0: free (*f); sl@0: } sl@0: free (flags); sl@0: free (cpuinfo_flags); sl@0: } sl@0: sl@0: static char * sl@0: get_proc_cpuinfo (void) sl@0: { sl@0: char *cpuinfo; sl@0: int fd; sl@0: int n; sl@0: sl@0: cpuinfo = malloc(4096); sl@0: if (cpuinfo == NULL) return NULL; sl@0: sl@0: fd = open("/proc/cpuinfo", O_RDONLY); sl@0: if (fd < 0) { sl@0: free (cpuinfo); sl@0: return NULL; sl@0: } sl@0: sl@0: n = read(fd, cpuinfo, 4095); sl@0: if (n < 0) { sl@0: free (cpuinfo); sl@0: close (fd); sl@0: return NULL; sl@0: } sl@0: cpuinfo[n] = 0; sl@0: sl@0: close (fd); sl@0: sl@0: return cpuinfo; sl@0: } sl@0: #ifdef __SYMBIAN32__ sl@0: EXPORT_C sl@0: #endif sl@0: void sl@0: oil_cpu_detect_arch(void) sl@0: { sl@0: #ifdef __linux__ sl@0: int arm_implementer = 0; sl@0: int arm_arch; sl@0: char *cpuinfo; sl@0: char *s; sl@0: sl@0: cpuinfo = get_proc_cpuinfo(); sl@0: if (cpuinfo == NULL) return; sl@0: sl@0: s = get_cpuinfo_line(cpuinfo, "CPU implementer"); sl@0: if (s) { sl@0: arm_implementer = strtoul (s, NULL, 0); sl@0: free(s); sl@0: } sl@0: sl@0: switch(arm_implementer) { sl@0: case 0x69: /* Intel */ sl@0: case 0x41: /* ARM */ sl@0: /* ARM chips are known to not have timestamping available from sl@0: * user space */ sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: sl@0: s = get_cpuinfo_line(cpuinfo, "CPU architecture"); sl@0: if (s) { sl@0: arm_arch = strtoul (s, NULL, 0); sl@0: if (arm_arch >= 6) sl@0: oil_cpu_flags |= OIL_IMPL_FLAG_ARM6; sl@0: free(s); sl@0: } sl@0: sl@0: oil_cpu_arm_getflags_cpuinfo (cpuinfo); sl@0: free (cpuinfo); sl@0: #endif sl@0: } sl@0: //#endif sl@0: sl@0: