Tag: powerpc

有没有类似x86 cpuid()的东西可用于PowerPC?

我想编写一些能够在PowerPC上查询处理器属性的C代码,就像在x86上使用cpuid一样。 我喜欢品牌,型号,步进,SIMD宽度,可用操作之类的东西,因此可以在运行时爆炸之前确认代码在兼容平台上使用。 在PowerPC上有这样的通用机制吗? 如果是这样,可以在哪里阅读它?

如何编写一个返回指向堆栈的指针的函数

在阅读了以下问题之后 ,我明白没有这样的事情存在(至少不是“便携式”)。 但是我主演单声道代码库中的以下代码片段 ,它返回指向堆栈的指针: static void * return_stack_ptr () { gpointer i; return &i; } 令我感到惊讶的是,上面的代码甚至可以在诸如PowerPC之类的arch上工作,我认为这只适用于x86(也许只有gcc)。 这是否适用于PowerPC?

是否可以在Altivec中旋转128位值?

我正在尝试将一些ARM NEON代码移植到AltiVec。 我们的NEON代码有两个LOAD,一个ROT,一个XOR和一个STORE,所以它看起来像一个简单的测试用例。 根据IBM的vec_rl文档: 结果的每个元素是通过将左边的相应元素旋转由b的相应元素指定的位数来获得的。 除了-qarch=power8 ,doc继续说vector unsigned int是最大的数据类型,在这种情况下, vector unsigned long long适用。 我想执行128位旋转,而不是单个元素的32位或64位旋转。 位位置为19,31,67,97和109.它们不是字节对齐的。 (常量来自ARIA分组密码 )。 4×32和2×64是最大的AltiVec数据安排吗? 是否可以在Altivec中旋转128位值? 如果打包旋转是唯一可用的操作,那么最好在C或AltiVec中进行操作吗?

通过getauxval检测Power8内核加密?

我在GCC112上,这是一台运行Linux的小端Power8机器。 Power8具有内核加密function,可提供AES,SHA和一些其他有用的function。 我正在尝试使用getauxval确定运行时function的可用性。 用例是为“最小”function的机器构建的发行版,我们需要在运行时交换更快的function。 hwcaps.h的转储如下所示,但缺少Power8,AES,SHA等的特定位。 但是,我相信Power8是ISA 2.07,而ISA 2.07的位是PPC_FEATURE2_ARCH_2_07 。 我不清楚的是,Power8内核加密可选,就像ARMv8下ARM的加密一样。 我找不到明确说明要求的文档,而且我没有OpenPower的成员资格来访问ISA文档。 (另一种可能性是,它被陈述但我在文档中错过了它)。 是否可以使用getauxval查询function的运行时环境? 如果没有,那么我们如何在运行时确定function可用性? CPU探测是唯一可用的替代方案吗? 也许更一般地说,我们如何确定Power6,Power7和Power8运行时环境? auxv.h大多是空的。 头文件包含hwcaps.h 。 $ cat /usr/include/bits/hwcap.h … /* The bit numbers must match those in the kernel’s asm/cputable.h. */ /* Feature definitions in AT_HWCAP. */ #define PPC_FEATURE_32 0x80000000 /* 32-bit mode. */ #define PPC_FEATURE_64 0x40000000 /* 64-bit mode. */ […]

qrencode – 分段错误(核心转储)

我制作了一个工作程序,在给定某个字符串的情况下生成图像。 它完全适用于我的Slackware 32位发行版,其他发行版也是32位。 现在我需要在客户机上实现它,这是一个AIX powerpc。 它编译没有任何问题,似乎工作(每个其他function工作并给出正确的结果),除非我称这两个函数“QRcode_encodeString”和“QRcode_encodeData”。 它一直给我分段错误。 您可以假设我的main()唯一行是该函数调用: #include #include int main(void) { QRcode* pQRC = QRcode_encodeString(“abc”, 0, QR_ECLEVEL_L, QR_MODE_8, 0); return 0; } 我没有在客户端计算机上的gdb和没有root priv。 它适用于生成微QR QR码的“QRcode_encodeStringMQR()”,但这对我来说不是解决方案。 它生成一个名为“core”的转储文件,我无法使用它,因为该机器没有gdb ……我假设我无法在另一台机器上打开它,因为它们不共享相同的架构。 我对如何解决这个问题一无所知…… 同样,这段代码适用于我的Slackware发行版。 不幸的是,我对powerpc和AIX的了解仅限于此体验。 我忘了提,只有cc可用,我正在编译如下: cc qrgen.c -lqrencode -L/usr/local/lib -I/usr/local/include

