1*a67afe4dSAndroid Build Coastguard Worker 2*a67afe4dSAndroid Build Coastguard Worker /* contrib/mips-msa/linux.c 3*a67afe4dSAndroid Build Coastguard Worker * 4*a67afe4dSAndroid Build Coastguard Worker * Copyright (c) 2020-2023 Cosmin Truta 5*a67afe4dSAndroid Build Coastguard Worker * Copyright (c) 2016 Glenn Randers-Pehrson 6*a67afe4dSAndroid Build Coastguard Worker * Written by Mandar Sahastrabuddhe, 2016. 7*a67afe4dSAndroid Build Coastguard Worker * Updated by Sui Jingfeng, 2021. 8*a67afe4dSAndroid Build Coastguard Worker * 9*a67afe4dSAndroid Build Coastguard Worker * This code is released under the libpng license. 10*a67afe4dSAndroid Build Coastguard Worker * For conditions of distribution and use, see the disclaimer 11*a67afe4dSAndroid Build Coastguard Worker * and license in png.h 12*a67afe4dSAndroid Build Coastguard Worker * 13*a67afe4dSAndroid Build Coastguard Worker * On Linux, png_have_msa is implemented by reading the pseudo-file 14*a67afe4dSAndroid Build Coastguard Worker * "/proc/self/auxv". 15*a67afe4dSAndroid Build Coastguard Worker * 16*a67afe4dSAndroid Build Coastguard Worker * See contrib/mips-msa/README before reporting bugs. 17*a67afe4dSAndroid Build Coastguard Worker * 18*a67afe4dSAndroid Build Coastguard Worker * STATUS: SUPPORTED 19*a67afe4dSAndroid Build Coastguard Worker * BUG REPORTS: [email protected] 20*a67afe4dSAndroid Build Coastguard Worker */ 21*a67afe4dSAndroid Build Coastguard Worker 22*a67afe4dSAndroid Build Coastguard Worker #include <elf.h> 23*a67afe4dSAndroid Build Coastguard Worker #include <fcntl.h> 24*a67afe4dSAndroid Build Coastguard Worker #include <stdlib.h> 25*a67afe4dSAndroid Build Coastguard Worker #include <unistd.h> 26*a67afe4dSAndroid Build Coastguard Worker 27*a67afe4dSAndroid Build Coastguard Worker static int png_have_msa(png_structp png_ptr)28*a67afe4dSAndroid Build Coastguard Workerpng_have_msa(png_structp png_ptr) 29*a67afe4dSAndroid Build Coastguard Worker { 30*a67afe4dSAndroid Build Coastguard Worker Elf64_auxv_t aux; 31*a67afe4dSAndroid Build Coastguard Worker int fd; 32*a67afe4dSAndroid Build Coastguard Worker int has_msa = 0; 33*a67afe4dSAndroid Build Coastguard Worker 34*a67afe4dSAndroid Build Coastguard Worker fd = open("/proc/self/auxv", O_RDONLY); 35*a67afe4dSAndroid Build Coastguard Worker if (fd >= 0) 36*a67afe4dSAndroid Build Coastguard Worker { 37*a67afe4dSAndroid Build Coastguard Worker while (read(fd, &aux, sizeof(Elf64_auxv_t)) == sizeof(Elf64_auxv_t)) 38*a67afe4dSAndroid Build Coastguard Worker { 39*a67afe4dSAndroid Build Coastguard Worker if (aux.a_type == AT_HWCAP) 40*a67afe4dSAndroid Build Coastguard Worker { 41*a67afe4dSAndroid Build Coastguard Worker uint64_t hwcap = aux.a_un.a_val; 42*a67afe4dSAndroid Build Coastguard Worker 43*a67afe4dSAndroid Build Coastguard Worker has_msa = (hwcap >> 1) & 1; 44*a67afe4dSAndroid Build Coastguard Worker break; 45*a67afe4dSAndroid Build Coastguard Worker } 46*a67afe4dSAndroid Build Coastguard Worker } 47*a67afe4dSAndroid Build Coastguard Worker close(fd); 48*a67afe4dSAndroid Build Coastguard Worker } 49*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_WARNINGS_SUPPORTED 50*a67afe4dSAndroid Build Coastguard Worker else 51*a67afe4dSAndroid Build Coastguard Worker png_warning(png_ptr, "/proc/self/auxv open failed"); 52*a67afe4dSAndroid Build Coastguard Worker #endif 53*a67afe4dSAndroid Build Coastguard Worker 54*a67afe4dSAndroid Build Coastguard Worker return has_msa; 55*a67afe4dSAndroid Build Coastguard Worker } 56