[<<] [<] Page 1 of 1 [>] [>>] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[<<] [<] Page 1 of 1 [>] [>>] |