gnupic: gpasm segfaults (11) when compiling mpasm code


Previous by date: 18 Dec 2014 12:13:59 -0000 FreeBSD build failures and other requests, Vikas N Kumar
Next by date: 18 Dec 2014 12:13:59 -0000 Re:gpasm segfaults (11) when compiling mpasm code, Joe Pfeiffer
Previous in thread:
Next in thread:

Subject: gpasm segfaults (11) when compiling mpasm code
From: "Kustaa Nyholm" ####@####.####
Date: 18 Dec 2014 12:13:59 -0000
Message-Id: <1418904831845.123153.7530@webmail7>

Hi,

yesterday I was trying to compile this project
which is mpasm / Windows
on Mac with gputils-1.4.0-1 / gpasm:

http://www.diolan.com/pic/bootloader_dwn.html

When I try to compile it gpasm seg faults (11).

The compiler is invoked as:

~/gputils-1.4.0-1/build/gpasm/gpasm -p 18f4550 --mpasm-compatible -DdBOOTLOADER_VID=0x0000 -DBOOTLOADER_PID=0x0000 -DXTEA_KEY="ABCDEFGHIJKLMNOP" boot.asm -oboot.o

This is probably something in the source code that trigs
a corner case in gpasm which is probably easy to workaround
but I have very little experience with gpasm so if someone
could look at the offending source code (below) for obvious issues
or suggest a debug strategy that would be great.

br Kusti

