精华内容
下载资源
问答
  • 为了在制作的mpc8360e处理器板...开发主机PC用过redhat9及Gentoo linux. 嵌入式板采用mpc8360e处理器,属于mpc83xx系列. MPC8349E-mITX板处理器mpc8349e亦属mpc83xx系列。A: 交叉编译环境设置的四种简单方法:A_1. 安...

    为了在制作的mpc8360e处理器板上移植U-Boot,linux kernel,需要交叉编译环境,将使用过的方法总结如下,并简单给出中间曾经遇到的问题.

    开发主机PC用过redhat9及Gentoo linux. 嵌入式板采用mpc8360e处理器,属于mpc83xx系列. MPC8349E-mITX板处理器mpc8349e亦属mpc83xx系列。

    A: 交叉编译环境设置的四种简单方法:

    A_1. 安装ELDK (Embedded Linux Development Kit)

    说明主页:

    说明: 操作主机为Gentoo linux. 在Gentoo中安装ELDK,必须安装rpm命令和相应的库.(emerge -av app-arch/rpm)

    A_1.1 下载ELDK镜像ISO文件

    # lftp      ## 浏览下载ppc-2008-04-01_freescale.iso

    lftp> cd 4.2/ppc-linux-x86/iso

    lftp> get ppc-2008-04-01_freescale.iso

    lftp> quit

    A_1.2 挂载镜像文件

    # mount -o loop -t iso9660 ppc-2008-04-01_freescale.iso  /mnt/cdrom

    ! 浏览器打开其中的README.html,阅读说明

    A_1.3 以下为安装步骤

    1.3.1 创建安装目录

    # mkdir -p /opt/eldk

    A_1.3.2 进入ISO镜像挂载目录

    # cd /mnt/cdrom

    A_1.3.3 根据说明(README.html)选择cpu_familly为ppc_6xx(支持mpc83xx),指定安装目录进行安装

    # ./install -d /opt/eldk ppc_6xx

    A_1.3.4 验证安装结果

    $ /opt/eldk/usr/bin/ppc_6xx-gcc -v

    A_1.4 安装成功后修改环境变量(或修改/etc/bash/bashrc)

    # export CROSS_COMPILE=ppc_6xx-

    # export PATH=$PATH:/opt/eldk/usr/bin:/opt/eldk/bin

    A_1.5 测试编译

    $ powerpc-linux-gcc -o hello hello.c

    A_1.6 更新修改ELDK

    由于ELDK制作滞后与U-Boot和内核kernel源码。根据需要可以删除或更新ELDK中自带的源码.

    # cd /opt/eldk/ppc_6xx/usr/src

    # rm -rf linux-2.6.24 linux-2.6.24-xenomai u-boot-1.3.1 linux

    # ftp_get_kernel linux-2.6.30.5.tar.bz2

    # tar -xjvf linux-2.6.30.5.tar.bz2

    # ln -s linux-2.6.30.5 linux

    A_2. 安装ltib

    详见freescale LTIB使用总结使用总结(略)

    A_3. 直接复制现有的ELDK环境

    Gentoo主机A中如方法1中已经安装了ELDK4.2,将其现成的ELDK环境复制到Gentoo主机B中。

    主机A中打包ELDK环境,上传至主机B中,如下操作:

    [A]# cd /opt/

    [A]# tar -czvf eldk.tar.gz eldk

    [A]# ftp ip_addr_of_B

    [A]> put eldk.tar.gz

    主机B中安装A的目录和环境解包ELDK环境,修改环境变量,如下操作:

    [B]# cd /opt/

    [B]# mv ftp_dir/eldk.tar.gz /opt/

    [B]# tar -xzvf eldk.tar.gz

    [B]# export CROSS_COMPILE=ppc_6xx-

    [B]# export PATH=$PATH:/opt/eldk/usr/bin:/opt/eldk/bin

    A_4. 直接复制现有的ltib交叉编译环境

    主机A(redhat9)中如方法2已经安装了ltib,将其现成的交叉编译环境复制到主机B(Gentoo)中。

    主机A中如下操作:

    [A]# cd /opt/freescale/

    [A]# ls -l

    [A]# tar -czvf powerpc-linux-gcc.tar.gz usr

    [A]# ftp_put_B powerpc-linux-gcc.tar.gz

    在主机B中如下操作:

    [B]# mkdir -m 755 -p /opt/freescale/

    [B]# cd /opt/freescale/

    [B]# cp powerpc-linux-gcc.tar.gz .

    [B]# tar -xzvf powerpc-linux-gcc.tar.gz

    [B]# vim /etc/bash/bashrc

    #export PATH=/opt/freescale/usr/local/gcc-3.4.3-uClibc-0.9.28-1/powerpc-linux/bin:$PATH

    export PATH=/opt/freescale/usr/local/gcc-4.0.2-glibc-2.3.6-nptl-3/powerpc-linux/bin:$PATH

    [B]# source /etc/bash/bashrc

    [B]# powerpc-linux-gcc hello.c -o hello

    测试交叉编译的程序,板子上操作:

    mpc8349itx# ftpget -u liuby -p starby 59.64.155.122 hello hello

    注意到方法4中修改环境时export语句的不同,两条语句(一个被注释,不起作用)对应不同交叉编译链(他们使用不同的库)。

    下面给出嵌入式板中库与交叉编译链库的差异导致的问题:

    说明: 嵌入式板mpc8349itx文件系统由ltib编译文件系统时选择了gcc-4.0.2-glibc-2.3.6-nptl-3生成.

    mpc8349itx # ./a.out        ## 使用uClibc的库(对应export gcc-3.4.3-uClibc-0.9.28-1)

    -sh: ./a.out: not found

    mpc8349itx # ftpget -u liuby -p starby 59.64.155.199 a.out a.out

    mpc8349itx # ./a.out        ## 使用uClibc的库,静态编译 -static

    hello world

    Segmentation fault

    mpc8349itx # ftpget -u liuby -p starby 59.64.155.199 a.out a.out

    mpc8349itx # ./a.out        ## 使用glibc的库,正常。(对应 gcc-4.0.2-glibc-2.3.6-nptl-3)

    hello world

    以上说明交叉编译链可以正常工作

    B. 使用交叉编译编译U-Boot, linux kernel:

    B_1. U-Boot下载及编译:

    B_1.1 下载U-Boot

    网页浏览   点击snapshot下载。(注: 根据需要选择下载,一般可以浏览 点击snapshot下载最新的源码)

    或者使用Git clone下载

    B_1.2 解压U-Boot源码

    $ tar -xzvf u-boot-mpc83xx-HEAD.tar.gz

    B_1.3 编译U-Boot(mpc8349itx板)

    $ cd u-boot-mpc83xx

    $ make CROSS_COMPILE=ppc_6xx- mrproper

    $ make CROSS_COMPILE=ppc_6xx- MPC8349ITX_config

    $ make CROSS_COMPILE=ppc_6xx-

    B_1.4 下载u-boot.bin

    $ cp u-boot.bin ~/tftproot/

    B_2. kernel下载及编译:

    B_2.1 下载最新的stable的内核源码

    网页浏览 选择Latest Stable Kernel内核,点击Download图标下载。

    或者使用Git clone下载

    B_2.2 解压内核源码

    $ tar -xjvf linux-2.6.30.5.tar.bz2

    B_2.3 编译kernel(mpc8349itx板)

    $ cd linux-2.6.30.5

    $ make distclean

    $ make mrproper                    保持源码`纯净'

    $ make ARCH=powerpc CROSS_COMPILE=ppc_6xx-  oldconfig   使用当前目录下的.config做默认配置文件 [*]

    $ make ARCH=powerpc CROSS_COMPILE=ppc_6xx-  mpc834x_itx_defconfig   使用arch/powerpc/configs/目录下的*_defconfig文件作默认配置文件 [*]

    $ make ARCH=powerpc CROSS_COMPILE=ppc_6xx-  menuconfig  自己手动配置 [*]

    ! 说明: [*]表示的三个操作任选其一[oldconfig/mpc834x_itx_defconfig/menuconfig选其一]

    $ make ARCH=powerpc CROSS_COMPILE=ppc_6xx-  uImage      真正编译内核

    $ make ARCH=powerpc CROSS_COMPILE=ppc_6xx-  modules     编译模块

    $ make ARCH=powerpc CROSS_COMPILE=ppc_6xx-  INSTALL_MOD_PATH=/opt/eldk/ppc_6xx/ modules_install 模块目录

    B_2.4 下载uImage

    $ cp arch/powerpc/boot/uImage ~/tftproot/

    注: 上面四种方法提供的交叉编译链,方法A_4编译内核会报错.

    展开全文
  • PowerPC平台 linux移植一

    2021-05-14 19:04:38
    PowerPC平台 u-boot移植基础上,移植Linux内核,具体移植过程如下:1.修改顶层Makefile ARCH ?= powerpc CROSS_COMPILE ?= powerpc-linux-gnu- 2.配置 freescale@freescale-sdk:~/work/source/linux-2.6.35-r2$ ...

    在PowerPC平台 u-boot移植基础上,移植Linux内核,具体移植过程如下:

    1.修改顶层Makefile ARCH        ?= powerpc CROSS_COMPILE    ?= powerpc-linux-gnu- 2.配置 freescale@freescale-sdk:~/work/source/linux-2.6.35-r2$  make p1010rdb_defconfig drivers/net/Kconfig:109:warning: choice value used outside its choice group drivers/net/Kconfig:115:warning: choice value used outside its choice group *** *** Can't find default configuration "arch/powerpc/configs/p1010rdb_defconfig"! *** make[1]: *** [p1010rdb_defconfig] Error 1 make: *** [p1010rdb_defconfig] Error 2 freescale@freescale-sdk:~/work/source/linux-2.6.35-r2$ ls .config ls: cannot access .config: No such file or directory 拷贝p1010rdb_defconfig至改目录arch/powerpc/configs/ freescale@freescale-sdk:~/work/source/linux-2.6.35-r2$ make p1010rdb_defconfig drivers/net/Kconfig:109:warning: choice value used outside its choice group drivers/net/Kconfig:115:warning: choice value used outside its choice group # # configuration written to .config # freescale@freescale-sdk:~/work/source/linux-2.6.35-r2$ ls .config .config 3.编译 freescale@freescale-sdk:~/work/source/linux-2.6.35-r2$ make uImage 错误一: net/ipv6/ipv6_sockglue.c: In function 'ip6_ra_control': net/ipv6/ipv6_sockglue.c:72:44: error: 'struct inet_sock' has no member named 'num' make[2]: *** [net/ipv6/ipv6_sockglue.o] Error 1 make[1]: *** [net/ipv6] Error 2 make: *** [net] Error 2 freescale@freescale-sdk:~/work/source/linux-2.6.35-r2$ make menuconfig < >   The IPv6 protocol  ---> 去掉IPv6(目前用不到),再编译   WRAP    arch/powerpc/boot/uImage Image Name:   Linux-2.6.35 Created:      Sun May 24 10:26:09 2015 Image Type:   PowerPC Linux Kernel Image (gzip compressed) Data Size:    2919511 Bytes = 2851.08 kB = 2.78 MB Load Address: 00000000 Entry Point:  00000000 freescale@freescale-sdk:~/work/source/linux-2.6.35-r2$ Load Address Entry Point地址可能有问题,先试一下看能否启动 4.测试: => tftp 0x1000000 uImage Speed: 1000, full duplex Using eTSEC1 device TFTP from server 192.168.2.242; our IP address is 192.168.2.21 Filename 'uImage'. Load address: 0x1000000 Loading: T T T T T T T T T T Retry count exceeded; starting again Speed: 100, full duplex Using eTSEC2 device TFTP from server 192.168.2.242; our IP address is 192.168.2.21 Filename 'uImage'. Load address: 0x1000000 Loading: #################################################################          #################################################################          #################################################################          #### done Bytes transferred = 2919575 (2c8c97 hex) => bootm 0x1000000 WARNING: adjusting available memory to 30000000 ## Booting kernel from Legacy Image at 01000000 ...    Image Name:   Linux-2.6.35    Created:      2015-05-24   2:26:09 UTC    Image Type:   PowerPC Linux Kernel Image (gzip compressed)    Data Size:    2919511 Bytes = 2.8 MiB    Load Address: 00000000    Entry Point:  00000000    Verifying Checksum ... OK    Uncompressing Kernel Image ... OK 启动失败,再次尝试 => setenv ethact eTSEC2 => tftp 0x1000000 uImage Speed: 100, full duplex Using eTSEC2 device TFTP from server 192.168.2.242; our IP address is 192.168.2.21 Filename 'uImage'. Load address: 0x1000000 Loading: #################################################################          #################################################################          #################################################################          #### done Bytes transferred = 2919575 (2c8c97 hex) => tftp 0x2000000 p1010rdb.dtb Speed: 100, full duplex Using eTSEC2 device TFTP from server 192.168.2.242; our IP address is 192.168.2.21 Filename 'p1010rdb.dtb'. Load address: 0x2000000 Loading: # done Bytes transferred = 12994 (32c2 hex) => bootm 0x1000000 0x2000000 WARNING: adjusting available memory to 30000000 ## Booting kernel from Legacy Image at 01000000 ...    Image Name:   Linux-2.6.35    Created:      2015-05-24   2:26:09 UTC    Image Type:   PowerPC Linux Kernel Image (gzip compressed)    Data Size:    2919511 Bytes = 2.8 MiB    Load Address: 00000000    Entry Point:  00000000    Verifying Checksum ... OK ## Loading init Ramdisk from FIT Image at 02000000 ... Bad FIT ramdisk image format! Ramdisk image is corrupt or invalid 提示Ramdisk加载失败,先用busybox做个文件系统再试试 => setenv ethact eTSEC2 => tftp 0x1000000 uImage Speed: 100, full duplex Using eTSEC2 device TFTP from server 192.168.2.242; our IP address is 192.168.2.21 Filename 'uImage'. Load address: 0x1000000 Loading: #################################################################          #################################################################          #################################################################          #### done Bytes transferred = 2919575 (2c8c97 hex) => tftp 0x2000000 p1010rdb.dtb Speed: 100, full duplex Using eTSEC2 device TFTP from server 192.168.2.242; our IP address is 192.168.2.21 Filename 'p1010rdb.dtb'. Load address: 0x2000000 Loading: # done Bytes transferred = 12994 (32c2 hex) => tftp 0x3000000 rootfs.ext2.gz.u-boot Speed: 100, full duplex Using eTSEC2 device TFTP from server 192.168.2.242; our IP address is 192.168.2.21 Filename 'rootfs.ext2.gz.u-boot'. Load address: 0x3000000 Loading: #################################################################          #################################################################          #################################################################          #################################################################          ################################################################ done Bytes transferred = 4745428 (4868d4 hex) => bootm 0x1000000 0x3000000 0x2000000 WARNING: adjusting available memory to 30000000 ## Booting kernel from Legacy Image at 01000000 ...    Image Name:   Linux-2.6.35    Created:      2015-05-24   2:26:09 UTC    Image Type:   PowerPC Linux Kernel Image (gzip compressed)    Data Size:    2919511 Bytes = 2.8 MiB    Load Address: 00000000    Entry Point:  00000000    Verifying Checksum ... OK ## Loading init Ramdisk from Legacy Image at 03000000 ...    Image Name:   fsl-image-minimal-p2020rdb-20140    Created:      2014-01-24   6:44:46 UTC    Image Type:   PowerPC Linux RAMDisk Image (gzip compressed)    Data Size:    4745364 Bytes = 4.5 MiB    Load Address: 00000000    Entry Point:  00000000    Verifying Checksum ... OK ## Flattened Device Tree blob at 02000000    Booting using the fdt blob at 0x2000000    Uncompressing Kernel Image ... OK    Loading Ramdisk to 2fb79000, end 2ffff894 ... OK    Loading Device Tree to 00ff9000, end 00fff2c1 ... OK WARNING: could not find compatiblenode fsl-usb2-dr: FDT_ERR_NOTFOUND. Using P1010 RDB machine description Memory CAM mapping: 256/256/256 Mb, residual: 256Mb Linux version 2.6.35 (freescale@freescale-sdk) (gcc version 4.5.1 (Sourcery G++ Lite 2010.09-55) ) #1 Sun May 24 10:25:50 CST 2015 Found initrd at 0xefb79000:0xeffff894 bootconsole [udbg0] enabled setup_arch: bootmem ...... rtc-pt7c4338 0-0068: hctosys: unable to read the hardware clock RAMDISK: gzip image found at block 0 VFS: Mounted root (ext2 filesystem) readonly on device 1:0. Freeing unused kernel memory: 212k init INIT: version 2.88 booting /etc/init.d/rcS: line 27: can't create /etc/hostname: Read-only file system Starting udev Missing devtmpfs, which is required for udev to run Halting... INIT: Sending phwclock: can't open '/dev/misc/rtc': No such file or directory Stopping syslogd/klogd: no syslogd found; none killed Deconfiguring network interfaces... ifdown: interface lo not configured done. Stopping Lighttpd Web Server: no /usr/sbin/lighttpd found; none killed lighttpd. Sending all processes the TERM signal... Sending all processes the KILL signal... /etc/init.d/rc: /etc/rc0.d/S25save-rtc.sh: line 13: can't create /etc/timestamp: Read-only file system urandom stop: failed. Unmounting remote filesystems... Deactivating swap... Unmounting local filesystems... Power down. System Halted, OK to turn off power 挂机,kernel跑起来了,但文件系统没有起来,下一步制作移植文件系统。

    展开全文
  • 第一部分 PowerPC精简指令集计算机(RISC)简介 PowerPC 体系结构是一种精减指令集计算机(Reduced Instruction Set Computer,RISC)体系结构,定义了 200 多条指令。PowerPC 之所以是 RISC,原因在于大部分指令在一...

    第一部分 PowerPC 精简指令集计算机(RISC)简介

    PowerPC 体系结构是一种精减指令集计算机(Reduced Instruction Set Computer,RISC)体系结构,定义了 200 多条指令。PowerPC 之所以是 RISC,原因在于大部分指令在一个单一的周期内执行,而且通常只执行一个单一的操作(比如将内存加载到寄存器,或者将寄存器数据存储到内存)。

    PowerPC 体系结构分为三个级别(或者说是“book”)。通过对体系结构以这种方式进行划分,为实现可以选择价格/性能比平衡的复杂性级别留出了空间,同时还保持了实现间的代码兼容性。

    Book I. 用户指令集体系结构(Power ISA User Instruction Set Architecture

    定义了通用于所有 PowerPC 实现的用户指令和寄存器的基本集合。这些是非特权指令,为大多数程序所用。

    Book II. 虚拟环境体系结构(Power ISA Virtual Environment Architecture

    定义了常规应用软件要求之外的附加的用户级功能,比如高速缓存管理、原子操作和用户级计时器支持。虽然这些操作也是非特权的,但是程序通常还是通过操作系统调用来访问这些函数。

    Book III. 操作环境体系结构(Power ISA Operating Environment Architecture

    定义了操作系统级需要和使用的操作。其中包括用于内存管理、异常向量处理、特权寄存器访问、特权计时器访问的函数。Book III 中详细说明了对各种系统服务和功能的直接硬件支持。

    由于我目前手上的开发板是基于e600内核,所以我在学习PowerPC指令集的过程中,顺便总结了e600内核常用的指令集,如果大家发现我总结的指令集有错误或者不准确的地方,欢迎留言指出来,O(∩_∩)O~

     

    第二部分 e600指令集

    飞思卡尔的e600内核实现了booke内核构架中64位指令集的中的32位指令(即在e600的32位寄存器中,第0位相当于booke中的64寄存器的第32位,第31位相当于booke中64寄存器的第63位),E600内核采用大端编码方式,指令的第0位是MSB(Most Significant Bit)位,第31位是LSB(Least Significant Bit)。

    e600内核指令的高6位字段(第0-5位)被称为OPCD字段(Primary Opcode Field),根据OPCD字段的不同,PowerPC的指令集分为以下几类。

    2.1 I-form指令格式

    该类是无条件转移指令。

    0-5      6-29       30          31

    OPCD    LI          AA         LK

    AA=0,表示LI中存放的是相对地址LI*4,基址是当前指令的地址

    AA=1,表示LI中存放的是绝对地址LI*4

    LK=1,表示转移到目的地址的同时,将当前指令的下一条指令存入LR寄存器

    LK=0,仅仅表示跳转到目的地址,而不用修改LR寄存器

    例如:

    b    LI//AA=0, LK=0

    解释:跳转到目的地址:LI*4+当前指令的地址 

     

    ba   LI//AA=1,LK=0

    解释:跳转到:LI*4

     

    bl   LI//AA=0,LK=1

    解释:跳转到目的地址:LI*4+PC,同时把PC+4放入LR寄存器

    备注:PC放的是当前指令的地址。

     

    bla   LI//AA=1,LK=1

    解释:跳转到目的地址:LI*4,同时把PC+4放入LR寄存器

     

    给出一段汇编指令示例:

    0x1000051c <print>

    ……

    0x10000568:4b ff ff ff b5   对应汇编:bl 10000051c<print>

    0x1000056c:38 00 00 00   对应汇编:li  r0,0

    解释:

    bl    10000051c<print>对应的机器指令为:

    4b ff ff ff b5,其中的LK=0xed。

    将LK*4符号扩展到32为对应的真值为-0x4c,而当前指令的地址为0x1000056c,所以跳转的目标地址就是0x1000056c+(-0x4c)=0x1000051c即为print函数的入口地址。

    因此如果想获得下一条指令的有效地址可以使用下面的汇编代码:

    bl    invstr         //将当前指令的下一条指令PC+4放入LR寄存器

    invstr:mflr r6      //将LR寄存器的内容放入r6寄存器中

     

    2.2 B-Form指令格式

    该类为有条件转移指令

    0-5      6-10       11-15     16-29     30   31

    OPCD    BO         BI         BD         AA   LK

    包含下面4条指令:

    bc   BO, BI,  BD  //AA=0   LK=0

    bca BO,  BI,  BD  //AA=1   LK=0

    bcl  BO, BI,  BD  //AA=0   LK=1

    bcla BO, BI,  BD  //AA=1   LK=1

    解释:AA和LK的含义同上,下面详细介绍一下BO,BI,BD字段的含义。

    BO字段:从6位至10位,共5 bit:

    BO[0]为1:表示根据CTR寄存器是否为0进行转移;

         为0:根据CR寄存器的相应字段和BI字段中的条件进行转移。

     

    BO[1]为1:指定的条件为真时转移

         为0:指定的条件为假时转移

     

    BO[2]为1:执行bc指令时,CTR寄存器保持不变

         为0:执行bc指令时,CTR寄存器自减

     

    BO[3]为1:CTR寄存器为0时进行条件转移

         为0:CTR寄存器非0时进行条件转移

     

    BO[4]为1:bc指令将被判断为执行转移功能,处理器将预取转移指令目标地址后面的几条指令,并将预先取得的指令放入缓冲对列。

         为0:bc指令不被判断为执行转移功能,不预取转移指令目标地址后面的几条指令

     

     

    BI字段(11-15bit)的功能:

    BI[0-2]的值n(n在0到7之间):指出CR寄存器中的CRn字段的状态作为指令跳转条件

    BI[3-4]的值表述指令跳转条件,具体如下:

    00    使用LT(小于)状态作为指令的转移条件

    01   使用GT(大于)状态作为指令的转移条件

    10   使用EQ(等于)状态作为指令的转移条件

    11   使用SO(溢出)状态作为指令的转移条件

     

    BD字段(16-29bit):指出转移的目标地址

    现在我们给我几个例子:

    bc   16,0,BD

    解释:

    BO[0]为1:表示根据CTR寄存器是否为0进行转移,和CR寄存器无关了;

    BO[2]为0:执行bc指令时,CTR寄存器自减;

    BO[3]为0:CTR寄存器为非0时进行条件转移;

    BO[4] 为0:bc指令不被判断为执行转移功能,不预取转移指令目标地址后面的几条指令

    综上,该指令的意思是将CTR寄存器自减,如果CTR不为0则跳转到BD指示的地址处。

    可以使用指令助记符bdnz BD表示,CTR寄存器自减,如果CTR不为0则跳转到BD指示的地址处

     

    bc 4,2,BD

    BO[0]为0根据CR寄存器的相应字段和BI字段在中的条件进行转移。

    BO[1]为0:指定的条件为假时转移

    BO[2]为1:执行bc指令时,CTR寄存器保持不变

    BI[0-2]的值为0:指出CR寄存器中的CR0中的状态作为指令跳转条件

    BI[3-4]的值为10:使用EQ(等于)状态作为指令的转移条件

    综上,该指令的意思是说只有比较结果不等于0,就转移

    可以使用指令助记符:bne BD 来代表bc 4,2,BD

    备注:目标地址是相对地址,还是绝对地址要看AA标识是否置位。

    常用的指令助记符lt(小于), le(小于等于),eq(等于),so(溢出),+(转移被静态预测为真,选择转移),-(转移被静态预测为假,不选择转移)等等。

    在Powerpc指令集中常用的条件转移指令只有bc,bcl,以前的转移指令beq,ndnz,ble等等都是助记符。

    2.3 SC-Form指令

    该指令主要用来实现系统调用,只有“sc”这一条汇编,比较简单

     

    2.4 D-Form指令

    该指令一定包含一个立即数。

    指令格式如下:

    0-5      5-10      11-15     16-31

    OPCD    RS/RT    RA         D

    RS/RT:存放该条指令运算结果的寄存器的索引

    RA:存放源数据的寄存器索引

    D:存放该指令需要的另一个立即数数据源

    该指令格式包含两类:

    1.  对存储器或者寄存器进行读写的指令

    2.  立即数的算术运算和逻辑运算指令

    典型指令如下:

    2.4.1 Load Word and Zero指令

    lwz RT,  D(RA)

    语义:

    if RA=0 then b=0

    else  b=(RA)

    EA=b+extsign(D)

    RT=32个连续的0 连上 MEM(EA,4)

    解释:

    extsign(D):表示D符合扩展到32bit(因为D是16 bit,参与运算的是32bit)

    MEM(EA,4):表示从EA地址处取得32位数据

    该指令的目的就是将RA+D指定的地址中读取一个32位的数据,然后将此数据传递给RT寄存器。

    此外还有对16 bit 和8 bit进行操作的lhz,lbz指令

     

    2.4.2 STore Word指令

    stw RS,  D(RA)

    和lwz指令想反,将寄存器RS中的32位数存到RA+D指向的内存单元处

    备注:立即数D参与的寻找计算,都需要将D符号扩展至32位。

     

    2.4.3 Load Word and Zero with Update指令

    lwzu RT,D(RA)

    解释:将D+RA指向的内存单元的值放入RT索引的寄存器,然后将RA寄存器的值更新为RA+D

     

    2.4.5 Store Word with Update指令

    stwu RS,D(RA)

    同lwzu相反。

    备注:这两条指令可以实现数据栈的压栈和出栈操作,另外还有对8位和16位数据进行操作的指令lbzu,stbu和sthu,lhzu指令,格式通上。

     

    2.4.6 介绍两条批处理指令

    Load Multiple Word指令:

    lmw RT,D(RA)

    语义:

    if RA = 0 then b <- 0

    else b <-(RA)

    EA <-b + EXTS(D)

    r <-RT

    do while r ≤ 31

    GPR(r) <- 32个连续0 || MEM(EA, 4)  //||表示字符串的连接,例如a||b就是ab

          r <- r + 1

          EA <- EA + 4

    endwhile

    解释:将RA+D地址处的数据依次传递到RT至31中,传递的32位数据量32-RT个

     

    Store Multiple Word指令

    stmw RS,D(RA)

    解释:将RS至R31的(32-RS)个数据依次传递到RA+D指向的内容地址处。

    备注:使用这两个寄存器时要注意存储器的边界检查和所使用到的通用寄存器是否需要备份。

     

    2.4.7 Compare Immediate指令

    cmpi BF,L,RA,SI

    语义:

    n <- BF表示的数值

    if L = 0 then a <- EXTS((RA)32:63)

    else a <- (RA)

    if a < EXTS(SI)           then c <-0b100    //小于时设置CRn(0)为1

    else if a > EXTS(SI)       then c <- 0b010    //大于时设置CRn(1)为1

    else                          c <- 0b001    //等于时设置CRn(2)为1

    CR寄存器中的:  4×BF+32:4×BF+35 <- c || XER寄存器中SO位    // ||表示字符连接

    解释:

    将寄存器RA与立即数SI进行比较,然后将比较指令产生的状态放入CR寄存器的不同字段中,CR寄存器有8个CRn字段(n从0至7),可以由三bit位的BF段指定。

    L:表示是进行32位还是64的比较。对于e600而言,只有L=0的比较。

    备注:

    解释一下CR寄存器,e600中32位CR寄存器用来存放指令执行之后的状态,该寄存器分为8个字段。分别为CR0,CR1,…,CR7。每个字段都由4bit组成。

    各个字段CRn(n从0至7)都可以表示响应指令执行的结果:

    比如整数的加减及逻辑运算,使用CR0来存放状态,CR0的四个bit位的含义如下:

    CR0(0):用来表示LT(小于),当整型指令运算结果为负时置1;

    CR0(1):用来表示GT(大于),当整型指令运算结果为正时置1;

    CR0(2):用来表示EQ(等于),当整型指令运算结果为0时置1;

    CR0(3):用来表示SO(溢出),当整型指令运算结果溢出时置1;

     

    同理浮点数的运算使用CR1来保存运算状态,保存过程同上,e600的比较指令可以使用CR寄存器的全部的CRn(n从0至7)来保存运算的结果。一般在比较指令cmp之后都会有一个条件跳转指令,比如bc指令。其中cmp指令可以指定由CR寄存器的CRn段来保存结构,比如上面的cmpi指令就用BF来指定CRn字段,一般而言bc指令就会更新cmp中相同的CRn段来决定条状。

     

    2.4.8 Compare Logical Immediate指令

    cmpli BF,L,RA,UI和cmpli的指令的用法相同,所不同的是cmpli 是无符号数直接的比较,而cmpi是有无符号之间的比较。

     

    2.4.9 Trap Word Immediate指令

    twi TO,RA,SI

    解释:该指令称之为陷阱(trap)指令,该指令对一些Trap条件进行测试,如果条件成立,则处理器进入系统的trap程序,然后对trap事件进行处理。

    TO字段(有5位),第0至4位此次表示:

    LTS:(有符号式比较:小于)

    GTS:(有符号数比较:大于)

    EQ:(有符号数比较:等于)

    LT:(无符号数比较:小于)

    GT:(无符号数比较大于)

    比如:如果用户将TO设置为1,并且RA中的有符号数小于立即数SI(符合扩展之后),则处理器进程Trap处理程序。

    备注:如果把立即数SI换成寄存器索引RB,则tw TO,RA,RB就是X-Form形式。

    tw 31, r0, r0就是一个无条件trap指令,可用助记符“trap”表示。

    另外,D-Form指令包含了很多用于算术和逻辑运算的指令,这些指令都是需要一个立即数的,由于这些立即数都是在指令中的,这样在e600内核中,这些立即数的长度只能限制在16位。为了能顺利的处理32位的立即数,e600内核中的D-Form指令可以在立即数的计算时把立即数左移16位,这样我们就可以用两条指令就可以把一个立即数放到一个通用计算器中。

    例如:

    读取一个word(0x12345678)到目的寄存器:

    lis  RA,0x12345678@h          // 高16位(0x1234)偏移16位后变成0x12340000放进RA

    ori RB, RA,  0x12345678@l      // RA与低16位(0x5678)相或后构成完整数据放进RA

    备注:PowerPC指令中,i后缀表示立即数,s后缀表示左移16位。例如addi、addis、ori、oris等。这段代码也可以用来读取某个变量的值,只需要把立即数替换成变量名。

     

    从某个地址(0x56789abc)读取数据

    lis  RA,0x56789abc@ha //调整后的高16位(0x5679)偏移16位后变成(0x56790000)放进RA

    lwz RB, 0x56789abc@l (RA) //RA加上低16位(0xffff9abc) 构成完整数据地址,然后将其内容放进RB

    注意:

    用于算术运算的操作数(包括addi的操作数)时,@l获取的是符号扩展的低16位数据(0xffff9abc) ,因此高16位必须进行根据bit15进行调整,而不能简单的使用@h来获取。

     

    2.5 X-Form指令

    E600中X-Form指令的数量最多,D-form指令的每一个指令在X-Form中都有对应的指令。除此之外,X-Form指令还有一些专用的指令。

    X-Form的指令格式如下:

    0-5      6-10      11-15     16-20     21-30     31

    OPCD    TS/RT    RA         RB        XO        Rc

    X-Form的指令格式与

       D-Form指令格式:

       0-5      5-10      11-15     16-31

       OPCD    RS/RT    RA         D

    相比,只是将D-Form指令中的D字段差分为RB,XO和Rc字段。

    X-Form中的RB和RS字段存放源操作数寄存器的索引

    RT字段存放目的操作数的索引;

    RA字段既可以存放源操作数寄存器的索引,而言可以存放目的操作数的索引;

    Rc字段置1表示当前指令的运算结果将改变CR寄存器中的相应CRn段,具有“.”的后缀的指令,其Rc位置1。

     

    典型的X-Form指令如下:

    存储器访问类指令:lbzx, lhzx, lhax, lwzx,stbx, sthx, stwx, lbzux,lhzux,lwzux,stbux,sthux,stwux指令等,这些指令和D-Form中的lbz,lhz,lha,lwz,stb,sth,stw,lbzu,lhzu,lwzu,stub,sthu,stwu一一对应,所不同的是D-Form使用的立即数,换成了X-Form使用的寄存器索引。

    字节序列交换指令:lhbrx,lwbrx,sthbrx,stwbrx指令,这些指令的作用是调整字节序列。

    比较类指令和trap指令:cmp,cmpl,tw指令

    算术逻辑运算指令:and,or,xor,nand,nor,eqv指令

    Count Leading Zeros Word 指令:cntlzw RA,RS

    备注:该指令找出RS寄存器中从左边开始第一个不为0的位,然后将该位所在的位序(从0开始)存入RA中;

    2.6 XL-Form指令

    XL-Form指令支持条件转移指令,与B-Form类条件转移指令:

       B-Form指令格式

       有条件转移指令

       0-5     6-10       11-15     16-29     30   31

       OPCD    BO         BI        BD        AA   LK

    不同,该类指令使用LR寄存器或者CTR寄存器,而不适用16位的立即数作为跳转目标。

    XL-Form指令格式:

    0-5      6-10       11-15     16-18     19-20         21-30       31

    OPCD    BO         BI          ~         BH           16或者528   LK

     

    所支持的指令格式:

    bclr  BO,BI,BH   //LK=0,21-30字段值为16

    bclrl BO,BI,BH   //LK=1,21-30字段值为16

    bcctr BO,  BI,BH  //LK=0,21-30字段值为528

    bcctrl BO, BI,  BH //LK=1,21-30字段值为528

     

    X-Form类指令的BO,BI字段值和B-Form类中的BO,BI字段含义相同,LK置1表示跳转指令执行后,LR寄存器指向下一条指令的地址(当前指令地址+4),BH字段用于静态分支预测。

    当条件满足时,bclr和bclrl指令使用LR寄存器进行长条状,而bcctr,bcctrl指令使用CTR寄存器进行长跳转。

    于B-Form指令类似,X-Form指令也使用了很多助记符,比如:

    blr 相当于 bclr 20, 0

    备注:XL-Form指令和I-Form指令协作完成指令的跳转

    例子如下:

    32位PowerPC常用指令集总结
    备注:blr是XL-Form指令,bc是I-Form指令。

    XL-Form指令还可以支持CR寄存器不同段CRn的与,或,异或,同或操作,指令格式如下:

    0-5     6-10       11-15     16-20     21-30                   31

    OPCD    BT        BA        BB        257/449/193/225/0       ~

    这里举出以下几种指令:

    crand     BT,BA,BB //第21-30字段为257,BT<-BA&BB

    cror       BT,BA,BB //第21-30字段为449,BT<-BA|BB

    crxor     BT,BA,BB //第21-30字段为193,BT<-BA同或BB

    crnand    BT,BA,BB //第21-30字段为255,BT<-!(BA&BB)

    mcrf      BF,BFA    //第21-30字段为0,将CR的BFA字段拷贝到BF字段

     

    2.7 XFX-Form,XFL-Form,XS-Fomr,XO-Form类指令

    XFX-Form指令格式:

    0-5      6-10       11-20     21-30    31

    OPCD    RT         spr/tbr    XO        ~

    包括mrspr, mfspr, mrcrf, mfcr, mtocrf等等

    XO-Form指令用来支持带进位的算术运算指令和乘除法指令格式:

    0-5     6-10       11-15     16-20     21   22-30     31

    OPCD    RT         RA         RB       OE   XO        Rc

    有下面几类指令:

    1:addo.,subfo.,addco.,subfo. 指令,此类指令将会影响CA,SO,OV位和CR0字段;

    2:addeo.,subfeo.,addzeo.,subfzeo. 指令,此类指令除会影响CA,SO,OV位和CR0字段外,还可以将CA位参与运算;

    3:mullw,divw指令,此类指令用作乘除运算;

    4:A-Form指令用作浮点运算,典型指令有fadd,fsub,fmul,fdiv。

    2.8 M-Form指令

    M-Form指令主要作用是对选定的字段做循环左移,并做一些相应掩码操作,该类指令时PowerPC指令的精华,包含了一组非常强大的指令。

    这里主要介绍三条指令:

    2.8.1 Rotate Left Word Immediate then AND with Mask指令

    rlwinm RA,RS,SH,MB,ME (Rc=0)

    rlwinm. RA,RS,SH,MB,ME (Rc=1)

    指令字段:

    0-5 6-10     11-15     16-20     21-25     26-30    31

    21   RS       RA       SH       MB       ME       Rc

    解释:寄存器RS的内容循环左移立即数SH位,然后跟立即数MB和ME形成的MASK相与后放进RA

    备注:

    MASK形成的规则是,如果MB小于等于ME,则MB到ME之间的位全部置1,包括这两位,形成MASK;否则,MB到ME之间的位清0,其他位包括这两位置1,形成MASK。

    例子1:

    从立即数0x12345678(RS)中抽取bit 20-23,并左移16位,从而得到0x06000000.

    rlwinm rA, rS, 16, 4, 7

    具体过程:0x12345678循环左移16位得到0x56781234,然后与MASK:0x0f00 0000  (MASK[4,7])相与。

    该指令可以用来抽取C语言代码或者寄存器中的位域。

    例子2:

    清除立即数0x12345678(RS)的bit28-31,并左移24位,从而得到0x0012 3456

    rlwinm rA, rS, 24, 8, 31

    具体过程如下:0x12345678循环左移24位得到0x78123456,然后与MASK:0x00ff ffff  (MASK[8,31])相与。

    例子3:

    清除立即数0x12345678(RS)的bit 6,从而得到0x10345678

    rlwinm rA, rS, 0, 7, 5

    具体过程:0x12345678循环左移0位,仍是0x56781234,然后与MASK0xfdff ffff  (MASK[7,5])相与。

    功能:该指令可以用来清除C语言代码或者寄存器中的位域。

    2.8.2 Rotate Left Word then AND with Mask指令

    rlwnm RA,RS,RB,MB,ME (Rc=0)

    rlwnm. RA,RS,RB,MB,ME (Rc=1)

    指令:

    0-5 6-10      11-15     16-20     21-25     26-30    31

    23  RS        RA       RB       MB       ME       Rc

    解释:

    类似于上一条指令,只是把左移的位数放到了寄存器RB中

    2.8.3 Rotate Left Word Immediate then Mask Insert指令

    rlwimi RA,RS,SH,MB,ME (Rc=0)

    rlwimi. RA,RS,SH,MB,ME (Rc=1)

    格式:

    0-5 6-10     11-15     16-20     21-25     26-30    31

    20   RS       RA        SH       MB       ME       Rc

    解释:寄存器RS的内容循环左移立即数SH位,然后跟立即数MB和ME形成的MASK相与,再把RA的内容跟立即数MB和ME形成的MASK的补码相与,即清掉RA中MASK对应的位,最后把处理后的RS和RA的内容相或,放入RA中

    备注:

    MASK形成的规则是,如果MB小于等于ME,则MB到ME之间的位全部置1,包括这两位,形成MASK;否则,MB到ME之间的位清0,其他位包括这两位置1,形成MASK。

    例子:

    抽取0x87654321(RS)的bit 24-31,用以对立即数0x12345678(RA)的bit 8-15进行先清除后置位的操作,从而得到0x12215678.

    rlwimi rA, rS, 16, 8, 15

    具体过程:0x87654321(RS)循环左移16位得到0x43218765,然后与MASK0x00ff 0000  (MASK[8,15])相与得到0x0021 0000;再把0x12345678(RA)与MASK0x00ff 0000 (MASK[8,15])的补码0xff00 ffff相与,得到0x1200 5678; 最后0x0021 0000跟0x1200 5678相与,得到0x12215678。

    功能:该指令可以用来清除C语言代码或者寄存器中的某个位域,然后对该位域进行赋值的操作。

     

    第三部分:总结

    PowerPC处理器采用RISC定长指令集,所以它的指令集不多,但是这些基本的指令集可以衍生出很多复杂的指令集,而令我们这些初学PowerPC指令集的人望而生畏,但是即便如此,我们仍然应该耐着性子把这些指令认真的读一遍,这样我们才能了解PowerPC指令集。

    第四部分:参考资料:

    PowerISA_V2.06_PUBLIC

    王齐.Linux PowerPC详解-核心篇

     

    转自:http://blog.sina.com.cn/s/blog_70dd16910100ydyg.html

    展开全文
  • 分类概述 3.1 分支跳转指令 这类指令算是 PowerPC 里比较有特色的,也是稍显复杂的。这类指令与 CR, LR 和 CTR 紧密相联,建构起判断、循环和过程调用这些程序的基本结构。其大致可分为四类: Branch Branch ...

    return a + b + c + d;

    }

    100004b8:   80 01 00 24     lwz

    r0,36(r1)

    100004bc:   7f 9c 1a 14     add

    r28,r28,r3

    100004c0:   83 61 00 0c     lwz

    r27,12(r1)

    100004c4:   7c 7d e2 14     add

    r3,r29,r28

    100004c8:   83 81 00 10     lwz

    r28,16(r1)

    100004cc:   83 a1 00 14     lwz

    r29,20(r1)

    100004d0:   7c 08 03 a6     mtlr

    r0

    100004d4:   38 21 00 20     addi

    r1,r1,32

    100004d8:   4e 80 00 20     blr

    ------------------------------------------------------------------

    3. 分类概述

    3.1 分支跳转指令

    这类指令算是 PowerPC 里比较有特色的,也是稍显复杂的。这类指令与 CR, LR 和 CTR

    紧密相联,建构起判断、循环和过程调用这些程序的基本结构。其大致可分为四类:

    Branch

    Branch Conditional

    Branch Conditional to Count Register

    Branch Conditional to Link Register

    3.1.1 Branch

    这类指令与 CR 没有联系,即为非条件跳转,助记符后直接跟立即数地址。指令内为立即数地址预留 26 位,即可跳转 2^26

    大小的空间,如:(CIA, Current Instruction Address)

    b         0x20

    -----> 以当前指令地址为基点,往后跳转 0x20 字节,即 PC = CIA + 0x20

    ba       0x20

    -----> 直接跳转到地址 0x20 处。后缀为 a,则表示使用

    Absolute Address,PC = 0x20。

    bl        0x20

    -----> 在 b 0x20 的基础上,将 LR 更新为 CIA + 4

    bla      0x20

    -----> 使用绝对地址,且更新 LR。后缀带 l,则表示更新 LR 为 CIA + 4

    以上针对 32 位的情形,对 64 位则使用指令 be, bea, bel, bela 功能与上同。

    3.1.2 Branch Conditional

    此类为条件跳转指令。皆以 bc 开头,带 3 个操作数,如:

    bc    BO, BI, BD

    bca    BO, BI, BD

    bcl    BO, BI, BD

    bcla   BO, BI, BD

    后缀 a, l 的含义与 branch 类指令同。BO 指定跳转的条件,5 位;BI 指定关联的 CR 位,也是 5 位;BD

    为跳转的立即数地址,16 位。

    其中以 BO 的编码最为复杂(BO 从左到右编号为 0 ~ 4):

    BO[0]: 为 1,则直接跳转

    BO[1]: 为 1,则条件为真时,跳转。否则条件为假时,跳转

    BO[2]: 为 1,则 CTR 不自动减 1

    BO[3]: 为 1 时,则 CTR == 0 时跳转;为 0 时,则 CTR != 0 时跳转

    BO[4]: 静态预测位,1 表示 unlikely,0 表示 likely

    则常见的 BO 值:

    20 (0b10100) 则表示无条件跳转

    12 (0b01100) 则表示 CR 的某个位为 1 时跳转

    4 (0b00100) 则表示 CR 的某个位为 0 时跳转

    至于静态预测的策略位,默认被置为0,则其行为为:

    b1. 目标地址小于当前指令地址,预测为跳转

    b2. 目标地址大于当前指令地址,预测为不跳转

    b3. 对于目标地址在 CTR/LR 中的条件跳转指令,一律预测为不跳转

    若该位被置 1,则上述 b1, b2, b3 的静态预测行为分别为:不

    跳转,跳转,跳转。

    可以给分支指令加一个 +/- 的后缀,来简化。加 '+' 的指令,一律预测为跳转。加 '-' 的分支指令,一律预测为不跳转。

    则对于 b1,后缀 '+' 会将 y 位置 0,'-' 则将 y 位置 1。

    对于 b2,后缀 '+' 会将 y 位置 1,'-' 则将 y 位置 0。

    对于 b3,后缀 '+' 会将 y 位置 1,'-' 则将 y 位置 0。

    BI 与关联 CR 位的关系为:

    32 + BI

    即,若 BI 为 2,则对应于 CR[34],即为 CR0[gt] 位。

    以上针对 32 位的情形,对 64 位则使用指令 bce, bcea, bcel, bcela 功能与上同。

    3.1.3 Branch Conditional to Count Register

    bcctr     BO, BI

    bcctrl    BO, BI

    后缀 l 的含义与 branch 类指令同。

    BO,BI 的编码与 Branch Conditional 类指令同。

    跳转目标地址位于 CTR 中。

    以上针对 32 位的情形,对 64 位则使用指令 bcctre, bcctrel 功能与上同。

    3.1.4 Branch Conditional to Link Register

    bclr     BO, BI

    bclrl    BO, BI

    后缀 l 的含义与 branch 类指令同。

    BO,BI 的编码与 Branch Conditional 类指令同。

    跳转目标地址位于 LR 中。

    以上针对 32 位的情形,对 64 位则使用指令 bclre, bclrel 功能与上同。

    3.2 CR 指令

    这类指令包括用来支持 CR 内部位运算的指令和 CR 与 GPR 之间的数据交换指令。

    3.2.1 CR 内位运算指令

    这类指令的格式皆为:   crxxx    BT, BA, BB

    BT, BA, BB 是 CR 内的位编号,取值范围为 0 ~ 31,如 crand    0, 8, 12,则将

    CR[32+8] (CR2[lt]) 与 CR[32+12] (CR3[lt]) 作与操作后,将结果置入 CR[32+0]

    (CR0[lt]),即 CR[32] = CR[40] & CR[44]

    crand:            CR[32+BA] &

    CR[32+BB]

    crandc:           CR[32+BA] &

    (~CR[32+BB])

    creqv:            ~(CR[32+BA] ^

    CR[32+BB]),即位相等,则置 1;不等则置 0

    crnand:       ~(CR[32+BA] & CR[32+BB])

    crnor:            ~(CR[32+BA] | CR[32+BB])

    cror:             CR[32+BA] | CR[32+BB]

    crorc:            CR[32+BA] | (~CR[32+BB]),先取反后再或

    crxor:            CR[32+BA] ^ CR[32+BB],位异或

    3.2.2 CR 与 GPR 间数据交换指令

    3.2.2.1 mcrf         BF, BFA

    ---   Move Condition Register Fields

    将 CR 之 BFA 域复制到 BF 域。如 mcrf    0, 3 则将 CR3 拷入 CR0

    3.2.2.2 mtcrf      FXM, RS   ---

    Move To Condition Register Fields

    通用寄存器 RS 之 32 ~ 63 位以 4 位为单位,对应于 CR 的 8 个域,编号为 RS0 ~ RS7;

    FXM 为域掩码,8 位,从左到右编号为 0 ~ 7,对应于 RS、CR 的 8 个域。某位为 1,则将对应的 RS 域拷贝到对应的 CR

    域中。

    若 FXM 为 0x80,则只将 CR0 = RS0

    若 FXM 为 0xc8,则将 CR0 = RS0, CR1 = RS1, CR4 = RS4

    3.2.2.3 mfcr      RT

    ---   Move From Condition Register

    将 CR 的内容移入通用寄存器 RT 的 32 ~ 63 位。

    3.3 整数指令

    这类指令大致分为如下几类:

    整数访存指令

    整数算术运算指令

    整数逻辑运算指令

    整数比较指令

    整数陷阱指令

    整数移位指令

    XER 指令

    其中以整数循环移位指令最为特别。

    3.3.1 整数访存指令

    3.3.1.1 Load Byte/Half-word/Word and Zero

    该类指令从指定地址处读取 8 位、16 位、32 位数据,置入 RT,RT 高位置 0

    lbz/lbzu            RT, D(RA)

    lbzx/lbzux          RT, RA, RB

    lhz/lhzu            RT, D(RA)

    lhzx/lhzux          RT, RA, RB

    lwz/lwzu            RT, D(RA)

    lwzx/lwzux          RT, RA, RB

    RT, RA, RB 皆为 GPR,D 为有符号立即数。则有效地址的计算分别为:RA[32:63] + D,RA[32:63] +

    RB[32:63],有效地址高 32 位置 0。

    后缀 u 表示 Update,即将有效地址更新到 RA 中

    后缀 x 表示 Indexed,即使用 RA + RB 的寻址方式

    以上用于 32 位,对 64 位,上述指令皆加后缀 'e'。则有效地址的 0 ~ 31 位, 不再置 0,其计算方式如下:RA + D,RA +

    RB。

    此外,用于 64 位的还有对双字操作的支持:

    lde/ldue/ldxe/lduxe

    3.3.1.2 Load Half-word Algebraic

    lha/lhau            RT, D(RA)

    lhax/lhaux          RT, RA, RB与 lhz 不同的是,该指令将所读取的半字的最高位 (RT[48]) 填充到 RT[32:47],实际上就是形成一个 16

    位的补码有符号数。

    有效地址计算与上同;后缀 u, x 与上同。

    对 64 位情形,上述指令皆加后缀 'e',有效地址计算与上小节同。

    3.3.1.3 Load Halfword/Word

    Byte-Reverse从指定地址处读取 16 位/32 位数据,将字节反转后置入 RT,RT 高位置 0

    lhbrx   RT, RA, RB

    lwbrx   RT, RA, RB

    如: lwbrx   r3, r2, r1,若 r2 + r1 地址处的数据为 0x55aa66bb,则 r3 的结果为

    0xbb66aa55

    对 64 位情形,上述指令皆加后缀 'e',有效地址计算与上小节同。

    3.3.1.4 Load Multiple Word

    lmw    RT, D(RA)

    该指令将 RA + D 开始处的数据,顺序置入 RT ~ R31 中,共读取 31 - T 个字

    该指令无 64 位扩展。

    3.3.1.5 Load String Word

    lswi    RT, RA, NB      (后缀 i,表示立即数 Immediate)

    lswx    RT, RA, RB      (后缀 x,表示 Indexed 寻址方式)

    加载 n 个字节到 RT 开始的寄存器中;

    当 NB == 0 时 n = 32; NB != 0 时 n = NB,NB 取值范围为 0 ~ 31

    如 r3 = 0x1000 :

    lswi   r4, r3, 16

    则将 0x1000 处的 16 字节,依次写入 r4, r5, r6, r7

    对于 lswx,要加载的字节数则位于 XER[57:63]

    该指令无 64 位扩展。

    3.3.1.6 Load Word/Doubleword and

    Reserve

    lwarx    RT, RA, RB

    该指令与 lwzx 的差别在于,其还将处理器内部的 RESERVE 位置为 1,并将有效地址对应的物理地址放入 RESERVE_ADDR 中。

    该指令的 64 位版本为: lwarxe   RT, RA, RB,差别还是在于有效地址的 0 ~ 31 不被置 0

    此外还有一个 ldarxe   RT, RA, RB,与 lwarxe 的差别在于其加载 8 字节的数据。

    这三条指令常分别与 stwcx./stwcxe./stdcxe. 联用,用于实现锁操作,类似 MIPS 之 ll/sc 指令。

    3.3.1.7Store

    stb/stbu            RS, D(RA)

    stbx/stbux          RS, RA, RB

    sth/sthu            RS, D(RA)

    sthx/sthux          RS, RA, RB

    stw/stwu            RS, D(RA)

    stwx/stwux          RS, RA, RB

    该类指令将 RS 中的 8 位、16 位、32 位数据写入有效地址处。后缀 'u', 'x' 之含义与 3.3.1.1 同。

    上述 12 条指令加后缀 'e' 则用于 64 位。有效地址计算与与 3.3.1.1 同。

    另用于 64 位的还有对双字操作的支持:

    stde/stdue/stdxe/stduxe

    3.3.1.8 Store Halfword/Word

    Byte-Reverse

    sthbrx RS, RA, RB

    stwbrx RS, RA, RB

    将 RS 中的 16/32 bit

    的数据字节反转后置入有效地址处。该指令用于支持在大端系统上以小端序存储数据,亦或在小端系统上以大端序存储数据。

    对 64 位情形,上述指令皆加后缀 'e',有效地址计算与上小节同。

    3.3.1.9 Store Multiple Word

    smw   RS, D(RA)

    该指令将 RS ~ R31 中的数据 (一个字),写入到 RA + D 处

    该指令无 64 位扩展。

    3.3.1.10 Store String Word

    stswi      RS, RA, NB    (后缀 i,表示立即数 Immediate)

    stswx      RS, RA, RB    (后缀 x,表示 Indexed 寻址方式)

    与 lswi/lswx 的操作相反,其将 RS 开始的寄存器组中的 n 个字节,写入到有效地址处(位于 RA)

    当 NB == 0 时 n = 32; NB != 0 时 n = NB,NB 取值范围为 0 ~ 31

    如 r3 = 0x1000 :

    stswi   r4, r3, 16

    则将 r4, r5, r6, r7 中的 16 字节数据依次写入 0x1000 处

    对于 stswx,要加载的字节数则位于 XER[57:63]

    该指令无 64 位扩展。

    3.3.1.11 Store Word/Doubleword

    Conditional

    stwcx.         RS, RA, RB

    如果 RESERVE 位为 1,且 RA + RB 对应的物理地址与 RESERVE_ADDR 一致,则将 RS[32:63] 的内容写入到

    RA + RB 处,将 CR0[eq] 位置为 1 后,再将 RESERVE 位复位为 0。

    若条件不满足,则仅将 CR0[eq] 位置为 0

    可用该指令与 lwarx 联用,实现 spin_lock:

    li   r0, 1

    loop:

    lwarx   r4, 0, r3

    cmpwi   r4, 0          # r4[32:63] 与 0 比较

    bne loop

    stwcw.   r0, 0, r3

    bne   loop

    isync

    解锁则为:

    msync

    li   r0, 0

    stw   r0, 0(r3)

    下面的指令用于 64 位:

    stwcxe.       RS, RA, RB

    stdcxe.       RS, RA, RB

    差别在于有效地址的高 32 位不再被置为 0。

    3.3.2 整数算术运算指令

    3.3.3 整数逻辑运算指令

    3.3.4 整数比较指令

    cmp       BF, L, RA, RB

    cmpi       BF, L, RA, SI          # RA 与有符号立即数 SI 比较

    cmpl       BF, L, RA, RB          # RA, RB 逻辑比较。l

    ---> logical

    cmpli      BF, L, RA, UI          # RA 与无符号立即数 UI

    逻辑比较

    BF 取值 0 ~ 7,用于指定使用的 CR 域

    L 为 0,则为 32 位比较;为 1,则为 64 位比较

    如:

    cmpi      0, 0, r3, 5

    若 r3 > 5,则 CR0[gt] = 1;若 r3 < 5,则 CR0[lt] = 1

    3.3.5 整数陷阱指令

    tw      TO, RA, RB

    twi   TO, RA, SI

    TO 为立即数,5 位,从左到右标号为 0 ~ 4,依次表示小于、大于、等于、无符号小于、无符号大于。用于指定 Trap 的条件。

    SI: Signed Immediate

    如:

    twi   0x10, r3, 5

    则如果 r3 < 5,则陷入异常。

    以上用于单字 (32 bit) 比较,双字比较则用:

    td      TO, RA, RB

    tdi   TO, RA, SI

    3.3.6 整数移位指令

    3.3.6.1 Rotate

    rlwimi        RA, RS, SH, MB, ME            #

    Rotate Left Word Immediate then Mask Insert

    rlwinm        RA, RS, SH, MB, ME            #

    Rotate Left Word Immediate then AND with Mask

    rlwnm         RA, RS, RB, MB, ME            #

    Rotate Left Word then AND with Mask

    以下是该指令的一些例子:

    all r11 is: 0x55aa67bb

    r0 = 0x00000000

    rlwimi    r0, r11, 8, 0, 31

    r0 is: 0xaa67bb55

    r0 = 0x12345678

    rlwimi    r0, r11, 8, 0, 14

    r0 is: 0xaa665678

    r0 = 0x12345678

    rlwimi    r0, r11, 8, 28, 3

    r0 is: 0xa2345675

    即:取 RS 循环左移 SH 位后的 WB 到 WE 位,替换 RA 的 WB 到 WE 位。

    r0 = 0x00000000

    rlwinm    r0, r11, 8, 0, 31

    r0 is: 0xaa67bb55

    r0 = 0x12345678

    rlwinm    r0, r11, 8, 0, 14

    r0 is: 0xaa660000

    即:取 RS 循环左移 SH 位后的 WB 到 WE 位,替换归零后的 RA

    rldcl

    rldcr

    rldic

    rldicl

    rldicr

    rldimi

    3.3.6.2 Shift

    slw

    srw

    sraw

    srawi

    slw./srw./sraw./srawi.

    sld

    srd

    srad

    sradi

    3.3.7 XER 指令

    mcrxr          BF

    mcrxr64        BF

    3.4 浮点指令

    这类指令包括:

    浮点数据加载与存储指令

    浮点运算指令

    浮点数近似和转化指令

    浮点比较指令

    浮点状态和控制寄存器指令

    有关该指令的详情留待以后以《PowerPC 浮点结构》的形式讨论吧。

    3.5 处理器控制指令

    这类指令包括用于支持异常中断处理的:

    sc            System Call

    rfci          Return From Critical Interrupt

    rfi         Return From Interrup

    用于处理器控制寄存器维护的:

    mfspr      RT, SPRN         Move From SPRN (Special

    Purpose Register) to RT

    mtspr      SPRN, RS         Move RS To SPRN

    mfdcr      RT, DCRN         Move From DCRN (Device

    Control Register) to RT

    mtdcr      DCRN, RS         Move RS To DCRN

    mfmsr      RT            Move From MSR to RT

    mtmsr      RS            Move RS To MSR

    wrtee        RA    Write MSR External Enable, MSR[EE] = RA[48]

    wrteei    E   Write MSR External Enable Immediate, MSR[EE] = E

    以及用于指令同步的:

    isync

    其保证在其之前的所有指令皆提交,在其自己被提交前,其之后的指令不会进入流水线

    3.6 存储管理相关指令

    这类指令包括用于 TLB 管理的:

    tlbivax

    tlbre

    tlbwe

    tlbsx

    tlbsync

    tlbivaxe

    tlbsxe

    用于 Cache 管理的:

    dcba/dcbf/dcbi/dcbst/dcbt/dcbtst/dctz/icbi/icbt

    dcbae/dcbfe/dcbie/dcbste/dcbte/dcbtste/dctze/icbie/icbte

    用于存储同步的:

    msync

    mbar

    展开全文
  • 做了点东西需要使用linux下ldap库,我装的linux上已经有ldap库,在程序中#include了。用gcc编译时:gccfilename.c,会报找...后来要求使用powerpc-linux-uclibc-gcc来进行编译那个文件,结果发生奇怪的事,使用powerp...
  • 32位PowerPC构架通用寄存器分析及总结
  • 在arch/powerpc/cpu/mpc85xx 下有两个.S文件release.Sstart.S在release.S中代码只有两行.section .resetvec,"ax"b _start_e500跳转到start.S中执行.section .bootpg,"ax".globl _start_e500_start_e500:/* clear ...
  • 本书分8章,第1章讲述linux powerpc的组成;第2~4章讲述了有关powerpc处理器的基础知识,包括指令集、寄存器、内存体系结构等;第5~8章讲述linux系统在powerpc处理器中的运行,包括进程调度、中断处理、内存管理和...
  • PowerPC构架应用程序二进制接口(ABI)及堆栈帧详解
  • 32位PowerPC构架通用寄存器分析及总结
  • https://www.cnblogs.com/geekard/archive/2012/05/06/powerpc-toolchain.html 问题: 1、最后一步交叉编译GCC,make all时提示找不到libc.so.6,报错如下: /bin/sh …/…/…/gcc-4.6.2/libgcc/…/mkinstalldirs . ...
  • 32位PowerPC构架通用寄存器分析及总结
  • PowerPC汇编指令集

    2020-12-20 14:51:56
    PowerPC 体系结构规范(PowerPCArchitecture Specification)发布于 1993 年,它是一个 64 位规范 ( 也包含 32 位子集)。几乎所有常规可用的 PowerPC(除了新型号 IBM RS/6000 和所有 IBM pSeries 高端服务器)都是 32 ...
  • Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输。Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。...
  • 第三部分 搭建过程3.1 创建过程概述这个GUN工具链的创建过程可以分为5步Step 1:安装基于PowerPC的linux头文件;备注:创建头文件是编译库文件所必须的,这一步只要在创建glibc库文件之前就可以了。Step 2:安装...
  • 1997年,IBM推出了RS64全64位PowerPC处理器,并于次年发布了POWER3全64位PowerPC/POWER处理器。PowerPC的历史可以追溯到早在1990年随RISC System/6000一起被介绍的IBM POWER架构。该设计是从早期的RISC架构(比如IBM ...
  • PowerPc下的寻址模式

    2021-05-19 12:20:53
    本篇文章主要描述了Powerpc的寻址模式,让自己对内存映射、寻址的概念理解深入些。在开始讨论寻址模式之前,让我们首先来回顾一下计算机内存的概念。可能之前已经了解了关于内存和编程的一些事实,但是由于现代编程...
  • powerpc e500的内核启动,关于tlb的初始化可以说是重头戏。看懂这段代码后,powerpc的虚实映射基本不在话下。这段初始化tlb要考虑的,主要是将boot可能初始化过的tlb全清零,然后自己建立一套PAGE_OFFSET的虚实映射...
  • PowerPC处理器在通信领域和工业控制领域也都有着广泛的使用。所以文中以mpc8313erdb平台新添加网卡芯片为例,讲述如何使linux支持新添加的网卡设备。关键词:PowerPC;linux;设备树Bootloader除了引导系统之外,另...
  • PowerPC 异常类型与异常向量将处理器内部产生的异常和外部中断信号统一称为异常 (Exception)。异常发生时,PowerPC 处理器根据异常的类型,分别跳转到不同的异常向量地址,执行异常处理程序。异常类型到异常向量的...
  • Ubuntu搭建交叉编译环境说点什么吧为什么需要交叉编译交叉编译环境简介Arm交叉编译环境搭建Mips交叉编译环境搭建Powerpc交叉编译环境搭建 说点什么吧 为什么需要交叉编译 如果要做设备、嵌入式等工作,交叉编译必不...
  • 我们可以在Intel和ARM机器上检查/ proc / ...我需要在AIX和Linux下为PowerPC做同样的事情.使用Linux进行测试如下所示.输出在compile farm上由GCC112产生.$cat /proc/cpuinfoprocessor : 0cpu : POWER8E (raw), altiv...
  • Powerpc汇编编译学习笔记 Powerpc汇编编译学习笔记 本篇文章结合网上学习的部分知识,搭建对于Powerpc的编译环境。 1.准备 本人使用Fedora 33 64bit虚拟机。 核心Binutils用于对二进制文件进行处理 下载:...
  • powerpc-fsl-linux-gnuspe-ld.bfd: cannot find -lgcc 1.确定环境是已经设置好的:echo $CC 看下环境变量设置情况 echo $CC powerpc-fsl-linux-gnuspe-gcc -m32 -mcpu=8548 -mabi=spe -mspe -mfloat-gprs=double -...
  • 就其两种操作模式之一而言,PowerPC AS 实质上与最初的 PowerPC 相同,而 PowerPC Book E 在它的 Book III 级别的定义中,已经走向了不同的方向,为低价格、低功率以及体系结构灵活的嵌入式应用进行了最...
  • 看懂PowerPC汇编,需要如下3方面的知识: PowerPC指令集架构即PowerISA,可以从Power.org获得,包括寄存器定义,数据模型,寻址方式和指令定义以及指令助记符; PowerPCABI即应用程序二进制接口,即寄存器的使用...
  • ARM、MIPS、PowerPC 均是基于精简指令集RISC机器处理器的架构 X86是基于复杂指令集的架构,Atom则基于是x86指令集的精简版 ARM架构 ARM架构,过去称作进阶精简指令集机器(Advanced RISC Machine,更早称作:Acorn ...
  • powerpc e500内核中断系统有两部分组成一个是e500的内核,一个是中断异常控制器programmable interrupt controller (PIC) interrupt protocole500内核有些特殊之处是:在e500内核进入中断和异常处理程序时不能关闭...
  • PowerPC平台Linux的移植(二)PowerPC平台Linux的移植(二)处理并编译内核源代码Linux内核的配置系统由三个部分组成,分别是:1. Makefile:分布在 Linux 内核源代码中的 Makefile,定义 Linux 内核的编译规则;2. 配置...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,499
精华内容 26,999
关键字:

PowerPC

友情链接: CMd5_Unicode.rar