如何从OpenSSL中的perl脚本生成程序集文件

在OpenSSL(版本1.1.0e)的开源代码中,我看到一些函数定义是由文件夹中存在的perl文件生成的。 在加密中每个文件夹中的build.info文件中,他们写了一些行来从相应的.pl生成.s。 例如: 在crypto/aes/build.info生成crypto/aes/build.info : GENERATE[aesp8-ppc.s]=asm/aesp8-ppc.pl $(PERLASM_SCHEME) 在crypto/build.info生成crypto/build.info : GENERATE[ppccpuid.s]=ppccpuid.pl $(PERLASM_SCHEME) 而且在主Makefile(生成的makefile)中,有一些行如下: crypto/aes/aes-x86_64.o: crypto/aes/aes-x86_64.s $(CC) -I. -Icrypto/include -Iinclude $(CFLAGS) $(LIB_CFLAGS) -MMD -MF crypto/aes/aes-x86_64.d.tmp -MT $@ -c -o $@ crypto/aes/aes-x86_64.s @touch crypto/aes/aes-x86_64.d.tmp @if cmp crypto/aes/aes-x86_64.d.tmp crypto/aes/aes-x86_64.d > /dev/null 2> /dev/null; then \ rm -f crypto/aes/aes-x86_64.d.tmp; \ else \ mv crypto/aes/aes-x86_64.d.tmp crypto/aes/aes-x86_64.d; \ fi 其次是: crypto/aes/aes-x86_64.s: crypto/aes/asm/aes-x86_64.pl […]

线程实现

我想知道如何实现我自己的线程库。 我所拥有的是CPU(PowerPC架构)和C标准库。 我可以看一下开源轻量级实现吗?

在文本段中创建具有给定大小的C函数

我正在编写一个嵌入式powerpc 32系统,它带有一个32 KB的8路组关联L2指令缓存。 为了避免高速缓存抖动,我们以一种方式对齐函数,使得以高频率调用的一组函数的文本(想想中断代码)最终在单独的高速缓存集中。 我们通过根据需要插入虚函数来实现这一点,例如 void high_freq1(void) { … } void dummy(void) { __asm__(/* Silly opcodes to fill ~100 to ~1000 bytes of text segment */); } void high_freq2(void) { … } 这让我感到丑陋和不理想。 我想做的是 完全避免使用__asm__并使用纯C89(可能是C99) 找到一种方法来创建GCC优化器不接触的所需的dummy()间隔 dummy() spacer的大小应该可以配置为4个字节的倍数。 典型的间隔物为260至1000个字节。 对于总共500个函数中的一组约50个函数应该是可行的 我也愿意探索以一种方式放置一组选定函数的全新技术,这样它们就不会映射到相同的缓存行。 链接器脚本可以这样做吗?

Spidev不使用ioctl同时写/读

我希望找到一些帮助,即使这个问题可能是硬件而不是软件相关(我们会看到)。 我正在开发基于Freescales P1021处理器(ppc,e500v2核心)的定制电路板。 外部PCB将连接并可由SPI配置。 该外部PCB的规格读取为全双工模式下的2字节命令,并且只有最后一个字节用于在MISO上传输数据。 知道这一点,我目前正在准备一些软件来测试这个设备。 所以我从众所周知的spi_test程序开始。 root@p1021rdb:~# ./spi_test -D /dev/spidev32766.3 spi mode: 0 bits per word: 8 max speed: 500000 Hz (500 KHz) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 […]

如何知道ELF目标文件中的调试信息类型?

我有一个ELF目标文件。 我想知道它包含哪种类型的调试信息。 它是用PPC架构的Diab编译器(C源代码)编译的。 我很确定它是用调试符号构建的。 我尝试用dwarfdump提取调试信息,但我不工作,所以我猜调试信息不​​是DWARF类型。 $ dwarfdump file.elf No DWARF information present in file.elf 使用objdump显示调试信息是空的。 $ objdump -g file.elf file.elf: file format elf32-powerpc 即使ELF文件包含名为.debug_sfnames , .debug_srcinfo和.debug.srcinfo部分,这个ELF文件也不包含调试信息吗? 或者调试信息是以objdump无法处理的格式存储的?