boot.asm:
-----------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BootLoader. ;;
;; Copyright (C) 2007 Diolan ( http://www.diolan.com ) ;;
;; ;;
;; This program is free software: you can redistribute it and/or modify ;;
;; it under the terms of the GNU General Public License as published by ;;
;; the Free Software Foundation, either version 3 of the License, or ;;
;; (at your option) any later version. ;;
;; ;;
;; This program is distributed in the hope that it will be useful, ;;
;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;
;; GNU General Public License for more details. ;;
;; ;;
;; You should have received a copy of the GNU General Public License ;;
;; along with this program. If not, see <http://www.gnu.org/licenses/> ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; BootLoader Main code
;-----------------------------------------------------------------------------
#include "P18F4455.INC"
#include "boot.inc"
#include "io_cfg.inc"
#include "usb_defs.inc"
#include "usb_desc.inc"
#include "usb.inc"
#include "boot_if.inc"
;-----------------------------------------------------------------------------
; Configuration Bits
;-----------------------------------------------------------------------------
#if CPU_5V_HS
CONFIGPLLDIV = 4; OSC/4 for 16MHz
CONFIG CPUDIV = OSC1_PLL2; CPU_clk = PLL/2
CONFIG USBDIV = 2; USB_clk = PLL/2
CONFIG FOSC = HSPLL_HS; HS osc PLL
#else
CONFIGPLLDIV = 4; OSC/4 for 16MHz
CONFIG CPUDIV = OSC1_PLL2; CPU_clk = Fosc
CONFIG USBDIV = 2; USB_clk = PLL/2
CONFIG FOSC = HS; HS osc
#endif
CONFIG FCMEN = ON; Fail Safe Clock Monitor
CONFIG IESO = OFF; Int/Ext switchover mode
CONFIG PWRT = ON; PowerUp Timer
CONFIG BOR = OFF; Brown Out
CONFIG VREGEN = ON; Int Voltage Regulator
CONFIG WDT = OFF; WatchDog Timer
CONFIG MCLRE = ON; MCLR
CONFIG LPT1OSC = OFF; Low Power OSC
CONFIG PBADEN = ON; PORTB<4:0> A/D
CONFIG CCP2MX = ON; CCP2 Mux RC1
CONFIG STVREN = ON; Stack Overflow Reset
CONFIG LVP = OFF; Low Voltage Programming
CONFIG ICPRT = OFF; ICP
CONFIG XINST = ON; Ext CPU Instruction Set
CONFIGDEBUG = OFF; Background Debugging
CONFIG CP0 = ON; Code Protect
CONFIG CP1 = ON
CONFIG CP2 = ON
CONFIG CPB = ON ; Boot Sect Code Protect
CONFIG CPD = OFF ; EEPROM Data Protect
CONFIG WRT0 = OFF ; Table Write Protect
CONFIG WRT1 = OFF
CONFIG WRT2 = OFF
CONFIG WRTB = ON ; Boot Table Write Protest
CONFIG WRTC = ON ; CONFIG Write Protect
CONFIG WRTD = OFF ; EEPROM Write Protect
CONFIG EBTR0 = OFF; Ext Table Read Protect
CONFIG EBTR1 = OFF
CONFIG EBTR2 = OFF
CONFIG EBTRB = ON ; Boot Table Read Protect
;--------------------------------------------------------------------------
; External declarations
externusb_sm_state
externusb_sm_ctrl_state
externep1Bo
externep1Bi
externSetupPkt
externSetupPktCopy
externpSrc
externpDst
externCount
externctrl_trf_session_owner
externctrl_trf_mem
externeep_mark_set
;--------------------------------------------------------------------------
; Variables
BOOT_DATAUDATA
globalboot_cmd;
globalboot_rep;
globalactive_protocol
globalidle_rate
active_protocolres1
idle_rateres1
boot_cmdresBOOT_CMD_SIZE
boot_represBOOT_REP_SIZE
;--------------------------------------------------------------------------
; HID buffers
USB_HIDUDATA0x500
globalhid_report_out
globalhid_report_in
hid_report_outresHID_OUT_EP_SIZE; OUT packet buffet
hid_report_inresHID_IN_EP_SIZE; IN packed buffer

;--------------------------------------------------------------------------
BOOT_ASM_CODE CODE
externusb_init
externusb_sm_ctrl
externusb_sm_reset
externusb_sm_prepare_next_setup_trf
externcopy_boot_rep
externUSB_HID_DESC
externUSB_HID_RPT
externhid_process_cmd
;--------------------------------------------------------------------------
; main
; DESCR : Boot Loader main routine.
; WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
; WARNING WARNING
; WARNING This code is not a routine!!! WARNING
; WARNING RESET command is used to "exit" from main WARNING
; WARNING WARNING
; WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
; INPUT : no
; OUTPUT: no
;--------------------------------------------------------------------------
globalmain
main
UD_INIT
UD_TX'X'

; Decide what to run bootloader or application
#if USE_EEPROM_MARK
; Check EEPROM mark
movlwEEPROM_MARK_ADDR
movwfEEADR
movlw0x01
movwfEECON1
movlwEEPROM_MARK
subwfEEDATA, W
bzbootloader
#endif
; Check bootloader enable jumper
#ifdef USE_JP_BOOTLOADER_EN
setfJP_BOOTLOADER_TRIS
btfscJP_BOOTLOADER_PORT, JP_BOOTLOADER_PIN
gotoAPP_RESET_VECTOR; Run Application FW
#endif
; Run bootloader
brabootloader
reset
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!! WARNING NEVER RETURN IN NORMAL WAY !!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;--------------------------------------------------------------------------
; bootloader
; DESCR : Run the Boot Loader.
; WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
; WARNING WARNING
; WARNING This code is not a routine!!! WARNING
; WARNING Branch to bootloader occur if firmware WARNING
; WARNING updating mode is detected either throuch WARNING
; WARNING EEPROM MARK or FW Junper WARNING
; WARNING RESET command is used to "exit" WARNING
; WARNING from bootloader WARNING
; WARNING WARNING
; WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
; INPUT : no
; OUTPUT: no
globalbootloader
bootloader
#ifdef USE_LED
bcfLED_TRIS, LED_PIN
bcfLED, LED_PIN
#endif
clrfeep_mark_set; EEP_MARK will be cleared
rcallusb_init
; Main Loop
bootloader_loop
rcallusb_state_machine
rcallhid_process_cmd
rcallhid_send_report
brabootloader_loop
reset
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!! WARNING NEVER RETURN IN NORMAL WAY !!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;--------------------------------------------------------------------------
; usb_state_machine
; DESCR : Handles USB state machine according to USB Spec.
; Process low level action on USB controller.
; INPUT : no
; OUTPUT: no
;-----------------------------------------------------------------------------
globalusb_state_machine
usb_state_machine
; Bus Activity detected after IDLE state
usb_state_machine_actif
btfssUIR, ACTVIF
brausb_state_machine_actif_end
btfssUIE, ACTVIE
brausb_state_machine_actif_end
UD_TX'A'
bcfUCON, SUSPND
bcfUIE, ACTVIE
bcfUIR, ACTVIF
usb_state_machine_actif_end
; Pointless to continue servicing if the device is in suspend mode.
btfscUCON, SUSPND
return
; USB Bus Reset Interrupt.
; When bus reset is received during suspend, ACTVIF will be set first,
; once the UCONbits.SUSPND is clear, then the URSTIF bit will be asserted.
; This is why URSTIF is checked after ACTVIF.
;
; The USB reset flag is masked when the USB state is in
; DETACHED_STATE or ATTACHED_STATE, and therefore cannot
; cause a USB reset event during these two states.
usb_state_machine_rstif
btfssUIR, URSTIF
brausb_state_machine_rstif_end
btfssUIE, URSTIE
brausb_state_machine_rstif_end
rcallusb_sm_reset
usb_state_machine_rstif_end
; Idle condition detected
usb_state_machine_idleif
btfssUIR, IDLEIF
brausb_state_machine_idleif_end
btfssUIE, IDLEIE
brausb_state_machine_idleif_end
UD_TX'I'
bsfUIE, ACTVIE; Enable bus activity interrupt
bcfUIR, IDLEIF
bsfUCON, SUSPND; Put USB module in power conserve
; mode, SIE clock inactive
; Now, go into power saving
bcfPIR2, USBIF; Clear flag
bsfPIE2, USBIE; Set wakeup source
sleep
bcfPIE2, USBIE
usb_state_machine_idleif_end
; SOF Flag
usb_state_machine_sof
btfssUIR, UERRIF
brausb_state_machine_sof_end
btfssUIE, UERRIE
brausb_state_machine_sof_end
UD_TX'F'
bcfUIR, SOFIF
usb_state_machine_sof_end

; A STALL handshake was sent by the SIE
usb_state_machine_stallif
btfssUIR, STALLIF
brausb_state_machine_stallif_end
btfssUIE, STALLIE
brausb_state_machine_stallif_end
UD_TX'T'
btfssUEP0, EPSTALL
brausb_state_machine_stallif_clr
rcallusb_sm_prepare_next_setup_trf; Firmware Work-Around
bcfUEP0, EPSTALL
usb_state_machine_stallif_clr
bcfUIR, STALLIF
usb_state_machine_stallif_end
; USB Error flag
usb_state_machine_err
btfssUIR, UERRIF
brausb_state_machine_err_end
btfssUIE, UERRIE
brausb_state_machine_err_end
UD_TX'E'
bcfUIR, UERRIF
usb_state_machine_err_end
; Pointless to continue servicing if the host has not sent a bus reset.
; Once bus reset is received, the device transitions into the DEFAULT
; state and is ready for communication.
; if( usb_sm_state < USB_SM_DEFAULT )
;return;
movlw(USB_SM_DEFAULT - 1); Be carefull while changing USB_SM_* constants
cpfsgtusb_sm_state
return
; Detect Interrupt bit
usb_state_machine_trnif
btfssUIR, TRNIF
brausb_state_machine_trnif_end
btfssUIE, TRNIE
brausb_state_machine_trnif_end
; Only services transactions over EP0.
; Ignore all other EP transactions.
rcallusb_sm_ctrl
bcfUIR, TRNIF
usb_state_machine_trnif_end
return
;-----------------------------------------------------------------------------
; HID
;-----------------------------------------------------------------------------
; usb_sm_HID_init_EP
; DESCR : Initialize Endpoints for HID
; INPUT : no
; OUTPUT: no
;-----------------------------------------------------------------------------
globalusb_sm_HID_init_EP
usb_sm_HID_init_EP
#define USE_HID_EP_OUT 0
#if USE_HID_EP_OUT
movlwEP_OUT_IN | HSHK_EN
movwfHID_UEP; Enable 2 data pipes
movlbHIGH(HID_BD_OUT)
movlwHID_OUT_EP_SIZE
movwfBDT_CNT(HID_BD_OUT)
movlwLOW(hid_report_out)
movwfBDT_ADRL(HID_BD_OUT)
movlwHIGH(hid_report_out)
movwfBDT_ADRH(HID_BD_OUT)
movlw(_USIE | _DAT0 | _DTSEN)
movwfBDT_STAT(HID_BD_OUT)
#else
movlw(EP_IN | HSHK_EN)
movwfHID_UEP; Enable 1 data pipe
#endif
movlbHIGH(HID_BD_IN)
movlwLOW(hid_report_in)
movwfBDT_ADRL(HID_BD_IN)
movlwHIGH(hid_report_in)
movwfBDT_ADRH(HID_BD_IN)
movlw(_UCPU | _DAT1)
movwfBDT_STAT(HID_BD_IN)
movlb0
clrf(boot_rep + cmd)
return
;--------------------------------------------------------------------------
; hid_send_report
; DESCR : Sends HID reports to host
; INPUT : no
; OUTPUT: no
; Resources:
;FSR2:BDTs manipulations
;-----------------------------------------------------------------------------
globalhid_send_report
hid_send_report
movf(boot_rep + cmd), W; Z flag affected
bzhid_send_report_end
lfsrFSR2, BDT_STAT(HID_BD_IN)
btfscPOSTINC2, UOWN; BDT_STAT(HID_BD_IN)
brahid_send_report_end
; Copy boot_rep into hid_report_in
; Clear bytes of boot_rep
rcallcopy_boot_rep; BSR not changed
; BSR still valid for HID_BD_IN
movlwBOOT_REP_SIZE
; FSR2 points to BDT_CNT(HID_BD_IN)
movwfPOSTDEC2; BDT_CNT(HID_BD_IN)
; FSR2 points to BDT_STAT(HID_BD_IN)
movlw_DTSMASK
andwfINDF2, F; BDT_STAT(HID_BD_IN), Save only DTS bit
movlw(1 << DTS)
xorwfINDF2, F; BDT_STAT(HID_BD_IN), Toggle DTS bit
movlw_USIE|_DTSEN
iorwfINDF2, F; BDT_STAT(HID_BD_IN), Turn ownership to SIE
hid_send_report_end
return
;--------------------------------------------------------------------------
; usb_sm_HID_request
; DESCR : Process USB HID requests
; INPUT : no
; OUTPUT: no
;-----------------------------------------------------------------------------
globalusb_sm_HID_request
usb_sm_HID_request
UD_TX'H'
movf(SetupPktCopy + Recipient), W
andlwRCPT_MASK
sublwRCPT_INTF
btfssSTATUS, Z
return
usb_sm_HID_rq_rcpt
movf(SetupPktCopy + bIntfID), W
sublwHID_INTF_ID
btfssSTATUS, Z
return
usb_sm_HID_rq_rcpt_id
; There are two standard requests that we may support.
; 1. GET_DSC(DSC_HID,DSC_RPT,DSC_PHY);
; 2. SET_DSC(DSC_HID,DSC_RPT,DSC_PHY);
movf(SetupPktCopy + bRequest), W
sublwGET_DSC
bnzusb_sm_HID_rq_cls
movf(SetupPktCopy + bDscType), W
; WREG = WREG - DSC_HID !!!
addlw(-DSC_HID); DSC_HID = 0x21
bzusb_sm_HID_rq_dsc_hid
dcfsnzWREG; DSC_RPT = 0x22
brausb_sm_HID_rq_dsc_rpt
dcfsnzWREG; DSC_PHY = 0x23
brausb_sm_HID_rq_dsc_phy
usb_sm_HID_rq_dsc_unknown
UD_TX('!')
brausb_sm_HID_rq_cls
;--------Get DSC_HID descrptor address
usb_sm_HID_rq_dsc_hid
movlwLOW(USB_HID_DESC)
movwfpSrc
movlwHIGH(USB_HID_DESC)
movwf(pSrc + 1)
movlwUSB_HID_DESC_SIZE
usb_sm_HID_rq_dsc_hid_end
brausb_sm_HID_rq_dsc_end
;--------Get DSC_RPT descrptor address
usb_sm_HID_rq_dsc_rpt
movlwLOW(USB_HID_RPT)
movwfpSrc
movlwHIGH(USB_HID_RPT)
movwf(pSrc + 1)
movlwUSB_HID_RPT_SIZE
usb_sm_HID_rq_dsc_rpt_end
brausb_sm_HID_rq_dsc_end
;--------Get DSC_PHY descrptor address
usb_sm_HID_rq_dsc_phy
usb_sm_HID_rq_dsc_phy_end
brausb_sm_HID_request_end
;--------
usb_sm_HID_rq_dsc_end
movwfCount
bsfctrl_trf_session_owner, 0
bsfctrl_trf_mem, _RAM
brausb_sm_HID_request_end
;--------
; Class Request
usb_sm_HID_rq_cls
movf(SetupPktCopy + bmRequestType), W
andlwRQ_TYPE_MASK
sublwCLASS
bzusb_sm_HID_rq_cls_rq
UD_TX('*')
return
;--------
usb_sm_HID_rq_cls_rq
movf(SetupPktCopy + bRequest), W
dcfsnzWREG; GET_REPORT = 0x01
brausb_sm_HID_rq_cls_rq_grpt
dcfsnzWREG; GET_IDLE = 0x02
brausb_sm_HID_rq_cls_rq_gidle
dcfsnzWREG; GET_PROTOCOL = 0x03
brausb_sm_HID_rq_cls_rq_gprot
; SET_REPORT = 0x09 -> 9 - 3 = 6
; WREG = WREG - 6 !!!
addlw(-(SET_REPORT - GET_PROTOCOL))
bzusb_sm_HID_rq_cls_rq_srpt
dcfsnzWREG; SET_IDLE = 0x0A
brausb_sm_HID_rq_cls_rq_sidle
dcfsnzWREG; SET_PROTOCOL = 0x0B
brausb_sm_HID_rq_cls_rq_sprot
usb_sm_HID_rq_cls_rq_unknown
UD_TX('#')
brausb_sm_HID_request_end
;--------GET_REPORT
usb_sm_HID_rq_cls_rq_grpt
movlw0; No data to be transmitted
usb_sm_HID_rq_cls_rq_grpt_end
brausb_sm_HID_rq_cls_rq_end
;--------SET_REPORT
usb_sm_HID_rq_cls_rq_srpt
movlwLOW(boot_cmd)
movwfpDst
movlwHIGH(boot_cmd)
movwf(pDst + 1)
usb_sm_HID_rq_cls_rq_srpt_end
brausb_sm_HID_rq_cls_rq_end_ses
#define GET_SET_IDLE 0
#if GET_SET_IDLE
;--------GET_IDLE
usb_sm_HID_rq_cls_rq_gidle
UD_TX('j')
movlwLOW(idle_rate)
movwfpSrc
movlwHIGH(idle_rate)
movwf(pSrc + 1)
movlw1; For Count
usb_sm_HID_rq_cls_rq_gidle_end
brausb_sm_HID_rq_cls_rq_end
;--------SET_IDLE
usb_sm_HID_rq_cls_rq_sidle
UD_TX('x')
movff(SetupPktCopy + (wValue + 1)), idle_rate
usb_sm_HID_rq_cls_rq_sidle_end
brausb_sm_HID_rq_cls_rq_end_ses
#endif
#define GET_SET_PROTOCOL 0
#if GET_SET_PROTOCOL
;--------GET_PROTOCOL
usb_sm_HID_rq_cls_rq_gprot
UD_TX('y')
movlwLOW(active_protocol)
movwfpSrc
movlwHIGH(active_protocol)
movwf(pSrc + 1)
movlw1; For Count
usb_sm_HID_rq_cls_rq_gprot_end
brausb_sm_HID_rq_cls_rq_end
;--------SET_PROTOCOL
usb_sm_HID_rq_cls_rq_sprot
UD_TX('z')
movf(SetupPktCopy + wValue), W
movwfactive_protocol
usb_sm_HID_rq_cls_rq_sprot_end
brausb_sm_HID_rq_cls_rq_end_ses
#endif
usb_sm_HID_rq_cls_rq_end
movwfCount
bcfctrl_trf_mem, _RAM
usb_sm_HID_rq_cls_rq_end_ses
bsfctrl_trf_session_owner, 0
;--------
#if !GET_SET_IDLE
usb_sm_HID_rq_cls_rq_gidle
#if UART_DEBUG
UD_TX('j')
brausb_sm_HID_request_end
#endif
usb_sm_HID_rq_cls_rq_sidle
#if UART_DEBUG
UD_TX('x')
brausb_sm_HID_request_end
#endif
#endif
#if !GET_SET_PROTOCOL
usb_sm_HID_rq_cls_rq_gprot
#if UART_DEBUG
UD_TX('y')
brausb_sm_HID_request_end
#endif
usb_sm_HID_rq_cls_rq_sprot
#if UART_DEBUG
UD_TX('z')
brausb_sm_HID_request_end
#endif
#endif
usb_sm_HID_request_end
return
;--------------------------------------------------------------------------
END


Previous by date: 18 Dec 2014 12:13:59 -0000 FreeBSD build failures and other requests, Vikas N Kumar
Next by date: 18 Dec 2014 12:13:59 -0000 Re:gpasm segfaults (11) when compiling mpasm code, Joe Pfeiffer
Previous in thread:
Next in thread:


Powered by ezmlm-browse 0.20.