This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

disable and remove fpu instructions

Hello,

I would like to disable the FPU on my ARM Cortex A9 CPU during the boot software execution.

But I need to employ RSA authentication to guarantee the integrity of my image partitions.

As I am trying to compile my boot software using arm-none-eabi-gcc with no FPU support, I noticed that the Xilinx xilrsa.a library may access VFP registers (FPU or NEON). See the exact errors at the bottom of my post.

However as I looked at the disassembly code, no vector instruction appears (e.g. vadd, vstr...) , and all accessed registers are with the general purpose range (0~15).

What would trigger this error then? Is it because the library has been compiled with arguments -mfpu=vfpv3  and -mfloat-abi=hard ??

Thank you

Florian

/usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/librsa.a(SoftRSA.o) uses VFP register arguments, ssbl.elf does not
/usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/librsa.a(SoftRSA.o)
/usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/librsa.a(SoftSHA256.o) uses VFP register arguments, ssbl.elf does not
/usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/librsa.a(SoftSHA256.o)

  • The output from readelf -A librsa.a shows that mfpu has been set as vfpv3 (Tag_FP_arch = VFPv3) and that mfloat-abi was set as hard (Tag_ABI_VFP_args = VFP registers).

    The full output is shown below. Does that mean I must compile the rest of the code with FPU enabled?

  • My problem is that I try to compile my software with a custom makefile, and I still have inconsistency with the float abi.

    If I use the Xilinx SDK automatically generated Makefile it seems to apply the hard float ABI everywhere and does not have this issue. But originally I wanted to disable FPU... so I decided to write the custom Makefile.

    Also the arm-none-eabi-gcc compiler/linker does not interpret the -nofp argument as could be expected from the GNU Toolchain.

    Makefile:

    CC := arm-none-eabi-gcc
    CC_FLAGS :=  
    CFLAGS := 
    ECFLAGS := 
    LDFLAGS := 
    
    c_SOURCES := $(wildcard *.c)
    S_SOURCES := $(wildcard *.S)
    s_SOURCES := $(wildcard *.s)
    INCLUDES := $(wildcard *.h)
    OBJS := $(patsubst %.c, %.o, $(c_SOURCES))
    OBJS += $(patsubst %.S, %.o, $(S_SOURCES))
    OBJS += $(patsubst %.s, %.o, $(s_SOURCES))
    
    BSP_DIR	:= ../../ssbl_bsp/
    
    LIBS := libxil.a 
    EXEC := ssbl.elf
    
    INCLUDEPATH := -I$(BSP_DIR)/ps7_cortexa9_0/include
    INCLUDEPATH += -Igpio
    INCLUDEPATH += -Iboard_gpiops
    INCLUDEPATH += -Iboard_interrupt
    INCLUDEPATH += -Iboard_mio
    INCLUDEPATH += -Iboard_uartps
    LIBPATH := $(BSP_DIR)/ps7_cortexa9_0/lib
    
    BOARD	:= zc702
    DEPS	:= depends
    
    AS=arm-none-eabi-gcc
    CFLAGS = -Wall -O0 -g3 -c -fmessage-length=0 
    CFLAGS += -DSSBL_DEBUG -DRSA-SUPPORT -DSSBL_DEBUG_INFO -DSSBL_DEBUG_GENERAL -DDEBUG -DSSBL_DEBUG_RSA
    CFLAGS += -DXUARTPS_USED -DCFG_UARTPS -DSRU_USED -DSRU_MODULE -DNANDPS_USED -DQSPIPS_USED -DXGPIOPS_USED -DSCU_TIMER_USER -DHYPERION
    LINKER=arm-none-eabi-gcc
    LDFLAGS = -Wl,--start-group,-lxil,-lgcc,-lc,--end-group -Wl,--start-group,-lxilffs,-lxil,-lgcc,-lc,--end-group -Wl,--start-group,-lrsa,-lxil,-lgcc,-lc,--end-group
    LD1FLAGS = -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -Wl,-build-id=none -Wl,-T -Wl,../src/lscript.ld -L$(LIBPATH) -specs=Xilinx.spec
    ECFLAGS = -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard
    
    all: $(EXEC) ssbl.elf.size
    
    $(EXEC): $(LIBS) $(OBJS) $(INCLUDES)
    	$(LINKER) $(LD1FLAGS) -o $@ $(OBJS) $(LDFLAGS)
    	rm -rf $(OBJS)
    	
    $(LIBS): 
    	echo "Compiling bsp"
    	make -C $(BSP_DIR) -k all "CC=arm-none-eabi-gcc" "AR=arm-none-eabi-ar" "C_FLAGS=-O2 -c" "EC_FLAGS=-g"
    
    %.o:%.c
    	$(CC) $(CC_FLAGS) $(CFLAGS) $(ECFLAGS) $(INCLUDEPATH) $< -o $@ 
    
    %.o:%.S
    	$(AS) $(CC_FLAGS) $(CFLAGS) $(ECFLAGS) $(INCLUDEPATH) $< -o $@
    	
    %.o:%.s
    	$(AS) $(CC_FLAGS) $(CFLAGS) $(ECFLAGS) $(INCLUDEPATH) $< -o $@ 
    
    clean:
    	rm -rf $(OBJS) $(BSP_DIR)/ps7_cortexa9_0/lib/* $(EXEC)
    	
    ssbl.elf.size: ssbl.elf
    	@echo 'Invoking: ARM v7 Print Size'
    	arm-none-eabi-size ssbl.elf  |tee "ssbl.elf.size"
    	@echo 'Finished building: $@'
    	@echo ' '

    error log:

    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: pcap.o uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file pcap.o
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: nand.o uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file nand.o
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: main.o uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file main.o
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ssbl_hooks.o uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ssbl_hooks.o
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: boot_utils.o uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file boot_utils.o
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: qspi.o uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file qspi.o
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: performance.o uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file performance.o
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: rsa.o uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file rsa.o
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: md5.o uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file md5.o
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: image_mover.o uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file image_mover.o
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: nor.o uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file nor.o
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: sd.o uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file sd.o
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xqspips.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xqspips.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xqspips_sinit.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xqspips_sinit.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xqspips_options.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xqspips_options.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(vectors.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(vectors.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xil_assert.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xil_assert.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xil_cache.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xil_cache.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xil_exception.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xil_exception.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xil_printf.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xil_printf.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xil_sleepcommon.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xil_sleepcommon.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xtime_l.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xtime_l.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xdevcfg_intr.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xdevcfg_intr.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xdevcfg_sinit.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xdevcfg_sinit.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xdevcfg.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xdevcfg.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xnandps_sinit.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xnandps_sinit.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xnandps_bbm.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xnandps_bbm.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xnandps.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xnandps.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xnandps_g.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xnandps_g.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xqspips_g.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xqspips_g.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(outbyte.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(outbyte.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(sleep.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(sleep.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(usleep.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(usleep.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xdevcfg_g.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xdevcfg_g.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xuartps_hw.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xuartps_hw.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xnandps_onfi.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(xnandps_onfi.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(_exit.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/libxil.a(_exit.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/librsa.a(SoftRSA.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/librsa.a(SoftRSA.o)
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: error: ../../ssbl_bsp//ps7_cortexa9_0/lib/librsa.a(SoftSHA256.o) uses VFP register arguments, ssbl.elf does not
    /usr/lib/gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file ../../ssbl_bsp//ps7_cortexa9_0/lib/librsa.a(SoftSHA256.o)
    

  • Alright, my solution is that:

    - the RSA library has been compiled with -mfpu=vpfv3 and -mfloat-abi=hard

    - But the disassembly code does not use any VPF instruction or register

    ==> I must compile all the code with -mfpu=vpfv3 and -mfloat-abi=hard, but the boot assembly code does not need to enable FPU (FPEXC register).