fw.elf: file format elf32-littlearm Disassembly of section .text: 08000000 : 8000000: 20020000 080011e3 080006cf 080006cd ... ............ 8000010: 080006cd 080006cd 080006cd 00000000 ................ ... 800002c: 080006cf 080006cf 00000000 08007815 .............x.. 800003c: 08008019 080006cd 080006cd 080006cd ................ 800004c: 080006cd 080006cd 080006cd 080006cd ................ 800005c: 080006cd 080006cd 080006cd 080006cd ................ 800006c: 080006cd 080006cd 080006cd 080006cd ................ 800007c: 080006cd 080006cd 080006cd 080006cd ................ 800008c: 080006cd 080006cd 080006cd 080006cd ................ 800009c: 080006cd 080006cd 080006cd 080006cd ................ 80000ac: 080006cd 080006cd 080006cd 080006cd ................ 80000bc: 080006cd 080006cd 080006cd 080006cd ................ 80000cc: 080006cd 080006cd 080006cd 080006cd ................ 80000dc: 080006cd 080006cd 080006cd 080006cd ................ 80000ec: 080006cd 080006cd 080006cd 080006cd ................ 80000fc: 080006cd 080006cd 080006cd 080006cd ................ 800010c: 080006cd 080006cd 080006cd 080006cd ................ 800011c: 080006cd 080006cd 080006cd 080006cd ................ 800012c: 080006cd 080006cd 080006cd 080006cd ................ 800013c: 080006cd 080006cd 080006cd 080006cd ................ 800014c: 08000eab 080006cd 080006cd 080006cd ................ 800015c: 080006cd 080006cd 080006cd 080006cd ................ 800016c: 080006cd 080006cd 080006cd 080006cd ................ 800017c: 080006cd 080006cd 080006cd 080006cd ................ 800018c: 080006cd 080006cd 080006cd 080006cd ................ 800019c: 080006cd 080006cd 080006cd 080006cd ................ 080001ac : return USBD_REQ_NOTSUPP; } static void usbd_set_config(usbd_device *usbd_dev, uint16_t wValue) { switch (wValue) { /* configuration # */ 80001ac: 2901 cmp r1, #1 { 80001ae: b537 push {r0, r1, r2, r4, r5, lr} 80001b0: 4604 mov r4, r0 switch (wValue) { /* configuration # */ 80001b2: /-------- d120 bne.n 80001f6 <usbd_set_config.lto_priv.0+0x4a> } void usbd_ep_setup(usbd_device *usbd_dev, uint8_t addr, uint8_t type, uint16_t max_size, usbd_endpoint_callback callback) { usbd_dev->driver->ep_setup(usbd_dev, addr, type, max_size, callback); 80001b4: | f8d0 30fc ldr.w r3, [r0, #252] @ 0xfc 80001b8: | 4a14 ldr r2, [pc, #80] @ (800020c ) 80001ba: | 9200 str r2, [sp, #0] 80001bc: | 2202 movs r2, #2 80001be: | 689d ldr r5, [r3, #8] 80001c0: | 4611 mov r1, r2 80001c2: | 2340 movs r3, #64 @ 0x40 80001c4: | 47a8 blx r5 80001c6: | f8d4 30fc ldr.w r3, [r4, #252] @ 0xfc 80001ca: | 4a11 ldr r2, [pc, #68] @ (8000210 ) 80001cc: | 9200 str r2, [sp, #0] 80001ce: | 689d ldr r5, [r3, #8] 80001d0: | 2202 movs r2, #2 80001d2: | 2340 movs r3, #64 @ 0x40 80001d4: | 2182 movs r1, #130 @ 0x82 80001d6: | 4620 mov r0, r4 80001d8: | 47a8 blx r5 uint8_t type_mask, usbd_control_callback callback) { int i; for (i = 0; i < MAX_USER_CONTROL_CALLBACK; i++) { 80001da: | 2300 movs r3, #0 if (usbd_dev->user_control_callback[i].cb) { 80001dc: | f104 0268 add.w r2, r4, #104 @ 0x68 80001e0: | /-> f852 1033 ldr.w r1, [r2, r3, lsl #3] 80001e4: | /--|-- b149 cbz r1, 80001fa <usbd_set_config.lto_priv.0+0x4e> for (i = 0; i < MAX_USER_CONTROL_CALLBACK; i++) { 80001e6: | | | 3301 adds r3, #1 80001e8: | | | 2b04 cmp r3, #4 80001ea: | | \-- d1f9 bne.n 80001e0 <usbd_set_config.lto_priv.0+0x34> } void usbd_register_set_altsetting_callback(usbd_device *usbd_dev, usbd_set_altsetting_callback callback) { usbd_dev->user_callback_set_altsetting = callback; 80001ec: | | /-> 4b09 ldr r3, [pc, #36] @ (8000214 ) 80001ee: | | | f8c4 30f8 str.w r3, [r4, #248] @ 0xf8 usbd_dev->user_callback_sof = callback; 80001f2: | | | 4b09 ldr r3, [pc, #36] @ (8000218 ) 80001f4: | | | 64a3 str r3, [r4, #72] @ 0x48 usbd_register_set_altsetting_callback(usbd_dev, ecm_altset_cb); usbd_register_sof_callback(usbd_dev, ecm_sof_cb); }; } 80001f6: \--|--|-> b003 add sp, #12 80001f8: | | bd30 pop {r4, r5, pc} 80001fa: \--|-> eb04 03c3 add.w r3, r4, r3, lsl #3 continue; } usbd_dev->user_control_callback[i].type = type; 80001fe: | f647 7221 movw r2, #32545 @ 0x7f21 8000202: | f8a3 206c strh.w r2, [r3, #108] @ 0x6c usbd_dev->user_control_callback[i].type_mask = type_mask; usbd_dev->user_control_callback[i].cb = callback; 8000206: | 4a05 ldr r2, [pc, #20] @ (800021c ) 8000208: | 669a str r2, [r3, #104] @ 0x68 return 0; 800020a: \-- e7ef b.n 80001ec <usbd_set_config.lto_priv.0+0x40> 800020c: 08001711 .word 0x08001711 8000210: 08001299 .word 0x08001299 8000214: 08001751 .word 0x08001751 8000218: 080012c1 .word 0x080012c1 800021c: 080017cd .word 0x080017cd 08000220 : static void usbd_intr(usbd_device *udev) { 8000220: b508 push {r3, lr} usbd_dev->driver->poll(usbd_dev); 8000222: f8d0 30fc ldr.w r3, [r0, #252] @ 0xfc 8000226: 6a5b ldr r3, [r3, #36] @ 0x24 8000228: 4798 blx r3 * @param[in] irqn Unsigned int8. Interrupt number @ref CM3_nvic_defines_irqs */ void nvic_enable_irq(uint8_t irqn) { NVIC_ISER(irqn / 32) = (1 << (irqn % 32)); 800022a: f04f 23e0 mov.w r3, #3758153728 @ 0xe000e000 800022e: 2208 movs r2, #8 8000230: f8c3 2108 str.w r2, [r3, #264] @ 0x108 usbd_poll(udev); nvic_enable_irq(__usb_irq); } 8000234: bd08 pop {r3, pc} 08000236 : LWIP_UNUSED_ARG(netif); LWIP_UNUSED_ARG(p); LWIP_UNUSED_ARG(ipaddr); return ERR_IF; } 8000236: f06f 000b mvn.w r0, #11 800023a: 4770 bx lr 0800023c : extern void usb_init(void); /* * */ static void idle_cb(void *ctx) { (void)ctx; } 800023c: 4770 bx lr 0800023e <_out_null>: // internal null output static inline void _out_null(char character, void* buffer, size_t idx, size_t maxlen) { (void)character; (void)buffer; (void)idx; (void)maxlen; } 800023e: 4770 bx lr 08000240 : return usbd_dev->driver->ep_write_packet(usbd_dev, addr, buf, len); } uint16_t usbd_ep_read_packet(usbd_device *usbd_dev, uint8_t addr, void *buf, uint16_t len) { 8000240: b410 push {r4} return usbd_dev->driver->ep_read_packet(usbd_dev, addr, buf, len); 8000242: f8d0 40fc ldr.w r4, [r0, #252] @ 0xfc 8000246: 6a24 ldr r4, [r4, #32] 8000248: 46a4 mov ip, r4 } 800024a: f85d 4b04 ldr.w r4, [sp], #4 return usbd_dev->driver->ep_read_packet(usbd_dev, addr, buf, len); 800024e: 4760 bx ip 08000250 : { 8000250: b510 push {r4, lr} struct pbuf *q = *p; 8000252: 6804 ldr r4, [r0, #0] len = usbd_ep_read_packet(usbdev, ECM_OUT_ENDP_ADDR, 8000254: 4804 ldr r0, [pc, #16] @ (8000268 ) 8000256: 6862 ldr r2, [r4, #4] 8000258: 6800 ldr r0, [r0, #0] 800025a: 2340 movs r3, #64 @ 0x40 800025c: 2102 movs r1, #2 800025e: f7ff ffef bl 8000240 <usbd_ep_read_packet> q->len = q->tot_len = len; 8000262: 8120 strh r0, [r4, #8] 8000264: 8160 strh r0, [r4, #10] } 8000266: bd10 pop {r4, pc} 8000268: 20000060 .word 0x20000060 0800026c : void usbd_ep_stall_set(usbd_device *usbd_dev, uint8_t addr, uint8_t stall) { usbd_dev->driver->ep_stall_set(usbd_dev, addr, stall); 800026c: f8d0 30fc ldr.w r3, [r0, #252] @ 0xfc 8000270: 691b ldr r3, [r3, #16] 8000272: 4718 bx r3 08000274 : static enum usbd_request_return_codes usb_standard_set_address(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len) { 8000274: b508 push {r3, lr} (void)req; (void)buf; (void)len; /* The actual address is only latched at the STATUS IN stage. */ if ((req->bmRequestType != 0) || (req->wValue >= 128)) { 8000276: 780b ldrb r3, [r1, #0] 8000278: /----------- b97b cbnz r3, 800029a <usb_standard_set_address+0x26> 800027a: | 8849 ldrh r1, [r1, #2] 800027c: | 297f cmp r1, #127 @ 0x7f 800027e: | /-------- d807 bhi.n 8000290 <usb_standard_set_address+0x1c> /* * Special workaround for STM32F10[57] that require the address * to be set here. This is undocumented! */ if (usbd_dev->driver->set_address_before_status) { 8000280: | | f8d0 30fc ldr.w r3, [r0, #252] @ 0xfc usbd_dev->current_address = req->wValue; 8000284: | | b2c9 uxtb r1, r1 8000286: | | 7581 strb r1, [r0, #22] if (usbd_dev->driver->set_address_before_status) { 8000288: | | f893 2030 ldrb.w r2, [r3, #48] @ 0x30 800028c: | | /-- b912 cbnz r2, 8000294 <usb_standard_set_address+0x20> usbd_dev->driver->set_address(usbd_dev, req->wValue); } return USBD_REQ_HANDLED; 800028e: | | /--|-> 2301 movs r3, #1 } 8000290: | >--|--|-> 4618 mov r0, r3 8000292: | | | | bd08 pop {r3, pc} usbd_dev->driver->set_address(usbd_dev, req->wValue); 8000294: | | | \-> 685b ldr r3, [r3, #4] 8000296: | | | 4798 blx r3 8000298: | | \----- e7f9 b.n 800028e <usb_standard_set_address+0x1a> return USBD_REQ_NOTSUPP; 800029a: \--|-------> 2300 movs r3, #0 800029c: \-------- e7f8 b.n 8000290 <usb_standard_set_address+0x1c> 0800029e : static enum usbd_request_return_codes usb_standard_set_configuration(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len) { 800029e: b5f8 push {r3, r4, r5, r6, r7, lr} (void)req; (void)buf; (void)len; if (req->wValue > 0) { 80002a0: 884a ldrh r2, [r1, #2] { 80002a2: 4604 mov r4, r0 80002a4: 460d mov r5, r1 if (req->wValue > 0) { 80002a6: /-------- b172 cbz r2, 80002c6 <usb_standard_set_configuration+0x28> for (i = 0; i < usbd_dev->desc->bNumConfigurations; i++) { 80002a8: | 6803 ldr r3, [r0, #0] 80002aa: | 7c59 ldrb r1, [r3, #17] 80002ac: | 2300 movs r3, #0 80002ae: | /----> 4299 cmp r1, r3 80002b0: | | /-- d801 bhi.n 80002b6 <usb_standard_set_configuration+0x18> found_index = i; break; } } if (found_index < 0) { return USBD_REQ_NOTSUPP; 80002b2: | | | 2000 movs r0, #0 } } } return USBD_REQ_HANDLED; } 80002b4: /--|--|--|-> bdf8 pop {r3, r4, r5, r6, r7, pc} == usbd_dev->config[i]->bConfigurationValue) { 80002b6: | | | \-> 6860 ldr r0, [r4, #4] 80002b8: | | | f850 0023 ldr.w r0, [r0, r3, lsl #2] if (req->wValue 80002bc: | | | 7940 ldrb r0, [r0, #5] 80002be: | | | 4290 cmp r0, r2 80002c0: | | | /-- d003 beq.n 80002ca <usb_standard_set_configuration+0x2c> for (i = 0; i < usbd_dev->desc->bNumConfigurations; i++) { 80002c2: | | | | 3301 adds r3, #1 80002c4: | | \--|-- e7f3 b.n 80002ae <usb_standard_set_configuration+0x10> int found_index = -1; 80002c6: | \-----|-> f04f 33ff mov.w r3, #4294967295 @ 0xffffffff usbd_dev->current_config = found_index + 1; 80002ca: | \-> 3301 adds r3, #1 80002cc: | b2db uxtb r3, r3 80002ce: | 75e3 strb r3, [r4, #23] if (usbd_dev->current_config > 0) { 80002d0: | /-- b94b cbnz r3, 80002e6 <usb_standard_set_configuration+0x48> usbd_dev->driver->ep_reset(usbd_dev); 80002d2: | /-----|-> f8d4 30fc ldr.w r3, [r4, #252] @ 0xfc 80002d6: | | | 4620 mov r0, r4 80002d8: | | | 68db ldr r3, [r3, #12] 80002da: | | | 4798 blx r3 if (usbd_dev->user_callback_set_config[0]) { 80002dc: | | | f8d4 30e8 ldr.w r3, [r4, #232] @ 0xe8 80002e0: /--|--|-----|-- b9cb cbnz r3, 8000316 <usb_standard_set_configuration+0x78> return USBD_REQ_HANDLED; 80002e2: /--|--|--|-----|-> 2001 movs r0, #1 80002e4: | | \--|-----|-- e7e6 b.n 80002b4 <usb_standard_set_configuration+0x16> cfg = usbd_dev->config[usbd_dev->current_config - 1]; 80002e6: | | | \-> f103 4380 add.w r3, r3, #1073741824 @ 0x40000000 80002ea: | | | 6862 ldr r2, [r4, #4] 80002ec: | | | 3b01 subs r3, #1 80002ee: | | | f852 3023 ldr.w r3, [r2, r3, lsl #2] int totalLen = cfg->wTotalLength; 80002f2: | | | 885a ldrh r2, [r3, #2] while(totalLen > 0) { 80002f4: | | | /----> 2a00 cmp r2, #0 80002f6: | | \--|----- ddec ble.n 80002d2 <usb_standard_set_configuration+0x34> if(totalLen >= (int)sizeof(struct usb_interface_descriptor)) { 80002f8: | | | 2a08 cmp r2, #8 80002fa: | | | /-- dd08 ble.n 800030e <usb_standard_set_configuration+0x70> if(ptr[1] == USB_DT_INTERFACE) { 80002fc: | | | | 7859 ldrb r1, [r3, #1] 80002fe: | | | | 2904 cmp r1, #4 8000300: | | | +-- d105 bne.n 800030e <usb_standard_set_configuration+0x70> if(!usbd_dev->current_iface[iface->bInterfaceNumber]) 8000302: | | | | 7899 ldrb r1, [r3, #2] 8000304: | | | | eb04 0181 add.w r1, r4, r1, lsl #2 8000308: | | | | 69c8 ldr r0, [r1, #28] 800030a: | | | +-- b900 cbnz r0, 800030e <usb_standard_set_configuration+0x70> usbd_dev->current_iface[iface->bInterfaceNumber] = iface; 800030c: | | | | 61cb str r3, [r1, #28] totalLen -= ptr[0]; 800030e: | | | \-> 7819 ldrb r1, [r3, #0] 8000310: | | | 1a52 subs r2, r2, r1 ptr += ptr[0]; 8000312: | | | 440b add r3, r1 8000314: | | \----- e7ee b.n 80002f4 <usb_standard_set_configuration+0x56> usbd_dev->user_control_callback[i].cb = NULL; 8000316: | \-------------> 2300 movs r3, #0 8000318: | 66a3 str r3, [r4, #104] @ 0x68 800031a: | 6723 str r3, [r4, #112] @ 0x70 800031c: | 67a3 str r3, [r4, #120] @ 0x78 800031e: | f8c4 3080 str.w r3, [r4, #128] @ 0x80 for (i = 0; i < MAX_USER_SET_CONFIG_CALLBACK; i++) { 8000322: | f104 06e4 add.w r6, r4, #228 @ 0xe4 8000326: | f104 07f4 add.w r7, r4, #244 @ 0xf4 if (usbd_dev->user_callback_set_config[i]) { 800032a: | /----> f856 3f04 ldr.w r3, [r6, #4]! 800032e: | | /-- b113 cbz r3, 8000336 <usb_standard_set_configuration+0x98> usbd_dev->user_callback_set_config[i](usbd_dev, 8000330: | | | 8869 ldrh r1, [r5, #2] 8000332: | | | 4620 mov r0, r4 8000334: | | | 4798 blx r3 for (i = 0; i < MAX_USER_SET_CONFIG_CALLBACK; i++) { 8000336: | | \-> 42be cmp r6, r7 8000338: | \----- d1f7 bne.n 800032a <usb_standard_set_configuration+0x8c> 800033a: \----------------- e7d2 b.n 80002e2 <usb_standard_set_configuration+0x44> 0800033c : struct usb_setup_data *req, uint8_t **buf, uint16_t *len) { (void)req; if (*len > 1) { 800033c: 8819 ldrh r1, [r3, #0] *len = 1; } if (usbd_dev->current_config > 0) { const struct usb_config_descriptor *cfg = usbd_dev->config[usbd_dev->current_config - 1]; (*buf)[0] = cfg->bConfigurationValue; 800033e: 6812 ldr r2, [r2, #0] if (*len > 1) { 8000340: 2901 cmp r1, #1 *len = 1; 8000342: bf84 itt hi 8000344: 2101 movhi r1, #1 8000346: 8019 strhhi r1, [r3, #0] if (usbd_dev->current_config > 0) { 8000348: 7dc3 ldrb r3, [r0, #23] 800034a: /-- b133 cbz r3, 800035a <usb_standard_get_configuration+0x1e> usbd_dev->config[usbd_dev->current_config - 1]; 800034c: | f103 4380 add.w r3, r3, #1073741824 @ 0x40000000 const struct usb_config_descriptor *cfg = 8000350: | 6841 ldr r1, [r0, #4] usbd_dev->config[usbd_dev->current_config - 1]; 8000352: | 3b01 subs r3, #1 (*buf)[0] = cfg->bConfigurationValue; 8000354: | f851 3023 ldr.w r3, [r1, r3, lsl #2] 8000358: | 795b ldrb r3, [r3, #5] 800035a: \-> 7013 strb r3, [r2, #0] } else { (*buf)[0] = 0; } return USBD_REQ_HANDLED; } 800035c: 2001 movs r0, #1 800035e: 4770 bx lr 08000360 : static enum usbd_request_return_codes usb_standard_set_interface(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len) { 8000360: b5f8 push {r3, r4, r5, r6, r7, lr} const struct usb_config_descriptor *cfx = usbd_dev->config[usbd_dev->current_config - 1]; 8000362: 7dc2 ldrb r2, [r0, #23] 8000364: f102 4280 add.w r2, r2, #1073741824 @ 0x40000000 { 8000368: 461f mov r7, r3 usbd_dev->config[usbd_dev->current_config - 1]; 800036a: 3a01 subs r2, #1 const struct usb_config_descriptor *cfx = 800036c: 6843 ldr r3, [r0, #4] 800036e: f853 4022 ldr.w r4, [r3, r2, lsl #2] { 8000372: 460d mov r5, r1 (void)buf; if (req->wIndex >= cfx->bNumInterfaces) { 8000374: 7923 ldrb r3, [r4, #4] 8000376: 8889 ldrh r1, [r1, #4] 8000378: 428b cmp r3, r1 800037a: /----- d904 bls.n 8000386 <usb_standard_set_interface+0x26> return USBD_REQ_NOTSUPP; } if(req->wIndex >= USBD_INTERFACE_MAX) { 800037c: | 2907 cmp r1, #7 800037e: +----- d802 bhi.n 8000386 <usb_standard_set_interface+0x26> return USBD_REQ_NOTSUPP; } int totalLen = cfx->wTotalLength; 8000380: | 8866 ldrh r6, [r4, #2] uint8_t *ptr = (uint8_t *)cfx; struct usb_interface_descriptor *iface; while(totalLen > 0) { if(totalLen < (int)sizeof(struct usb_interface_descriptor)) 8000382: /-----|----> 2e08 cmp r6, #8 8000384: | | /-- dc01 bgt.n 800038a <usb_standard_set_interface+0x2a> return USBD_REQ_NOTSUPP; 8000386: | \--|-> 2000 movs r0, #0 8000388: | /-----|-- e013 b.n 80003b2 <usb_standard_set_interface+0x52> return USBD_REQ_NOTSUPP; if(ptr[1] == USB_DT_INTERFACE) { 800038a: | | \-> 7863 ldrb r3, [r4, #1] 800038c: | | 2b04 cmp r3, #4 800038e: | | /----- d111 bne.n 80003b4 <usb_standard_set_interface+0x54> iface = (struct usb_interface_descriptor *)ptr; if(iface->bInterfaceNumber == req->wIndex && iface->bAlternateSetting == req->wValue) { 8000390: | | | 78a3 ldrb r3, [r4, #2] 8000392: | | | 428b cmp r3, r1 8000394: | | +----- d10e bne.n 80003b4 <usb_standard_set_interface+0x54> 8000396: | | | 886b ldrh r3, [r5, #2] 8000398: | | | 78e2 ldrb r2, [r4, #3] 800039a: | | | 429a cmp r2, r3 800039c: | | +----- d10a bne.n 80003b4 <usb_standard_set_interface+0x54> usbd_dev->current_iface[req->wIndex] = iface; 800039e: | | | eb00 0381 add.w r3, r0, r1, lsl #2 80003a2: | | | 61dc str r4, [r3, #28] if (usbd_dev->user_callback_set_altsetting) { 80003a4: | | | f8d0 30f8 ldr.w r3, [r0, #248] @ 0xf8 80003a8: | | | /-- b103 cbz r3, 80003ac <usb_standard_set_interface+0x4c> usbd_dev->user_callback_set_altsetting(usbd_dev, 80003aa: | | | | 4798 blx r3 req->wIndex, req->wValue); } *len = 0; 80003ac: | | | \-> 2300 movs r3, #0 80003ae: | | | 803b strh r3, [r7, #0] return USBD_REQ_HANDLED; 80003b0: | | | 2001 movs r0, #1 totalLen -= ptr[0]; ptr += ptr[0]; } return USBD_REQ_NOTSUPP; } 80003b2: | \--|----> bdf8 pop {r3, r4, r5, r6, r7, pc} totalLen -= ptr[0]; 80003b4: | \----> 7823 ldrb r3, [r4, #0] 80003b6: | 1af6 subs r6, r6, r3 ptr += ptr[0]; 80003b8: | 441c add r4, r3 80003ba: \----------- e7e2 b.n 8000382 <usb_standard_set_interface+0x22> 080003bc : static enum usbd_request_return_codes usb_standard_get_interface(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len) { 80003bc: b570 push {r4, r5, r6, lr} 80003be: 4604 mov r4, r0 const struct usb_config_descriptor *cfx = usbd_dev->config[usbd_dev->current_config - 1]; if (req->wIndex >= cfx->bNumInterfaces) { 80003c0: 8888 ldrh r0, [r1, #4] usbd_dev->config[usbd_dev->current_config - 1]; 80003c2: 7de5 ldrb r5, [r4, #23] const struct usb_config_descriptor *cfx = 80003c4: 6866 ldr r6, [r4, #4] usbd_dev->config[usbd_dev->current_config - 1]; 80003c6: f105 4580 add.w r5, r5, #1073741824 @ 0x40000000 80003ca: 3d01 subs r5, #1 if (req->wIndex >= cfx->bNumInterfaces) { 80003cc: f856 5025 ldr.w r5, [r6, r5, lsl #2] 80003d0: 792d ldrb r5, [r5, #4] 80003d2: 4285 cmp r5, r0 80003d4: /----- d90f bls.n 80003f6 <usb_standard_get_interface+0x3a> return USBD_REQ_NOTSUPP; } if(req->wIndex >= USBD_INTERFACE_MAX) { 80003d6: | 2807 cmp r0, #7 80003d8: +----- d80d bhi.n 80003f6 <usb_standard_get_interface+0x3a> return USBD_REQ_NOTSUPP; } if(!usbd_dev->current_iface[req->wIndex]) { 80003da: | eb04 0080 add.w r0, r4, r0, lsl #2 80003de: | 69c0 ldr r0, [r0, #28] 80003e0: | /-- b140 cbz r0, 80003f4 <usb_standard_get_interface+0x38> return USBD_REQ_NOTSUPP; } *len = 1; 80003e2: | | 2001 movs r0, #1 80003e4: | | 8018 strh r0, [r3, #0] (*buf)[0] = usbd_dev->current_iface[req->wIndex]->bAlternateSetting; 80003e6: | | 6813 ldr r3, [r2, #0] 80003e8: | | 888a ldrh r2, [r1, #4] 80003ea: | | eb04 0482 add.w r4, r4, r2, lsl #2 80003ee: | | 69e2 ldr r2, [r4, #28] 80003f0: | | 78d2 ldrb r2, [r2, #3] 80003f2: | | 701a strb r2, [r3, #0] return USBD_REQ_HANDLED; } 80003f4: | >-> bd70 pop {r4, r5, r6, pc} return USBD_REQ_NOTSUPP; 80003f6: \--|-> 2000 movs r0, #0 80003f8: \-- e7fc b.n 80003f4 <usb_standard_get_interface+0x38> 080003fa : (void)usbd_dev; (void)req; /* bit 0: self powered */ /* bit 1: remote wakeup */ if (*len > 2) { 80003fa: 8819 ldrh r1, [r3, #0] 80003fc: 2902 cmp r1, #2 *len = 2; 80003fe: bf84 itt hi 8000400: 2102 movhi r1, #2 8000402: 8019 strhhi r1, [r3, #0] } (*buf)[0] = 0; 8000404: 6811 ldr r1, [r2, #0] 8000406: 2300 movs r3, #0 8000408: 700b strb r3, [r1, #0] (*buf)[1] = 0; 800040a: 6812 ldr r2, [r2, #0] return USBD_REQ_HANDLED; } 800040c: 2001 movs r0, #1 (*buf)[1] = 0; 800040e: 7053 strb r3, [r2, #1] } 8000410: 4770 bx lr 08000412 : static enum usbd_request_return_codes usb_standard_interface_get_status(usbd_device *usbd_dev, 8000412: 8819 ldrh r1, [r3, #0] 8000414: 2902 cmp r1, #2 8000416: bf84 itt hi 8000418: 2102 movhi r1, #2 800041a: 8019 strhhi r1, [r3, #0] 800041c: 6811 ldr r1, [r2, #0] 800041e: 2300 movs r3, #0 8000420: 700b strb r3, [r1, #0] 8000422: 6812 ldr r2, [r2, #0] 8000424: 2001 movs r0, #1 8000426: 7053 strb r3, [r2, #1] 8000428: 4770 bx lr 0800042a : static enum usbd_request_return_codes usb_standard_endpoint_get_status(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len) { 800042a: b510 push {r4, lr} 800042c: 4614 mov r4, r2 (void)req; if (*len > 2) { 800042e: 881a ldrh r2, [r3, #0] 8000430: 2a02 cmp r2, #2 *len = 2; 8000432: bf84 itt hi 8000434: 2202 movhi r2, #2 8000436: 801a strhhi r2, [r3, #0] } (*buf)[0] = usbd_ep_stall_get(usbd_dev, req->wIndex) ? 1 : 0; 8000438: 8889 ldrh r1, [r1, #4] } uint8_t usbd_ep_stall_get(usbd_device *usbd_dev, uint8_t addr) { return usbd_dev->driver->ep_stall_get(usbd_dev, addr); 800043a: f8d0 30fc ldr.w r3, [r0, #252] @ 0xfc 800043e: b2c9 uxtb r1, r1 8000440: 699b ldr r3, [r3, #24] 8000442: 4798 blx r3 8000444: 6823 ldr r3, [r4, #0] 8000446: 3800 subs r0, #0 8000448: bf18 it ne 800044a: 2001 movne r0, #1 800044c: 7018 strb r0, [r3, #0] (*buf)[1] = 0; 800044e: 6823 ldr r3, [r4, #0] 8000450: 2200 movs r2, #0 8000452: 705a strb r2, [r3, #1] return USBD_REQ_HANDLED; } 8000454: 2001 movs r0, #1 8000456: bd10 pop {r4, pc} 08000458 : static enum usbd_request_return_codes usb_standard_endpoint_stall(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len) { 8000458: b508 push {r3, lr} (void)buf; (void)len; usbd_ep_stall_set(usbd_dev, req->wIndex, 1); 800045a: 8889 ldrh r1, [r1, #4] 800045c: 2201 movs r2, #1 800045e: b2c9 uxtb r1, r1 8000460: f7ff ff04 bl 800026c <usbd_ep_stall_set> return USBD_REQ_HANDLED; } 8000464: 2001 movs r0, #1 8000466: bd08 pop {r3, pc} 08000468 : static enum usbd_request_return_codes usb_standard_endpoint_unstall(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len) { 8000468: b508 push {r3, lr} (void)buf; (void)len; usbd_ep_stall_set(usbd_dev, req->wIndex, 0); 800046a: 8889 ldrh r1, [r1, #4] 800046c: 2200 movs r2, #0 800046e: b2c9 uxtb r1, r1 8000470: f7ff fefc bl 800026c <usbd_ep_stall_set> return USBD_REQ_HANDLED; } 8000474: 2001 movs r0, #1 8000476: bd08 pop {r3, pc} 08000478 : { 8000478: b510 push {r4, lr} usbd_ep_stall_set(usbd_dev, 0, 1); 800047a: 2201 movs r2, #1 { 800047c: 4604 mov r4, r0 usbd_ep_stall_set(usbd_dev, 0, 1); 800047e: 2100 movs r1, #0 8000480: f7ff fef4 bl 800026c <usbd_ep_stall_set> usbd_dev->control_state.state = IDLE; 8000484: 2300 movs r3, #0 8000486: f884 304c strb.w r3, [r4, #76] @ 0x4c } 800048a: bd10 pop {r4, pc} 0800048c : usbd_dev->control_state.ctrl_buf = NULL; } } static int usb_control_recv_chunk(usbd_device *usbd_dev) { 800048c: b570 push {r4, r5, r6, lr} uint16_t packetsize = MIN(usbd_dev->desc->bMaxPacketSize0, 800048e: 6803 ldr r3, [r0, #0] 8000490: f8b0 205c ldrh.w r2, [r0, #92] @ 0x5c 8000494: f8b0 4056 ldrh.w r4, [r0, #86] @ 0x56 8000498: 79db ldrb r3, [r3, #7] usbd_dev->control_state.req.wLength - usbd_dev->control_state.ctrl_len); uint16_t size = usbd_ep_read_packet(usbd_dev, 0, usbd_dev->control_state.ctrl_buf + 800049a: 6d81 ldr r1, [r0, #88] @ 0x58 uint16_t packetsize = MIN(usbd_dev->desc->bMaxPacketSize0, 800049c: 1aa4 subs r4, r4, r2 800049e: 429c cmp r4, r3 80004a0: bfa8 it ge 80004a2: 461c movge r4, r3 80004a4: b2a6 uxth r6, r4 uint16_t size = usbd_ep_read_packet(usbd_dev, 0, 80004a6: 440a add r2, r1 80004a8: 4633 mov r3, r6 80004aa: 2100 movs r1, #0 { 80004ac: 4605 mov r5, r0 uint16_t size = usbd_ep_read_packet(usbd_dev, 0, 80004ae: f7ff fec7 bl 8000240 <usbd_ep_read_packet> usbd_dev->control_state.ctrl_len, packetsize); if (size != packetsize) { 80004b2: 4286 cmp r6, r0 80004b4: /-- d005 beq.n 80004c2 <usb_control_recv_chunk+0x36> stall_transaction(usbd_dev); 80004b6: | 4628 mov r0, r5 80004b8: | f7ff ffde bl 8000478 <stall_transaction> return -1; 80004bc: | f04f 30ff mov.w r0, #4294967295 @ 0xffffffff } usbd_dev->control_state.ctrl_len += size; return packetsize; } 80004c0: /--|-> bd70 pop {r4, r5, r6, pc} usbd_dev->control_state.ctrl_len += size; 80004c2: | \-> f8b5 305c ldrh.w r3, [r5, #92] @ 0x5c 80004c6: | 441e add r6, r3 80004c8: | f8a5 605c strh.w r6, [r5, #92] @ 0x5c return packetsize; 80004cc: | b2a0 uxth r0, r4 80004ce: \----- e7f7 b.n 80004c0 <usb_control_recv_chunk+0x34> 080004d0 : static enum usbd_request_return_codes usb_control_request_dispatch(usbd_device *usbd_dev, struct usb_setup_data *req) { 80004d0: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr} 80004d4: 4604 mov r4, r0 80004d6: 460d mov r5, r1 80004d8: 4606 mov r6, r0 80004da: f100 0a20 add.w sl, r0, #32 if (cb[i].cb == NULL) { break; } if ((req->bmRequestType & cb[i].type_mask) == cb[i].type) { result = cb[i].cb(usbd_dev, req, 80004de: f100 0b5c add.w fp, r0, #92 @ 0x5c 80004e2: f100 0858 add.w r8, r0, #88 @ 0x58 80004e6: f100 0960 add.w r9, r0, #96 @ 0x60 if (cb[i].cb == NULL) { 80004ea: /----------> 6eb7 ldr r7, [r6, #104] @ 0x68 if ((req->bmRequestType & cb[i].type_mask) == cb[i].type) { 80004ec: | 782b ldrb r3, [r5, #0] if (cb[i].cb == NULL) { 80004ee: | /-- b92f cbnz r7, 80004fc <usb_control_request_dispatch+0x2c> enum usbd_request_return_codes _usbd_standard_request(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len) { /* FIXME: Have class/vendor requests as well. */ if ((req->bmRequestType & USB_REQ_TYPE_TYPE) != USB_REQ_TYPE_STANDARD) { 80004f0: | /-----|-> 7829 ldrb r1, [r5, #0] 80004f2: | | | f011 0060 ands.w r0, r1, #96 @ 0x60 80004f6: /--|--|-----|-- d018 beq.n 800052a <usb_control_request_dispatch+0x5a> return USBD_REQ_NOTSUPP; 80004f8: /--|--|--|-----|-> 2000 movs r0, #0 80004fa: /--|--|--|--|-----|-- e013 b.n 8000524 <usb_control_request_dispatch+0x54> if ((req->bmRequestType & cb[i].type_mask) == cb[i].type) { 80004fc: | | | | | \-> f896 106d ldrb.w r1, [r6, #109] @ 0x6d 8000500: | | | | | f896 206c ldrb.w r2, [r6, #108] @ 0x6c 8000504: | | | | | 400b ands r3, r1 8000506: | | | | | 429a cmp r2, r3 8000508: | | | | | /-- d003 beq.n 8000512 <usb_control_request_dispatch+0x42> for (i = 0; i < MAX_USER_CONTROL_CALLBACK; i++) { 800050a: | | | | | /--|-> 3608 adds r6, #8 800050c: | | | | | | | 4556 cmp r6, sl 800050e: | | | \--|--|--|-- d1ec bne.n 80004ea <usb_control_request_dispatch+0x1a> 8000510: | | | \--|--|-- e7ee b.n 80004f0 <usb_control_request_dispatch+0x20> result = cb[i].cb(usbd_dev, req, 8000512: | | | | \-> f8cd 9000 str.w r9, [sp] 8000516: | | | | 465b mov r3, fp 8000518: | | | | 4642 mov r2, r8 800051a: | | | | 4629 mov r1, r5 800051c: | | | | 4620 mov r0, r4 800051e: | | | | 47b8 blx r7 &(usbd_dev->control_state.ctrl_buf), &(usbd_dev->control_state.ctrl_len), &(usbd_dev->control_state.complete)); if (result == USBD_REQ_HANDLED || 8000520: | | | | 2801 cmp r0, #1 8000522: | | | \----- d8f2 bhi.n 800050a <usb_control_request_dispatch+0x3a> /* Try standard request if not already handled. */ return _usbd_standard_request(usbd_dev, req, &(usbd_dev->control_state.ctrl_buf), &(usbd_dev->control_state.ctrl_len)); } 8000524: >--|--|-------------> b003 add sp, #12 8000526: | | | e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} 800052a: | | \-------------> f001 011f and.w r1, r1, #31 } switch (req->bmRequestType & USB_REQ_TYPE_RECIPIENT) { 800052e: | | 2901 cmp r1, #1 return _usbd_standard_request(usbd_dev, req, 8000530: | | f104 0258 add.w r2, r4, #88 @ 0x58 8000534: | | f104 035c add.w r3, r4, #92 @ 0x5c 8000538: | | /-- d02e beq.n 8000598 <usb_control_request_dispatch+0xc8> 800053a: | | | 2902 cmp r1, #2 800053c: | | /--------|-- d039 beq.n 80005b2 <usb_control_request_dispatch+0xe2> 800053e: | | | | 2900 cmp r1, #0 8000540: +--|-----|--------|-- d1f0 bne.n 8000524 <usb_control_request_dispatch+0x54> switch (req->bRequest) { 8000542: | | | | 7869 ldrb r1, [r5, #1] 8000544: | | | | 2909 cmp r1, #9 8000546: | \-----|--------|-- d8d7 bhi.n 80004f8 <usb_control_request_dispatch+0x28> 8000548: | | | a001 add r0, pc, #4 @ (adr r0, 8000550 ) 800054a: | | | f850 f021 ldr.w pc, [r0, r1, lsl #2] 800054e: | | | bf00 nop 8000550: | | | 08000579 .word 0x08000579 8000554: | | | 080004f9 .word 0x080004f9 8000558: | | | 080004f9 .word 0x080004f9 800055c: | | | 080004f9 .word 0x080004f9 8000560: | | | 080004f9 .word 0x080004f9 8000564: | | | 08000591 .word 0x08000591 8000568: | | | 08000595 .word 0x08000595 800056c: | | | 080004f9 .word 0x080004f9 8000570: | | | 08000589 .word 0x08000589 8000574: | | | 0800058d .word 0x0800058d command = usb_standard_device_get_status; 8000578: | | | 4e17 ldr r6, [pc, #92] @ (80005d8 ) return command(usbd_dev, req, buf, len); 800057a: | | /-----|-> 4629 mov r1, r5 800057c: | | | | 4620 mov r0, r4 800057e: | | | | 46b4 mov ip, r6 } 8000580: | | | | b003 add sp, #12 8000582: | | | | e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 8000586: | | | | 4760 bx ip command = usb_standard_get_configuration; 8000588: | | | | 4e14 ldr r6, [pc, #80] @ (80005dc ) 800058a: | | +-----|-- e7f6 b.n 800057a <usb_control_request_dispatch+0xaa> command = usb_standard_set_configuration; 800058c: | | | | 4e14 ldr r6, [pc, #80] @ (80005e0 ) 800058e: | | +-----|-- e7f4 b.n 800057a <usb_control_request_dispatch+0xaa> command = usb_standard_set_address; 8000590: | | | | 4e14 ldr r6, [pc, #80] @ (80005e4 ) 8000592: | | +-----|-- e7f2 b.n 800057a <usb_control_request_dispatch+0xaa> switch (req->bRequest) { 8000594: | | | | 4e14 ldr r6, [pc, #80] @ (80005e8 ) return command(usbd_dev, req, buf, len); 8000596: | | +-----|-- e7f0 b.n 800057a <usb_control_request_dispatch+0xaa> switch (req->bRequest) { 8000598: | | | \-> 7869 ldrb r1, [r5, #1] 800059a: | | | 290a cmp r1, #10 800059c: | | | /-- d005 beq.n 80005aa <usb_control_request_dispatch+0xda> 800059e: | | | | 290b cmp r1, #11 80005a0: | | | /--|-- d005 beq.n 80005ae <usb_control_request_dispatch+0xde> 80005a2: | | | | | 2900 cmp r1, #0 80005a4: +--------|--|--|--|-- d1be bne.n 8000524 <usb_control_request_dispatch+0x54> command = usb_standard_interface_get_status; 80005a6: | | | | | 4e11 ldr r6, [pc, #68] @ (80005ec ) 80005a8: | | +--|--|-- e7e7 b.n 800057a <usb_control_request_dispatch+0xaa> command = usb_standard_get_interface; 80005aa: | | | | \-> 4e11 ldr r6, [pc, #68] @ (80005f0 ) 80005ac: | | +--|----- e7e5 b.n 800057a <usb_control_request_dispatch+0xaa> switch (req->bRequest) { 80005ae: | | | \----> 4e11 ldr r6, [pc, #68] @ (80005f4 ) return command(usbd_dev, req, buf, len); 80005b0: | | +-------- e7e3 b.n 800057a <usb_control_request_dispatch+0xaa> switch (req->bRequest) { 80005b2: | \--|-------> 7869 ldrb r1, [r5, #1] 80005b4: | | 2901 cmp r1, #1 80005b6: | | /-- d005 beq.n 80005c4 <usb_control_request_dispatch+0xf4> 80005b8: | | | 2903 cmp r1, #3 80005ba: | | /--|-- d008 beq.n 80005ce <usb_control_request_dispatch+0xfe> 80005bc: | | | | 2900 cmp r1, #0 80005be: +-----------|--|--|-- d1b1 bne.n 8000524 <usb_control_request_dispatch+0x54> 80005c0: | | | | 4e0d ldr r6, [pc, #52] @ (80005f8 ) 80005c2: | +--|--|-- e7da b.n 800057a <usb_control_request_dispatch+0xaa> if (req->wValue == USB_FEAT_ENDPOINT_HALT) { 80005c4: | | | \-> 8869 ldrh r1, [r5, #2] 80005c6: | | | 2900 cmp r1, #0 80005c8: +-----------|--|----- d1ac bne.n 8000524 <usb_control_request_dispatch+0x54> command = usb_standard_endpoint_unstall; 80005ca: | | | 4e0c ldr r6, [pc, #48] @ (80005fc ) 80005cc: | +--|----- e7d5 b.n 800057a <usb_control_request_dispatch+0xaa> if (req->wValue == USB_FEAT_ENDPOINT_HALT) { 80005ce: | | \----> 8869 ldrh r1, [r5, #2] 80005d0: | | 2900 cmp r1, #0 80005d2: \-----------|-------- d1a7 bne.n 8000524 <usb_control_request_dispatch+0x54> command = usb_standard_endpoint_stall; 80005d4: | 4e0a ldr r6, [pc, #40] @ (8000600 ) 80005d6: \-------- e7d0 b.n 800057a <usb_control_request_dispatch+0xaa> 80005d8: 080003fb .word 0x080003fb 80005dc: 0800033d .word 0x0800033d 80005e0: 0800029f .word 0x0800029f 80005e4: 08000275 .word 0x08000275 80005e8: 080010fd .word 0x080010fd 80005ec: 08000413 .word 0x08000413 80005f0: 080003bd .word 0x080003bd 80005f4: 08000361 .word 0x08000361 80005f8: 0800042b .word 0x0800042b 80005fc: 08000469 .word 0x08000469 8000600: 08000459 .word 0x08000459 08000604 : * * For available constants, see #rcc_periph_clken (RCC_UART1 for example) */ void rcc_periph_clock_enable(enum rcc_periph_clken clken) { _RCC_REG(clken) |= _RCC_BIT(clken); 8000604: 4a2e ldr r2, [pc, #184] @ (80006c0 ) 8000606: f8d2 3834 ldr.w r3, [r2, #2100] @ 0x834 800060a: f043 0380 orr.w r3, r3, #128 @ 0x80 800060e: f8c2 3834 str.w r3, [r2, #2100] @ 0x834 /** Initialize the USB device controller hardware of the STM32. */ static usbd_device *stm32f107_usbd_init(void) { rcc_periph_clock_enable(RCC_OTGFS); OTG_FS_GUSBCFG |= OTG_GUSBCFG_PHYSEL; 8000612: f04f 43a0 mov.w r3, #1342177280 @ 0x50000000 8000616: 68da ldr r2, [r3, #12] 8000618: f042 0240 orr.w r2, r2, #64 @ 0x40 800061c: 60da str r2, [r3, #12] /* Wait for AHB idle. */ while (!(OTG_FS_GRSTCTL & OTG_GRSTCTL_AHBIDL)); 800061e: /-> 691a ldr r2, [r3, #16] 8000620: | 2a00 cmp r2, #0 8000622: \-- dafc bge.n 800061e <stm32f107_usbd_init.lto_priv.0+0x1a> /* Do core soft reset. */ OTG_FS_GRSTCTL |= OTG_GRSTCTL_CSRST; 8000624: 691a ldr r2, [r3, #16] 8000626: f042 0201 orr.w r2, r2, #1 800062a: 611a str r2, [r3, #16] while (OTG_FS_GRSTCTL & OTG_GRSTCTL_CSRST); 800062c: f04f 43a0 mov.w r3, #1342177280 @ 0x50000000 8000630: /-> 691a ldr r2, [r3, #16] 8000632: | 07d2 lsls r2, r2, #31 8000634: \-- d4fc bmi.n 8000630 <stm32f107_usbd_init.lto_priv.0+0x2c> if (OTG_FS_CID >= OTG_CID_HAS_VBDEN) { 8000636: 6bda ldr r2, [r3, #60] @ 0x3c 8000638: f5b2 5f00 cmp.w r2, #8192 @ 0x2000 /* Disable VBUS sensing and power up the PHY. */ OTG_FS_GCCFG |= OTG_GCCFG_PWRDWN; 800063c: 6b9a ldr r2, [r3, #56] @ 0x38 if (OTG_FS_CID >= OTG_CID_HAS_VBDEN) { 800063e: /----- d336 bcc.n 80006ae <stm32f107_usbd_init.lto_priv.0+0xaa> OTG_FS_GCCFG |= OTG_GCCFG_PWRDWN; 8000640: | f442 3280 orr.w r2, r2, #65536 @ 0x10000 8000644: | 639a str r2, [r3, #56] @ 0x38 OTG_FS_GCCFG &= ~OTG_GCCFG_VBDEN; 8000646: | 6b9a ldr r2, [r3, #56] @ 0x38 8000648: | f422 1200 bic.w r2, r2, #2097152 @ 0x200000 800064c: | 639a str r2, [r3, #56] @ 0x38 OTG_FS_GOTGCTL |= OTG_GOTGCTL_BVALOEN| OTG_GOTGCTL_BVALOVAL; 800064e: | 681a ldr r2, [r3, #0] 8000650: | f042 02c0 orr.w r2, r2, #192 @ 0xc0 8000654: | 601a str r2, [r3, #0] /* Disable VBUS sensing and power up the PHY. */ OTG_FS_GCCFG |= OTG_GCCFG_NOVBUSSENS | OTG_GCCFG_PWRDWN; OTG_FS_GCCFG &= ~(OTG_GCCFG_VBUSBSEN | OTG_GCCFG_VBUSASEN); } /* Explicitly enable DP pullup (not all cores do this by default) */ OTG_FS_DCTL &= ~OTG_DCTL_SDIS; 8000656: | /-> f04f 43a0 mov.w r3, #1342177280 @ 0x50000000 /* Restart the PHY clock. */ OTG_FS_PCGCCTL = 0; OTG_FS_GRXFSIZ = stm32f107_usb_driver.rx_fifo_size; usbd_dev.fifo_mem_top = stm32f107_usb_driver.rx_fifo_size; 800065a: | | 481a ldr r0, [pc, #104] @ (80006c4 ) OTG_FS_DCTL &= ~OTG_DCTL_SDIS; 800065c: | | f8d3 2804 ldr.w r2, [r3, #2052] @ 0x804 8000660: | | f022 0202 bic.w r2, r2, #2 8000664: | | f8c3 2804 str.w r2, [r3, #2052] @ 0x804 OTG_FS_GUSBCFG |= OTG_GUSBCFG_FDMOD | OTG_GUSBCFG_TRDT_MASK; 8000668: | | 68da ldr r2, [r3, #12] 800066a: | | f042 4280 orr.w r2, r2, #1073741824 @ 0x40000000 800066e: | | f442 5270 orr.w r2, r2, #15360 @ 0x3c00 8000672: | | 60da str r2, [r3, #12] OTG_FS_GINTSTS = OTG_GINTSTS_MMIS; 8000674: | | 2202 movs r2, #2 8000676: | | 615a str r2, [r3, #20] OTG_FS_DCFG |= OTG_DCFG_DSPD; 8000678: | | f8d3 2800 ldr.w r2, [r3, #2048] @ 0x800 800067c: | | f042 0203 orr.w r2, r2, #3 8000680: | | f8c3 2800 str.w r2, [r3, #2048] @ 0x800 OTG_FS_PCGCCTL = 0; 8000684: | | 2200 movs r2, #0 8000686: | | f8c3 2e00 str.w r2, [r3, #3584] @ 0xe00 OTG_FS_GRXFSIZ = stm32f107_usb_driver.rx_fifo_size; 800068a: | | 22c0 movs r2, #192 @ 0xc0 800068c: | | 625a str r2, [r3, #36] @ 0x24 usbd_dev.fifo_mem_top = stm32f107_usb_driver.rx_fifo_size; 800068e: | | f8a0 210c strh.w r2, [r0, #268] @ 0x10c /* Unmask interrupts for TX and RX. */ OTG_FS_GAHBCFG |= OTG_GAHBCFG_GINT; 8000692: | | 689a ldr r2, [r3, #8] 8000694: | | f042 0201 orr.w r2, r2, #1 8000698: | | 609a str r2, [r3, #8] OTG_FS_GINTMSK = OTG_GINTMSK_ENUMDNEM | 800069a: | | 4a0b ldr r2, [pc, #44] @ (80006c8 ) 800069c: | | 619a str r2, [r3, #24] OTG_GINTMSK_RXFLVLM | OTG_GINTMSK_IEPINT | OTG_GINTMSK_USBSUSPM | OTG_GINTMSK_WUIM; OTG_FS_DAINTMSK = 0xF; 800069e: | | 220f movs r2, #15 80006a0: | | f8c3 281c str.w r2, [r3, #2076] @ 0x81c OTG_FS_DIEPMSK = OTG_DIEPMSK_XFRCM; 80006a4: | | 2201 movs r2, #1 80006a6: | | f8c3 2810 str.w r2, [r3, #2064] @ 0x810 return &usbd_dev; } 80006aa: | | 3004 adds r0, #4 80006ac: | | 4770 bx lr OTG_FS_GCCFG |= OTG_GCCFG_NOVBUSSENS | OTG_GCCFG_PWRDWN; 80006ae: \--|-> f442 1204 orr.w r2, r2, #2162688 @ 0x210000 80006b2: | 639a str r2, [r3, #56] @ 0x38 OTG_FS_GCCFG &= ~(OTG_GCCFG_VBUSBSEN | OTG_GCCFG_VBUSASEN); 80006b4: | 6b9a ldr r2, [r3, #56] @ 0x38 80006b6: | f422 2240 bic.w r2, r2, #786432 @ 0xc0000 80006ba: | 639a str r2, [r3, #56] @ 0x38 80006bc: \-- e7cb b.n 8000656 <stm32f107_usbd_init.lto_priv.0+0x52> 80006be: bf00 nop 80006c0: 40023000 .word 0x40023000 80006c4: 20000060 .word 0x20000060 80006c8: 80042810 .word 0x80042810 080006cc : } void blocking_handler(void) { while (1); 80006cc: /-- e7fe b.n 80006cc <adc_isr> 080006ce : } void null_handler(void) { /* Do nothing. */ } 80006ce: 4770 bx lr 080006d0 : /* Odd/Even frame. See OTG_HS_DSTS 8..21: FNSOF Frame Number */ #define DSTS_FNSOF_ODD_MASK (1 << 8) void dwc_set_address(usbd_device *usbd_dev, uint8_t addr) { REBASE(OTG_DCFG) = (REBASE(OTG_DCFG) & ~OTG_DCFG_DAD) | (addr << 4); 80006d0: f8d0 30fc ldr.w r3, [r0, #252] @ 0xfc 80006d4: 6ada ldr r2, [r3, #44] @ 0x2c 80006d6: f8d2 3800 ldr.w r3, [r2, #2048] @ 0x800 80006da: f423 63fe bic.w r3, r3, #2032 @ 0x7f0 80006de: ea43 1301 orr.w r3, r3, r1, lsl #4 80006e2: f8c2 3800 str.w r3, [r2, #2048] @ 0x800 } 80006e6: 4770 bx lr 080006e8 : void dwc_ep_setup(usbd_device *usbd_dev, uint8_t addr, uint8_t type, uint16_t max_size, void (*callback) (usbd_device *usbd_dev, uint8_t ep)) { 80006e8: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} addr &= 0x7f; if (addr == 0) { /* For the default control endpoint */ /* Configure IN part. */ if (max_size >= 64) { REBASE(OTG_DIEPCTL0) = OTG_DIEPCTL0_MPSIZ_64; 80006ec: f8d0 e0fc ldr.w lr, [r0, #252] @ 0xfc { 80006f0: 9f08 ldr r7, [sp, #32] REBASE(OTG_DIEPCTL0) = OTG_DIEPCTL0_MPSIZ_64; 80006f2: f8de 602c ldr.w r6, [lr, #44] @ 0x2c { 80006f6: 4688 mov r8, r1 if (addr == 0) { /* For the default control endpoint */ 80006f8: f011 017f ands.w r1, r1, #127 @ 0x7f { 80006fc: 469c mov ip, r3 80006fe: f003 047f and.w r4, r3, #127 @ 0x7f if (addr == 0) { /* For the default control endpoint */ 8000702: /----------- d140 bne.n 8000786 <dwc_ep_setup+0x9e> if (max_size >= 64) { 8000704: | 2b3f cmp r3, #63 @ 0x3f 8000706: | /-- d933 bls.n 8000770 <dwc_ep_setup+0x88> REBASE(OTG_DIEPCTL0) = OTG_DIEPCTL0_MPSIZ_64; 8000708: | | f8c6 1900 str.w r1, [r6, #2304] @ 0x900 REBASE(OTG_DIEPCTL0) = OTG_DIEPCTL0_MPSIZ_16; } else { REBASE(OTG_DIEPCTL0) = OTG_DIEPCTL0_MPSIZ_8; } REBASE(OTG_DIEPTSIZ0) = 800070c: | /-----|-> f8de 302c ldr.w r3, [lr, #44] @ 0x2c 8000710: | | | f8c3 4910 str.w r4, [r3, #2320] @ 0x910 (max_size & OTG_DIEPSIZ0_XFRSIZ_MASK); REBASE(OTG_DIEPCTL0) |= 8000714: | | | f8de 202c ldr.w r2, [lr, #44] @ 0x2c 8000718: | | | f8d2 3900 ldr.w r3, [r2, #2304] @ 0x900 800071c: | | | f043 6300 orr.w r3, r3, #134217728 @ 0x8000000 8000720: | | | f8c2 3900 str.w r3, [r2, #2304] @ 0x900 /* Configure OUT part. */ usbd_dev->doeptsiz[0] = OTG_DIEPSIZ0_STUPCNT_1 | OTG_DIEPSIZ0_PKTCNT | (max_size & OTG_DIEPSIZ0_XFRSIZ_MASK); REBASE(OTG_DOEPTSIZ(0)) = usbd_dev->doeptsiz[0]; 8000724: | | | f8de 302c ldr.w r3, [lr, #44] @ 0x2c OTG_DIEPSIZ0_PKTCNT | 8000728: | | | f044 5400 orr.w r4, r4, #536870912 @ 0x20000000 800072c: | | | f444 2400 orr.w r4, r4, #524288 @ 0x80000 usbd_dev->doeptsiz[0] = OTG_DIEPSIZ0_STUPCNT_1 | 8000730: | | | f8c0 4110 str.w r4, [r0, #272] @ 0x110 REBASE(OTG_DOEPTSIZ(0)) = usbd_dev->doeptsiz[0]; 8000734: | | | f8c3 4b10 str.w r4, [r3, #2832] @ 0xb10 REBASE(OTG_DOEPCTL(0)) |= 8000738: | | | f8de 202c ldr.w r2, [lr, #44] @ 0x2c 800073c: | | | f8d2 3b00 ldr.w r3, [r2, #2816] @ 0xb00 8000740: | | | f043 4308 orr.w r3, r3, #2281701376 @ 0x88000000 8000744: | | | f8c2 3b00 str.w r3, [r2, #2816] @ 0xb00 OTG_DOEPCTL0_EPENA | OTG_DIEPCTL0_SNAK; REBASE(OTG_GNPTXFSIZ) = ((max_size / 4) << 16) | usbd_dev->driver->rx_fifo_size; 8000748: | | | f8be 3032 ldrh.w r3, [lr, #50] @ 0x32 REBASE(OTG_GNPTXFSIZ) = ((max_size / 4) << 16) | 800074c: | | | f8de 202c ldr.w r2, [lr, #44] @ 0x2c 8000750: | | | ea4f 0c9c mov.w ip, ip, lsr #2 8000754: | | | ea43 430c orr.w r3, r3, ip, lsl #16 8000758: | | | 6293 str r3, [r2, #40] @ 0x28 usbd_dev->fifo_mem_top += max_size / 4; 800075a: | | | f8b0 3108 ldrh.w r3, [r0, #264] @ 0x108 800075e: | | | 449c add ip, r3 8000760: | | | fa1f fc8c uxth.w ip, ip 8000764: | | | f8a0 c108 strh.w ip, [r0, #264] @ 0x108 usbd_dev->fifo_mem_top_ep0 = usbd_dev->fifo_mem_top; 8000768: | | | f8a0 c10a strh.w ip, [r0, #266] @ 0x10a if (callback) { usbd_dev->user_callback_ctr[addr][USB_TRANSACTION_OUT] = (void *)callback; } } } 800076c: /--|--|-----|-> e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} } else if (max_size >= 32) { 8000770: | | | \-> 2b1f cmp r3, #31 8000772: | | | /-- d903 bls.n 800077c <dwc_ep_setup+0x94> REBASE(OTG_DIEPCTL0) = OTG_DIEPCTL0_MPSIZ_32; 8000774: | | | | 2301 movs r3, #1 REBASE(OTG_DIEPCTL0) = OTG_DIEPCTL0_MPSIZ_8; 8000776: | | | /--|-> f8c6 3900 str.w r3, [r6, #2304] @ 0x900 800077a: | | \--|--|-- e7c7 b.n 800070c <dwc_ep_setup+0x24> } else if (max_size >= 16) { 800077c: | | | \-> 2b0f cmp r3, #15 REBASE(OTG_DIEPCTL0) = OTG_DIEPCTL0_MPSIZ_16; 800077e: | | | bf8c ite hi 8000780: | | | 2302 movhi r3, #2 REBASE(OTG_DIEPCTL0) = OTG_DIEPCTL0_MPSIZ_8; 8000782: | | | 2303 movls r3, #3 8000784: | | \----- e7f7 b.n 8000776 <dwc_ep_setup+0x8e> if (dir) { 8000786: | \----------> f018 0f80 tst.w r8, #128 @ 0x80 REBASE(OTG_DOEPTSIZ(addr)) = usbd_dev->doeptsiz[addr]; 800078a: | ea4f 1541 mov.w r5, r1, lsl #5 OTG_DOEPCTLX_SD0PID | (type << 18) | max_size; 800078e: | ea4f 4382 mov.w r3, r2, lsl #18 if (dir) { 8000792: | /-- d11d bne.n 80007d0 <dwc_ep_setup+0xe8> usbd_dev->doeptsiz[addr] = OTG_DIEPSIZ0_PKTCNT | 8000794: | | f101 0244 add.w r2, r1, #68 @ 0x44 REBASE(OTG_DOEPTSIZ(addr)) = usbd_dev->doeptsiz[addr]; 8000798: | | f506 6631 add.w r6, r6, #2832 @ 0xb10 usbd_dev->doeptsiz[addr] = OTG_DIEPSIZ0_PKTCNT | 800079c: | | f444 2400 orr.w r4, r4, #524288 @ 0x80000 80007a0: | | f840 4022 str.w r4, [r0, r2, lsl #2] REBASE(OTG_DOEPTSIZ(addr)) = usbd_dev->doeptsiz[addr]; 80007a4: | | 5174 str r4, [r6, r5] REBASE(OTG_DOEPCTL(addr)) |= OTG_DOEPCTL0_EPENA | 80007a6: | | f505 6530 add.w r5, r5, #2816 @ 0xb00 80007aa: | | f8de 202c ldr.w r2, [lr, #44] @ 0x2c OTG_DOEPCTLX_SD0PID | (type << 18) | max_size; 80007ae: | | ea43 030c orr.w r3, r3, ip REBASE(OTG_DOEPCTL(addr)) |= OTG_DOEPCTL0_EPENA | 80007b2: | | 58ac ldr r4, [r5, r2] OTG_DOEPCTLX_SD0PID | (type << 18) | max_size; 80007b4: | | f043 4314 orr.w r3, r3, #2483027968 @ 0x94000000 80007b8: | | f443 4300 orr.w r3, r3, #32768 @ 0x8000 REBASE(OTG_DOEPCTL(addr)) |= OTG_DOEPCTL0_EPENA | 80007bc: | | 4323 orrs r3, r4 80007be: | | 50ab str r3, [r5, r2] if (callback) { 80007c0: | | 2f00 cmp r7, #0 80007c2: +-----------|-- d0d3 beq.n 800076c <dwc_ep_setup+0x84> usbd_dev->user_callback_ctr[addr][USB_TRANSACTION_OUT] = 80007c4: | | 230c movs r3, #12 80007c6: | | fb03 0001 mla r0, r3, r1, r0 80007ca: | | f8c0 708c str.w r7, [r0, #140] @ 0x8c 80007ce: +-----------|-- e7cd b.n 800076c <dwc_ep_setup+0x84> usbd_dev->fifo_mem_top; 80007d0: | \-> f8b0 9108 ldrh.w r9, [r0, #264] @ 0x108 REBASE(OTG_DIEPTXF(addr)) = ((max_size / 4) << 16) | 80007d4: | ea4f 029c mov.w r2, ip, lsr #2 80007d8: | f101 0840 add.w r8, r1, #64 @ 0x40 80007dc: | ea49 4a02 orr.w sl, r9, r2, lsl #16 80007e0: | f846 a028 str.w sl, [r6, r8, lsl #2] usbd_dev->fifo_mem_top += max_size / 4; 80007e4: | 444a add r2, r9 80007e6: | f8a0 2108 strh.w r2, [r0, #264] @ 0x108 REBASE(OTG_DIEPTSIZ(addr)) = 80007ea: | f8de 202c ldr.w r2, [lr, #44] @ 0x2c 80007ee: | f502 6211 add.w r2, r2, #2320 @ 0x910 | (addr << 22) | max_size; 80007f2: | ea43 5381 orr.w r3, r3, r1, lsl #22 REBASE(OTG_DIEPTSIZ(addr)) = 80007f6: | 5154 str r4, [r2, r5] REBASE(OTG_DIEPCTL(addr)) |= 80007f8: | f505 6510 add.w r5, r5, #2304 @ 0x900 80007fc: | f8de 202c ldr.w r2, [lr, #44] @ 0x2c | (addr << 22) | max_size; 8000800: | ea43 030c orr.w r3, r3, ip REBASE(OTG_DIEPCTL(addr)) |= 8000804: | 58ac ldr r4, [r5, r2] | (addr << 22) | max_size; 8000806: | f043 53c0 orr.w r3, r3, #402653184 @ 0x18000000 800080a: | f443 4300 orr.w r3, r3, #32768 @ 0x8000 REBASE(OTG_DIEPCTL(addr)) |= 800080e: | 4323 orrs r3, r4 8000810: | 50ab str r3, [r5, r2] if (callback) { 8000812: | 2f00 cmp r7, #0 8000814: +-------------- d0aa beq.n 800076c <dwc_ep_setup+0x84> usbd_dev->user_callback_ctr[addr][USB_TRANSACTION_IN] = 8000816: | 230c movs r3, #12 8000818: | fb03 0301 mla r3, r3, r1, r0 800081c: | f8c3 7088 str.w r7, [r3, #136] @ 0x88 8000820: \-------------- e7a4 b.n 800076c <dwc_ep_setup+0x84> 08000822 : void dwc_endpoints_reset(usbd_device *usbd_dev) { int i; /* The core resets the endpoints automatically on reset. */ usbd_dev->fifo_mem_top = usbd_dev->fifo_mem_top_ep0; 8000822: f8b0 310a ldrh.w r3, [r0, #266] @ 0x10a /* Disable any currently active endpoints */ for (i = 1; i < 4; i++) { if (REBASE(OTG_DOEPCTL(i)) & OTG_DOEPCTL0_EPENA) { 8000826: f8d0 20fc ldr.w r2, [r0, #252] @ 0xfc { 800082a: b510 push {r4, lr} usbd_dev->fifo_mem_top = usbd_dev->fifo_mem_top_ep0; 800082c: f8a0 3108 strh.w r3, [r0, #264] @ 0x108 if (REBASE(OTG_DOEPCTL(i)) & OTG_DOEPCTL0_EPENA) { 8000830: f44f 6332 mov.w r3, #2848 @ 0xb20 8000834: /-> 6ad1 ldr r1, [r2, #44] @ 0x2c 8000836: | 5858 ldr r0, [r3, r1] 8000838: | 2800 cmp r0, #0 REBASE(OTG_DOEPCTL(i)) |= OTG_DOEPCTL0_EPDIS; 800083a: | bfbe ittt lt 800083c: | 5858 ldrlt r0, [r3, r1] 800083e: | f040 4080 orrlt.w r0, r0, #1073741824 @ 0x40000000 8000842: | 5058 strlt r0, [r3, r1] } if (REBASE(OTG_DIEPCTL(i)) & OTG_DIEPCTL0_EPENA) { 8000844: | f5a3 7000 sub.w r0, r3, #512 @ 0x200 8000848: | 6ad1 ldr r1, [r2, #44] @ 0x2c 800084a: | 5844 ldr r4, [r0, r1] 800084c: | 2c00 cmp r4, #0 REBASE(OTG_DIEPCTL(i)) |= OTG_DIEPCTL0_EPDIS; 800084e: | bfb8 it lt 8000850: | 5844 ldrlt r4, [r0, r1] for (i = 1; i < 4; i++) { 8000852: | f103 0320 add.w r3, r3, #32 REBASE(OTG_DIEPCTL(i)) |= OTG_DIEPCTL0_EPDIS; 8000856: | bfbc itt lt 8000858: | f044 4480 orrlt.w r4, r4, #1073741824 @ 0x40000000 800085c: | 5044 strlt r4, [r0, r1] for (i = 1; i < 4; i++) { 800085e: | f5b3 6f38 cmp.w r3, #2944 @ 0xb80 8000862: \-- d1e7 bne.n 8000834 <dwc_endpoints_reset+0x12> } } /* Flush all tx/rx fifos */ REBASE(OTG_GRSTCTL) = OTG_GRSTCTL_TXFFLSH | OTG_GRSTCTL_TXFNUM_ALL 8000864: 6ad3 ldr r3, [r2, #44] @ 0x2c 8000866: f44f 6286 mov.w r2, #1072 @ 0x430 800086a: 611a str r2, [r3, #16] | OTG_GRSTCTL_RXFFLSH; } 800086c: bd10 pop {r4, pc} 0800086e : void dwc_ep_stall_set(usbd_device *usbd_dev, uint8_t addr, uint8_t stall) { if (addr == 0) { if (stall) { REBASE(OTG_DIEPCTL(addr)) |= OTG_DIEPCTL0_STALL; 800086e: f8d0 00fc ldr.w r0, [r0, #252] @ 0xfc { 8000872: b530 push {r4, r5, lr} REBASE(OTG_DIEPCTL(addr)) |= OTG_DIEPCTL0_STALL; 8000874: 6ac4 ldr r4, [r0, #44] @ 0x2c if (addr == 0) { 8000876: /-------- b9f1 cbnz r1, 80008b6 <dwc_ep_stall_set+0x48> REBASE(OTG_DIEPCTL(addr)) |= OTG_DIEPCTL0_STALL; 8000878: | f8d4 3900 ldr.w r3, [r4, #2304] @ 0x900 if (stall) { 800087c: | /-- b15a cbz r2, 8000896 <dwc_ep_stall_set+0x28> REBASE(OTG_DIEPCTL(addr)) |= OTG_DIEPCTL0_STALL; 800087e: | | f443 1300 orr.w r3, r3, #2097152 @ 0x200000 8000882: | | f8c4 3900 str.w r3, [r4, #2304] @ 0x900 REBASE(OTG_DIEPCTL(addr)) &= ~OTG_DIEPCTL0_STALL; REBASE(OTG_DIEPCTL(addr)) |= OTG_DIEPCTLX_SD0PID; } } else { if (stall) { REBASE(OTG_DOEPCTL(addr)) |= OTG_DOEPCTL0_STALL; 8000886: /--------|-----|-> 3158 adds r1, #88 @ 0x58 8000888: | | | 6ac2 ldr r2, [r0, #44] @ 0x2c 800088a: | | | 0149 lsls r1, r1, #5 800088c: | | | 588b ldr r3, [r1, r2] 800088e: | | | f443 1300 orr.w r3, r3, #2097152 @ 0x200000 } else { REBASE(OTG_DOEPCTL(addr)) &= ~OTG_DOEPCTL0_STALL; REBASE(OTG_DOEPCTL(addr)) |= OTG_DOEPCTLX_SD0PID; 8000892: | | /--|-> 508b str r3, [r1, r2] } } } 8000894: | /-----|--|--|-- e01e b.n 80008d4 <dwc_ep_stall_set+0x66> REBASE(OTG_DIEPCTL(addr)) &= ~OTG_DIEPCTL0_STALL; 8000896: | | | | \-> f423 1300 bic.w r3, r3, #2097152 @ 0x200000 800089a: | | | | f8c4 3900 str.w r3, [r4, #2304] @ 0x900 REBASE(OTG_DOEPCTL(addr)) &= ~OTG_DOEPCTL0_STALL; 800089e: | | /--|--|----> 3158 adds r1, #88 @ 0x58 80008a0: | | | | | 6ac2 ldr r2, [r0, #44] @ 0x2c 80008a2: | | | | | 0149 lsls r1, r1, #5 80008a4: | | | | | 588b ldr r3, [r1, r2] 80008a6: | | | | | f423 1300 bic.w r3, r3, #2097152 @ 0x200000 80008aa: | | | | | 508b str r3, [r1, r2] REBASE(OTG_DOEPCTL(addr)) |= OTG_DOEPCTLX_SD0PID; 80008ac: | | | | | 6ac2 ldr r2, [r0, #44] @ 0x2c 80008ae: | | | | | 588b ldr r3, [r1, r2] 80008b0: | | | | | f043 5380 orr.w r3, r3, #268435456 @ 0x10000000 80008b4: | | | | \----- e7ed b.n 8000892 <dwc_ep_stall_set+0x24> if (addr & 0x80) { 80008b6: | | | \-------> 060b lsls r3, r1, #24 80008b8: | | | /----- d517 bpl.n 80008ea <dwc_ep_stall_set+0x7c> addr &= 0x7F; 80008ba: | | | | f001 017f and.w r1, r1, #127 @ 0x7f 80008be: | | | | 3148 adds r1, #72 @ 0x48 REBASE(OTG_DIEPCTL(addr)) |= OTG_DIEPCTL0_STALL; 80008c0: | | | | 2320 movs r3, #32 80008c2: | | | | fb11 f503 smulbb r5, r1, r3 80008c6: | | | | fb13 4301 smlabb r3, r3, r1, r4 if (stall) { 80008ca: | | | | /-- b122 cbz r2, 80008d6 <dwc_ep_stall_set+0x68> REBASE(OTG_DIEPCTL(addr)) |= OTG_DIEPCTL0_STALL; 80008cc: | | | | | 681a ldr r2, [r3, #0] 80008ce: | | | | | f442 1200 orr.w r2, r2, #2097152 @ 0x200000 80008d2: | | | | | 601a str r2, [r3, #0] } 80008d4: | >--|-----|--|-> bd30 pop {r4, r5, pc} REBASE(OTG_DIEPCTL(addr)) &= ~OTG_DIEPCTL0_STALL; 80008d6: | | | | \-> 681a ldr r2, [r3, #0] 80008d8: | | | | f422 1200 bic.w r2, r2, #2097152 @ 0x200000 80008dc: | | | | 601a str r2, [r3, #0] REBASE(OTG_DIEPCTL(addr)) |= OTG_DIEPCTLX_SD0PID; 80008de: | | | | 6ac2 ldr r2, [r0, #44] @ 0x2c 80008e0: | | | | 58ab ldr r3, [r5, r2] 80008e2: | | | | f043 5380 orr.w r3, r3, #268435456 @ 0x10000000 80008e6: | | | | 50ab str r3, [r5, r2] 80008e8: | \--|-----|----- e7f4 b.n 80008d4 <dwc_ep_stall_set+0x66> if (stall) { 80008ea: | | \----> 2a00 cmp r2, #0 80008ec: | \----------- d0d7 beq.n 800089e <dwc_ep_stall_set+0x30> 80008ee: \----------------- e7ca b.n 8000886 <dwc_ep_stall_set+0x18> 080008f0 : uint8_t dwc_ep_stall_get(usbd_device *usbd_dev, uint8_t addr) { /* Return non-zero if STALL set. */ if (addr & 0x80) { return (REBASE(OTG_DIEPCTL(addr & 0x7f)) & 80008f0: f8d0 30fc ldr.w r3, [r0, #252] @ 0xfc if (addr & 0x80) { 80008f4: 060a lsls r2, r1, #24 return (REBASE(OTG_DIEPCTL(addr & 0x7f)) & 80008f6: 6adb ldr r3, [r3, #44] @ 0x2c 80008f8: bf49 itett mi 80008fa: f001 017f andmi.w r1, r1, #127 @ 0x7f OTG_DIEPCTL0_STALL) ? 1 : 0; } else { return (REBASE(OTG_DOEPCTL(addr)) & 80008fe: 3158 addpl r1, #88 @ 0x58 return (REBASE(OTG_DIEPCTL(addr & 0x7f)) & 8000900: 3148 addmi r1, #72 @ 0x48 8000902: eb03 1341 addmi.w r3, r3, r1, lsl #5 return (REBASE(OTG_DOEPCTL(addr)) & 8000906: bf56 itet pl 8000908: 0149 lslpl r1, r1, #5 return (REBASE(OTG_DIEPCTL(addr & 0x7f)) & 800090a: 6818 ldrmi r0, [r3, #0] return (REBASE(OTG_DOEPCTL(addr)) & 800090c: 58c8 ldrpl r0, [r1, r3] OTG_DOEPCTL0_STALL) ? 1 : 0; 800090e: f3c0 5040 ubfx r0, r0, #21, #1 } } 8000912: 4770 bx lr 08000914 : void dwc_ep_nak_set(usbd_device *usbd_dev, uint8_t addr, uint8_t nak) { /* It does not make sense to force NAK on IN endpoints. */ if (addr & 0x80) { 8000914: 060b lsls r3, r1, #24 8000916: /-------- d40c bmi.n 8000932 <dwc_ep_nak_set+0x1e> return; } usbd_dev->force_nak[addr] = nak; 8000918: | 1843 adds r3, r0, r1 if (nak) { REBASE(OTG_DOEPCTL(addr)) |= OTG_DOEPCTL0_SNAK; 800091a: | 3158 adds r1, #88 @ 0x58 usbd_dev->force_nak[addr] = nak; 800091c: | f883 210c strb.w r2, [r3, #268] @ 0x10c REBASE(OTG_DOEPCTL(addr)) |= OTG_DOEPCTL0_SNAK; 8000920: | f8d0 30fc ldr.w r3, [r0, #252] @ 0xfc 8000924: | 0149 lsls r1, r1, #5 8000926: | 6adb ldr r3, [r3, #44] @ 0x2c if (nak) { 8000928: | /----- b122 cbz r2, 8000934 <dwc_ep_nak_set+0x20> REBASE(OTG_DOEPCTL(addr)) |= OTG_DOEPCTL0_SNAK; 800092a: | | 58ca ldr r2, [r1, r3] 800092c: | | f042 6200 orr.w r2, r2, #134217728 @ 0x8000000 } else { REBASE(OTG_DOEPCTL(addr)) |= OTG_DOEPCTL0_CNAK; 8000930: | | /-> 50ca str r2, [r1, r3] } } 8000932: \--|--|-> 4770 bx lr REBASE(OTG_DOEPCTL(addr)) |= OTG_DOEPCTL0_CNAK; 8000934: \--|-> 58ca ldr r2, [r1, r3] 8000936: | f042 6280 orr.w r2, r2, #67108864 @ 0x4000000 800093a: \-- e7f9 b.n 8000930 <dwc_ep_nak_set+0x1c> 0800093c : int i; addr &= 0x7F; /* Return if endpoint is already enabled. */ if (REBASE(OTG_DIEPTSIZ(addr)) & OTG_DIEPSIZ0_PKTCNT) { 800093c: f8d0 00fc ldr.w r0, [r0, #252] @ 0xfc { 8000940: b5f0 push {r4, r5, r6, r7, lr} if (REBASE(OTG_DIEPTSIZ(addr)) & OTG_DIEPSIZ0_PKTCNT) { 8000942: 6ac5 ldr r5, [r0, #44] @ 0x2c addr &= 0x7F; 8000944: f001 067f and.w r6, r1, #127 @ 0x7f if (REBASE(OTG_DIEPTSIZ(addr)) & OTG_DIEPSIZ0_PKTCNT) { 8000948: 0174 lsls r4, r6, #5 800094a: f505 6111 add.w r1, r5, #2320 @ 0x910 800094e: 5909 ldr r1, [r1, r4] 8000950: 0309 lsls r1, r1, #12 8000952: /----------- d430 bmi.n 80009b6 <dwc_ep_write_packet+0x7a> return 0; } if (IS_ISO_IN(addr)) { 8000954: | f504 6110 add.w r1, r4, #2304 @ 0x900 8000958: | 586f ldr r7, [r5, r1] 800095a: | f407 2740 and.w r7, r7, #786432 @ 0xc0000 800095e: | f5b7 2f80 cmp.w r7, #262144 @ 0x40000 8000962: | /-- d10f bne.n 8000984 <dwc_ep_write_packet+0x48> /* Isochronous support: update odd/even frame bits */ REBASE(OTG_DIEPCTL(addr)) &= ~OTG_DIEPCTLX_FRAME_MASK; 8000964: | | 586f ldr r7, [r5, r1] 8000966: | | f027 5740 bic.w r7, r7, #805306368 @ 0x30000000 800096a: | | 506f str r7, [r5, r1] if ((REBASE(OTG_DSTS) & DSTS_FNSOF_ODD_MASK) == 0) { 800096c: | | 6ac5 ldr r5, [r0, #44] @ 0x2c 800096e: | | f8d5 7808 ldr.w r7, [r5, #2056] @ 0x808 8000972: | | f417 7f80 tst.w r7, #256 @ 0x100 REBASE(OTG_DIEPCTL(addr)) |= OTG_DIEPCTLX_SEVNFRM; 8000976: | | 594f ldr r7, [r1, r5] 8000978: | | bf0c ite eq 800097a: | | f047 5780 orreq.w r7, r7, #268435456 @ 0x10000000 } else { REBASE(OTG_DIEPCTL(addr)) |= OTG_DIEPCTLX_SODDFRM; 800097e: | | f047 5700 orrne.w r7, r7, #536870912 @ 0x20000000 8000982: | | 514f str r7, [r1, r5] } } /* Enable endpoint for transmission. */ REBASE(OTG_DIEPTSIZ(addr)) = OTG_DIEPSIZ0_PKTCNT | len; 8000984: | \-> 6ac7 ldr r7, [r0, #44] @ 0x2c 8000986: | f507 6711 add.w r7, r7, #2320 @ 0x910 800098a: | f443 2c00 orr.w ip, r3, #524288 @ 0x80000 800098e: | f847 c004 str.w ip, [r7, r4] REBASE(OTG_DIEPCTL(addr)) |= OTG_DIEPCTL0_EPENA | 8000992: | 6ac7 ldr r7, [r0, #44] @ 0x2c 8000994: | 59cc ldr r4, [r1, r7] 8000996: | f044 4404 orr.w r4, r4, #2214592512 @ 0x84000000 800099a: | 51cc str r4, [r1, r7] /* Copy buffer to endpoint FIFO, note - memcpy does not work. * ARMv7M supports non-word-aligned accesses, ARMv6M does not. */ #if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) for (i = len; i > 0; i -= 4) { REBASE(OTG_FIFO(addr)) = *buf32++; 800099c: | 1c71 adds r1, r6, #1 REBASE(OTG_DIEPTSIZ(addr)) = OTG_DIEPSIZ0_PKTCNT | len; 800099e: | 461d mov r5, r3 REBASE(OTG_FIFO(addr)) = *buf32++; 80009a0: | 0309 lsls r1, r1, #12 for (i = len; i > 0; i -= 4) { 80009a2: | /----> 2d00 cmp r5, #0 80009a4: | | /-- dc01 bgt.n 80009aa <dwc_ep_write_packet+0x6e> } } #endif /* defined(__ARM_ARCH_6M__) */ return len; } 80009a6: | /--|--|-> 4618 mov r0, r3 80009a8: | | | | bdf0 pop {r4, r5, r6, r7, pc} REBASE(OTG_FIFO(addr)) = *buf32++; 80009aa: | | | \-> 6ac4 ldr r4, [r0, #44] @ 0x2c 80009ac: | | | f852 6b04 ldr.w r6, [r2], #4 80009b0: | | | 510e str r6, [r1, r4] for (i = len; i > 0; i -= 4) { 80009b2: | | | 3d04 subs r5, #4 80009b4: | | \----- e7f5 b.n 80009a2 <dwc_ep_write_packet+0x66> return 0; 80009b6: \--|-------> 2300 movs r3, #0 80009b8: \-------- e7f5 b.n 80009a6 <dwc_ep_write_packet+0x6a> 080009ba : /* idle */ } } void dwc_poll(usbd_device *usbd_dev) { 80009ba: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr} /* Read interrupt status register. */ uint32_t intsts = REBASE(OTG_GINTSTS); 80009be: f8d0 20fc ldr.w r2, [r0, #252] @ 0xfc 80009c2: 6ad3 ldr r3, [r2, #44] @ 0x2c 80009c4: 695e ldr r6, [r3, #20] int i; if (intsts & OTG_GINTSTS_ENUMDNE) { 80009c6: f416 5500 ands.w r5, r6, #8192 @ 0x2000 { 80009ca: 4604 mov r4, r0 if (intsts & OTG_GINTSTS_ENUMDNE) { 80009cc: /-- d01b beq.n 8000a06 <dwc_poll+0x4c> /* Handle USB RESET condition. */ REBASE(OTG_GINTSTS) = OTG_GINTSTS_ENUMDNE; 80009ce: | f44f 5100 mov.w r1, #8192 @ 0x2000 80009d2: | 6159 str r1, [r3, #20] usbd_dev->fifo_mem_top = usbd_dev->driver->rx_fifo_size; 80009d4: | 8e53 ldrh r3, [r2, #50] @ 0x32 80009d6: | f8a0 3108 strh.w r3, [r0, #264] @ 0x108 usbd_dev->current_address = 0; 80009da: | 2500 movs r5, #0 usbd_ep_setup(usbd_dev, 0, USB_ENDPOINT_ATTR_CONTROL, usbd_dev->desc->bMaxPacketSize0, NULL); 80009dc: | 6803 ldr r3, [r0, #0] usbd_dev->current_address = 0; 80009de: | 82c5 strh r5, [r0, #22] usbd_dev->driver->ep_setup(usbd_dev, addr, type, max_size, callback); 80009e0: | 79db ldrb r3, [r3, #7] 80009e2: | 9500 str r5, [sp, #0] 80009e4: | 6896 ldr r6, [r2, #8] 80009e6: | 4629 mov r1, r5 80009e8: | 462a mov r2, r5 80009ea: | 47b0 blx r6 usbd_dev->driver->set_address(usbd_dev, 0); 80009ec: | f8d4 30fc ldr.w r3, [r4, #252] @ 0xfc 80009f0: | 4629 mov r1, r5 80009f2: | 685b ldr r3, [r3, #4] 80009f4: | 4620 mov r0, r4 80009f6: | 4798 blx r3 if (usbd_dev->user_callback_reset) { 80009f8: | 6be3 ldr r3, [r4, #60] @ 0x3c 80009fa: | 2b00 cmp r3, #0 80009fc: /--------------------------|-- d044 beq.n 8000a88 <dwc_poll+0xce> if (usbd_dev->user_callback_sof) { REBASE(OTG_GINTMSK) |= OTG_GINTMSK_SOFM; } else { REBASE(OTG_GINTMSK) &= ~OTG_GINTMSK_SOFM; } } 80009fe: | | b003 add sp, #12 8000a00: | | e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr} usbd_dev->user_callback_reset(); 8000a04: | | 4718 bx r3 REBASE(OTG_DIEPINT(i)) = OTG_DIEPINTX_XFRC; 8000a06: | \-> 2701 movs r7, #1 [USB_TRANSACTION_IN]) { 8000a08: | f100 0888 add.w r8, r0, #136 @ 0x88 8000a0c: | f04f 090c mov.w r9, #12 if (REBASE(OTG_DIEPINT(i)) & OTG_DIEPINTX_XFRC) { 8000a10: | /----> f8d4 30fc ldr.w r3, [r4, #252] @ 0xfc 8000a14: | | 6adb ldr r3, [r3, #44] @ 0x2c 8000a16: | | 016a lsls r2, r5, #5 8000a18: | | f603 1308 addw r3, r3, #2312 @ 0x908 8000a1c: | | 5899 ldr r1, [r3, r2] 8000a1e: | | 07c9 lsls r1, r1, #31 8000a20: | | /-- d508 bpl.n 8000a34 <dwc_poll+0x7a> REBASE(OTG_DIEPINT(i)) = OTG_DIEPINTX_XFRC; 8000a22: | | | 509f str r7, [r3, r2] [USB_TRANSACTION_IN]) { 8000a24: | | | fb09 f305 mul.w r3, r9, r5 8000a28: | | | f858 3003 ldr.w r3, [r8, r3] if (usbd_dev->user_callback_ctr[i] 8000a2c: | | +-- b113 cbz r3, 8000a34 <dwc_poll+0x7a> usbd_dev->user_callback_ctr[i] 8000a2e: | | | b2e9 uxtb r1, r5 8000a30: | | | 4620 mov r0, r4 8000a32: | | | 4798 blx r3 for (i = 0; i < 4; i++) { /* Iterate over endpoints. */ 8000a34: | | \-> 3501 adds r5, #1 8000a36: | | 2d04 cmp r5, #4 8000a38: | \----- d1ea bne.n 8000a10 <dwc_poll+0x56> if (intsts & OTG_GINTSTS_RXFLVL) { 8000a3a: | 06f3 lsls r3, r6, #27 8000a3c: | /-------- d561 bpl.n 8000b02 <dwc_poll+0x148> uint32_t rxstsp = REBASE(OTG_GRXSTSP); 8000a3e: | | f8d4 10fc ldr.w r1, [r4, #252] @ 0xfc 8000a42: | | 6acb ldr r3, [r1, #44] @ 0x2c 8000a44: | | 6a1a ldr r2, [r3, #32] uint32_t pktsts = rxstsp & OTG_GRXSTSP_PKTSTS_MASK; 8000a46: | | f402 10f0 and.w r0, r2, #1966080 @ 0x1e0000 if (pktsts == OTG_GRXSTSP_PKTSTS_OUT_COMP 8000a4a: | | f5b0 2fc0 cmp.w r0, #393216 @ 0x60000 uint8_t ep = rxstsp & OTG_GRXSTSP_EPNUM_MASK; 8000a4e: | | f002 050f and.w r5, r2, #15 if (pktsts == OTG_GRXSTSP_PKTSTS_OUT_COMP 8000a52: | | /-- d002 beq.n 8000a5a <dwc_poll+0xa0> || pktsts == OTG_GRXSTSP_PKTSTS_SETUP_COMP) { 8000a54: | | | f5b0 2f00 cmp.w r0, #524288 @ 0x80000 8000a58: | | /--|-- d119 bne.n 8000a8e <dwc_poll+0xd4> REBASE(OTG_DOEPTSIZ(ep)) = usbd_dev->doeptsiz[ep]; 8000a5a: | | | \-> f105 0044 add.w r0, r5, #68 @ 0x44 8000a5e: | | | 016a lsls r2, r5, #5 8000a60: | | | f503 6331 add.w r3, r3, #2832 @ 0xb10 8000a64: | | | f854 0020 ldr.w r0, [r4, r0, lsl #2] 8000a68: | | | 5098 str r0, [r3, r2] (usbd_dev->force_nak[ep] ? 8000a6a: | | | 4425 add r5, r4 REBASE(OTG_DOEPCTL(ep)) |= OTG_DOEPCTL0_EPENA | 8000a6c: | | | 6ac9 ldr r1, [r1, #44] @ 0x2c 8000a6e: | | | f895 010c ldrb.w r0, [r5, #268] @ 0x10c 8000a72: | | | f502 6330 add.w r3, r2, #2816 @ 0xb00 8000a76: | | | 2800 cmp r0, #0 8000a78: | | | 585a ldr r2, [r3, r1] 8000a7a: | | | bf0c ite eq 8000a7c: | | | f04f 4004 moveq.w r0, #2214592512 @ 0x84000000 8000a80: | | | f04f 4008 movne.w r0, #2281701376 @ 0x88000000 8000a84: | | | 4302 orrs r2, r0 8000a86: | | | 505a str r2, [r3, r1] } 8000a88: >--------------------|--|----> b003 add sp, #12 8000a8a: | | | e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} if ((pktsts != OTG_GRXSTSP_PKTSTS_OUT) && 8000a8e: | | \----> f5b0 2f80 cmp.w r0, #262144 @ 0x40000 8000a92: | /-----------------|-------- f000 808b beq.w 8000bac <dwc_poll+0x1f2> 8000a96: | | | f5b0 2f40 cmp.w r0, #786432 @ 0xc0000 8000a9a: +--|-----------------|-------- d1f5 bne.n 8000a88 <dwc_poll+0xce> && (REBASE(OTG_DIEPTSIZ(ep)) & OTG_DIEPSIZ0_PKTCNT)) { 8000a9c: | | | 0168 lsls r0, r5, #5 8000a9e: | | | f503 6711 add.w r7, r3, #2320 @ 0x910 8000aa2: | | | 583f ldr r7, [r7, r0] 8000aa4: | | | 033f lsls r7, r7, #12 8000aa6: | | /--|-------- d457 bmi.n 8000b58 <dwc_poll+0x19e> type = USB_TRANSACTION_SETUP; 8000aa8: | | /--------|--|-------> 2102 movs r1, #2 if (usbd_dev->user_callback_ctr[ep][type]) { 8000aaa: | | /--|--------|--|-------> eb05 0345 add.w r3, r5, r5, lsl #1 8000aae: | | | | | | 440b add r3, r1 8000ab0: | | | | | | 3322 adds r3, #34 @ 0x22 usbd_dev->rxbcnt = (rxstsp & OTG_GRXSTSP_BCNT_MASK) >> 4; 8000ab2: | | | | | | f3c2 120a ubfx r2, r2, #4, #11 if (usbd_dev->user_callback_ctr[ep][type]) { 8000ab6: | | | | | | f854 3023 ldr.w r3, [r4, r3, lsl #2] usbd_dev->rxbcnt = (rxstsp & OTG_GRXSTSP_BCNT_MASK) >> 4; 8000aba: | | | | | | f8a4 2120 strh.w r2, [r4, #288] @ 0x120 if (usbd_dev->user_callback_ctr[ep][type]) { 8000abe: | | | | | | /-- b113 cbz r3, 8000ac6 <dwc_poll+0x10c> usbd_dev->user_callback_ctr[ep][type] (usbd_dev, ep); 8000ac0: | | | | | | | 4629 mov r1, r5 8000ac2: | | | | | | | 4620 mov r0, r4 8000ac4: | | | | | | | 4798 blx r3 if (REBASE(OTG_CID) >= OTG_CID_CNAK_EARLY) { 8000ac6: | | | | | | \-> f8d4 00fc ldr.w r0, [r4, #252] @ 0xfc 8000aca: | | | | | | 6ac2 ldr r2, [r0, #44] @ 0x2c 8000acc: | | | | | | 6bd3 ldr r3, [r2, #60] @ 0x3c 8000ace: | | | | | | f5b3 5f00 cmp.w r3, #8192 @ 0x2000 8000ad2: | | | | | | /-- d30e bcc.n 8000af2 <dwc_poll+0x138> REBASE(OTG_DOEPCTL(ep)) |= usbd_dev->force_nak[ep] ? 8000ad4: | | | | | | | f105 0358 add.w r3, r5, #88 @ 0x58 8000ad8: | | | | | | | 4425 add r5, r4 8000ada: | | | | | | | 015b lsls r3, r3, #5 OTG_DOEPCTL0_SNAK : OTG_DOEPCTL0_CNAK; 8000adc: | | | | | | | f895 510c ldrb.w r5, [r5, #268] @ 0x10c REBASE(OTG_DOEPCTL(ep)) |= usbd_dev->force_nak[ep] ? 8000ae0: | | | | | | | 5899 ldr r1, [r3, r2] OTG_DOEPCTL0_SNAK : OTG_DOEPCTL0_CNAK; 8000ae2: | | | | | | | 2d00 cmp r5, #0 8000ae4: | | | | | | | bf0c ite eq 8000ae6: | | | | | | | f04f 6580 moveq.w r5, #67108864 @ 0x4000000 8000aea: | | | | | | | f04f 6500 movne.w r5, #134217728 @ 0x8000000 REBASE(OTG_DOEPCTL(ep)) |= usbd_dev->force_nak[ep] ? 8000aee: | | | | | | | 4329 orrs r1, r5 8000af0: | | | | | | | 5099 str r1, [r3, r2] for (i = 0; i < usbd_dev->rxbcnt; i += 4) { 8000af2: | | | | | | \-> f8b4 1120 ldrh.w r1, [r4, #288] @ 0x120 8000af6: | | | | | | 2300 movs r3, #0 8000af8: | | | | /-----|--|-------> 4299 cmp r1, r3 8000afa: | | | | | /--|--|-------- dc59 bgt.n 8000bb0 <dwc_poll+0x1f6> usbd_dev->rxbcnt = 0; 8000afc: | | | | | | | | 2300 movs r3, #0 8000afe: | | | | | | | | f8a4 3120 strh.w r3, [r4, #288] @ 0x120 if (intsts & OTG_GINTSTS_USBSUSP) { 8000b02: | | | | | | | \-------> 0532 lsls r2, r6, #20 8000b04: | | | | | | | /----- d508 bpl.n 8000b18 <dwc_poll+0x15e> if (usbd_dev->user_callback_suspend) { 8000b06: | | | | | | | | 6c23 ldr r3, [r4, #64] @ 0x40 8000b08: | | | | | | | | /-- b103 cbz r3, 8000b0c <dwc_poll+0x152> usbd_dev->user_callback_suspend(); 8000b0a: | | | | | | | | | 4798 blx r3 REBASE(OTG_GINTSTS) = OTG_GINTSTS_USBSUSP; 8000b0c: | | | | | | | | \-> f8d4 30fc ldr.w r3, [r4, #252] @ 0xfc 8000b10: | | | | | | | | 6adb ldr r3, [r3, #44] @ 0x2c 8000b12: | | | | | | | | f44f 6200 mov.w r2, #2048 @ 0x800 8000b16: | | | | | | | | 615a str r2, [r3, #20] if (intsts & OTG_GINTSTS_WKUPINT) { 8000b18: | | | | | | | \----> 2e00 cmp r6, #0 8000b1a: | | | | | | | /----- da08 bge.n 8000b2e <dwc_poll+0x174> if (usbd_dev->user_callback_resume) { 8000b1c: | | | | | | | | 6c63 ldr r3, [r4, #68] @ 0x44 8000b1e: | | | | | | | | /-- b103 cbz r3, 8000b22 <dwc_poll+0x168> usbd_dev->user_callback_resume(); 8000b20: | | | | | | | | | 4798 blx r3 REBASE(OTG_GINTSTS) = OTG_GINTSTS_WKUPINT; 8000b22: | | | | | | | | \-> f8d4 30fc ldr.w r3, [r4, #252] @ 0xfc 8000b26: | | | | | | | | 6adb ldr r3, [r3, #44] @ 0x2c 8000b28: | | | | | | | | f04f 4200 mov.w r2, #2147483648 @ 0x80000000 8000b2c: | | | | | | | | 615a str r2, [r3, #20] if (intsts & OTG_GINTSTS_SOF) { 8000b2e: | | | | | | | \----> 0733 lsls r3, r6, #28 8000b30: | | | | | | | /----- d507 bpl.n 8000b42 <dwc_poll+0x188> if (usbd_dev->user_callback_sof) { 8000b32: | | | | | | | | 6ca3 ldr r3, [r4, #72] @ 0x48 8000b34: | | | | | | | | /-- b103 cbz r3, 8000b38 <dwc_poll+0x17e> usbd_dev->user_callback_sof(); 8000b36: | | | | | | | | | 4798 blx r3 REBASE(OTG_GINTSTS) = OTG_GINTSTS_SOF; 8000b38: | | | | | | | | \-> f8d4 30fc ldr.w r3, [r4, #252] @ 0xfc 8000b3c: | | | | | | | | 6adb ldr r3, [r3, #44] @ 0x2c 8000b3e: | | | | | | | | 2208 movs r2, #8 8000b40: | | | | | | | | 615a str r2, [r3, #20] REBASE(OTG_GINTMSK) |= OTG_GINTMSK_SOFM; 8000b42: | | | | | | | \----> f8d4 30fc ldr.w r3, [r4, #252] @ 0xfc if (usbd_dev->user_callback_sof) { 8000b46: | | | | | | | 6ca2 ldr r2, [r4, #72] @ 0x48 REBASE(OTG_GINTMSK) |= OTG_GINTMSK_SOFM; 8000b48: | | | | | | | 6adb ldr r3, [r3, #44] @ 0x2c if (usbd_dev->user_callback_sof) { 8000b4a: | | | | | | | 2a00 cmp r2, #0 8000b4c: | | | | | | | /-------- d036 beq.n 8000bbc <dwc_poll+0x202> REBASE(OTG_GINTMSK) |= OTG_GINTMSK_SOFM; 8000b4e: | | | | | | | | 699a ldr r2, [r3, #24] 8000b50: | | | | | | | | f042 0208 orr.w r2, r2, #8 REBASE(OTG_GINTMSK) &= ~OTG_GINTMSK_SOFM; 8000b54: | | | | | | | | /----> 619a str r2, [r3, #24] 8000b56: \--|--|--|--|--|--|--|--|----- e797 b.n 8000a88 <dwc_poll+0xce> REBASE(OTG_DIEPCTL(ep)) |= OTG_DIEPCTL0_SNAK; 8000b58: | | | | | \--|--|----> f500 6c10 add.w ip, r0, #2304 @ 0x900 8000b5c: | | | | | | | f853 700c ldr.w r7, [r3, ip] 8000b60: | | | | | | | f047 6700 orr.w r7, r7, #134217728 @ 0x8000000 8000b64: | | | | | | | f843 700c str.w r7, [r3, ip] while (!(REBASE(OTG_DIEPINT(ep)) & OTG_DIEPINTX_INEPNE)) { 8000b68: | | | | | | | 6acf ldr r7, [r1, #44] @ 0x2c 8000b6a: | | | | | | | f607 1308 addw r3, r7, #2312 @ 0x908 8000b6e: | | | | | | | 4403 add r3, r0 8000b70: | | | | | | | /-> f8d3 e000 ldr.w lr, [r3] 8000b74: | | | | | | | | f01e 0f40 tst.w lr, #64 @ 0x40 8000b78: | | | | | | | \-- d0fa beq.n 8000b70 <dwc_poll+0x1b6> fifo = (REBASE(OTG_DIEPCTL(ep)) & OTG_DIEPCTL0_TXFNUM_MASK) >> 22; 8000b7a: | | | | | | | f85c 3007 ldr.w r3, [ip, r7] 8000b7e: | | | | | | | 0d9b lsrs r3, r3, #22 while (!(REBASE(OTG_GRSTCTL) & OTG_GRSTCTL_AHBIDL)) { 8000b80: | | | | | | | /-> f8d7 c010 ldr.w ip, [r7, #16] 8000b84: | | | | | | | | f1bc 0f00 cmp.w ip, #0 8000b88: | | | | | | | \-- dafa bge.n 8000b80 <dwc_poll+0x1c6> REBASE(OTG_GRSTCTL) = (fifo << 6) | OTG_GRSTCTL_TXFFLSH; 8000b8a: | | | | | | | 019b lsls r3, r3, #6 8000b8c: | | | | | | | f403 7370 and.w r3, r3, #960 @ 0x3c0 8000b90: | | | | | | | f043 0320 orr.w r3, r3, #32 8000b94: | | | | | | | 613b str r3, [r7, #16] REBASE(OTG_DIEPTSIZ(ep)) = 0; 8000b96: | | | | | | | 6acb ldr r3, [r1, #44] @ 0x2c 8000b98: | | | | | | | f503 6311 add.w r3, r3, #2320 @ 0x910 8000b9c: | | | | | | | 2700 movs r7, #0 8000b9e: | | | | | | | 501f str r7, [r3, r0] while ((REBASE(OTG_GRSTCTL) & OTG_GRSTCTL_TXFFLSH)) { 8000ba0: | | | | | | | 6acb ldr r3, [r1, #44] @ 0x2c 8000ba2: | | | | | | | 3310 adds r3, #16 8000ba4: | | | | | | | /-> 6819 ldr r1, [r3, #0] 8000ba6: | | | | | | | | 0689 lsls r1, r1, #26 8000ba8: | | | | | | | \-- d4fc bmi.n 8000ba4 <dwc_poll+0x1ea> 8000baa: | | \--|--|-----|--|----- e77d b.n 8000aa8 <dwc_poll+0xee> type = USB_TRANSACTION_OUT; 8000bac: \--|-----|--|-----|--|----> 2101 movs r1, #1 8000bae: \-----|--|-----|--|----- e77c b.n 8000aaa <dwc_poll+0xf0> (void)REBASE(OTG_FIFO(0)); 8000bb0: | \-----|--|----> 6ac2 ldr r2, [r0, #44] @ 0x2c 8000bb2: | | | f502 5280 add.w r2, r2, #4096 @ 0x1000 for (i = 0; i < usbd_dev->rxbcnt; i += 4) { 8000bb6: | | | 3304 adds r3, #4 (void)REBASE(OTG_FIFO(0)); 8000bb8: | | | 6812 ldr r2, [r2, #0] for (i = 0; i < usbd_dev->rxbcnt; i += 4) { 8000bba: \--------|--|----- e79d b.n 8000af8 <dwc_poll+0x13e> REBASE(OTG_GINTMSK) &= ~OTG_GINTMSK_SOFM; 8000bbc: \--|----> 699a ldr r2, [r3, #24] 8000bbe: | f022 0208 bic.w r2, r2, #8 8000bc2: \----- e7c7 b.n 8000b54 <dwc_poll+0x19a> 08000bc4 : void dwc_disconnect(usbd_device *usbd_dev, bool disconnected) { if (disconnected) { REBASE(OTG_DCTL) |= OTG_DCTL_SDIS; 8000bc4: f8d0 30fc ldr.w r3, [r0, #252] @ 0xfc 8000bc8: 6adb ldr r3, [r3, #44] @ 0x2c 8000bca: f8d3 2804 ldr.w r2, [r3, #2052] @ 0x804 if (disconnected) { 8000bce: /----- b121 cbz r1, 8000bda <dwc_disconnect+0x16> REBASE(OTG_DCTL) |= OTG_DCTL_SDIS; 8000bd0: | f042 0202 orr.w r2, r2, #2 } else { REBASE(OTG_DCTL) &= ~OTG_DCTL_SDIS; 8000bd4: | /-> f8c3 2804 str.w r2, [r3, #2052] @ 0x804 } } 8000bd8: | | 4770 bx lr REBASE(OTG_DCTL) &= ~OTG_DCTL_SDIS; 8000bda: \--|-> f022 0202 bic.w r2, r2, #2 8000bde: \-- e7f9 b.n 8000bd4 <dwc_disconnect+0x10> 08000be0 : #else int i; struct memp *memp; *desc->tab = NULL; memp = (struct memp *)LWIP_MEM_ALIGN(desc->base); 8000be0: 68c3 ldr r3, [r0, #12] *desc->tab = NULL; 8000be2: 6901 ldr r1, [r0, #16] { 8000be4: b530 push {r4, r5, lr} *desc->tab = NULL; 8000be6: 2200 movs r2, #0 memp = (struct memp *)LWIP_MEM_ALIGN(desc->base); 8000be8: 3303 adds r3, #3 + MEM_SANITY_REGION_AFTER_ALIGNED #endif )); #endif /* create a linked list of memp elements */ for (i = 0; i < desc->num; ++i) { 8000bea: 8944 ldrh r4, [r0, #10] *desc->tab = NULL; 8000bec: 600a str r2, [r1, #0] memp = (struct memp *)LWIP_MEM_ALIGN(desc->base); 8000bee: f023 0303 bic.w r3, r3, #3 for (i = 0; i < desc->num; ++i) { 8000bf2: /----> 4294 cmp r4, r2 8000bf4: | /-- dc04 bgt.n 8000c00 <memp_init_pool+0x20> + MEM_SANITY_REGION_AFTER_ALIGNED #endif ); } #if MEMP_STATS desc->stats->avail = desc->num; 8000bf6: | | 6843 ldr r3, [r0, #4] #endif /* MEMP_STATS */ #endif /* !MEMP_MEM_MALLOC */ #if MEMP_STATS && (defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY) desc->stats->name = desc->desc; 8000bf8: | | 6802 ldr r2, [r0, #0] desc->stats->avail = desc->num; 8000bfa: | | 80dc strh r4, [r3, #6] desc->stats->name = desc->desc; 8000bfc: | | 601a str r2, [r3, #0] #endif /* MEMP_STATS && (defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY) */ } 8000bfe: | | bd30 pop {r4, r5, pc} memp->next = *desc->tab; 8000c00: | \-> 680d ldr r5, [r1, #0] 8000c02: | 601d str r5, [r3, #0] memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + desc->size 8000c04: | 8905 ldrh r5, [r0, #8] *desc->tab = memp; 8000c06: | 600b str r3, [r1, #0] for (i = 0; i < desc->num; ++i) { 8000c08: | 3201 adds r2, #1 memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + desc->size 8000c0a: | 442b add r3, r5 for (i = 0; i < desc->num; ++i) { 8000c0c: \----- e7f1 b.n 8000bf2 <memp_init_pool+0x12> 08000c0e : } static u8_t tcp_get_next_optbyte(void) { u16_t optidx = tcp_optidx++; 8000c0e: 4a0b ldr r2, [pc, #44] @ (8000c3c ) 8000c10: f8b2 3128 ldrh.w r3, [r2, #296] @ 0x128 8000c14: 1c59 adds r1, r3, #1 8000c16: f8a2 1128 strh.w r1, [r2, #296] @ 0x128 if ((tcphdr_opt2 == NULL) || (optidx < tcphdr_opt1len)) { 8000c1a: f8d2 112c ldr.w r1, [r2, #300] @ 0x12c 8000c1e: /-- b119 cbz r1, 8000c28 <tcp_get_next_optbyte+0x1a> 8000c20: | f8b2 0130 ldrh.w r0, [r2, #304] @ 0x130 8000c24: | 4283 cmp r3, r0 8000c26: /--|-- d204 bcs.n 8000c32 <tcp_get_next_optbyte+0x24> u8_t *opts = (u8_t *)tcphdr + TCP_HLEN; return opts[optidx]; 8000c28: | \-> f8d2 2134 ldr.w r2, [r2, #308] @ 0x134 8000c2c: | 4413 add r3, r2 8000c2e: | 7d18 ldrb r0, [r3, #20] 8000c30: | 4770 bx lr } else { u8_t idx = (u8_t)(optidx - tcphdr_opt1len); 8000c32: \----> 1a1b subs r3, r3, r0 return tcphdr_opt2[idx]; 8000c34: b2db uxtb r3, r3 8000c36: 5cc8 ldrb r0, [r1, r3] } } 8000c38: 4770 bx lr 8000c3a: bf00 nop 8000c3c: 20000060 .word 0x20000060 08000c40 : ("acd_netif_ip_addr_changed(): old address = %s\n", ipaddr_ntoa(old_addr))); LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("acd_netif_ip_addr_changed(): new address = %s\n", ipaddr_ntoa(new_addr))); /* If we change from ANY to an IP or from an IP to ANY we do nothing */ if (ip_addr_isany(old_addr) || ip_addr_isany(new_addr)) { 8000c40: 680b ldr r3, [r1, #0] { 8000c42: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 8000c46: 4605 mov r5, r0 8000c48: 460e mov r6, r1 8000c4a: 4617 mov r7, r2 if (ip_addr_isany(old_addr) || ip_addr_isany(new_addr)) { 8000c4c: /----- b12b cbz r3, 8000c5a <acd_netif_ip_addr_changed+0x1a> 8000c4e: | 6813 ldr r3, [r2, #0] 8000c50: +----- b11b cbz r3, 8000c5a <acd_netif_ip_addr_changed+0x1a> return; } ACD_FOREACH(acd, netif->acd_list) { 8000c52: | 6bc4 ldr r4, [r0, #60] @ 0x3c /* Find ACD module of old address */ if(ip4_addr_eq(&acd->ipaddr, ip_2_ip4(old_addr))) { /* Did we change from a LL address to a routable address? */ if (ip_addr_islinklocal(old_addr) && !ip_addr_islinklocal(new_addr)) { 8000c54: | f64f 68a9 movw r8, #65193 @ 0xfea9 ACD_FOREACH(acd, netif->acd_list) { 8000c58: /--------|--/-X b90c cbnz r4, 8000c5e <acd_netif_ip_addr_changed+0x1e> /* Put the module in passive conflict detection mode */ acd_put_in_passive_mode(netif, acd); } } } } 8000c5a: | \--|-> e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if(ip4_addr_eq(&acd->ipaddr, ip_2_ip4(old_addr))) { 8000c5e: | \-> 6832 ldr r2, [r6, #0] 8000c60: | 6863 ldr r3, [r4, #4] 8000c62: | 4293 cmp r3, r2 8000c64: | /----------- d116 bne.n 8000c94 <acd_netif_ip_addr_changed+0x54> if (ip_addr_islinklocal(old_addr) && !ip_addr_islinklocal(new_addr)) { 8000c66: | | b29b uxth r3, r3 8000c68: | | 4543 cmp r3, r8 8000c6a: | +----------- d113 bne.n 8000c94 <acd_netif_ip_addr_changed+0x54> 8000c6c: | | 883b ldrh r3, [r7, #0] 8000c6e: | | 4543 cmp r3, r8 8000c70: | +----------- d010 beq.n 8000c94 <acd_netif_ip_addr_changed+0x54> switch(acd->state) { 8000c72: | | 7a23 ldrb r3, [r4, #8] 8000c74: | | 2b05 cmp r3, #5 8000c76: | | /----- d80b bhi.n 8000c90 <acd_netif_ip_addr_changed+0x50> 8000c78: | | | 2b03 cmp r3, #3 8000c7a: | | /--|----- d80d bhi.n 8000c98 <acd_netif_ip_addr_changed+0x58> 8000c7c: | | | | 3b01 subs r3, #1 8000c7e: | | | | 2b02 cmp r3, #2 8000c80: | +--|--|----- d808 bhi.n 8000c94 <acd_netif_ip_addr_changed+0x54> acd->state = ACD_STATE_OFF; 8000c82: | | | | /-> 2300 movs r3, #0 8000c84: | | | | | 7223 strb r3, [r4, #8] acd->acd_conflict_callback(netif, ACD_DECLINE); 8000c86: | | | | | 2102 movs r1, #2 8000c88: | | | | | 6923 ldr r3, [r4, #16] 8000c8a: | | | | | 4628 mov r0, r5 8000c8c: | | | | | 4798 blx r3 break; 8000c8e: | +--|--|--|-- e001 b.n 8000c94 <acd_netif_ip_addr_changed+0x54> switch(acd->state) { 8000c90: | | | \--|-> 2b07 cmp r3, #7 8000c92: | | | \-- d0f6 beq.n 8000c82 <acd_netif_ip_addr_changed+0x42> ACD_FOREACH(acd, netif->acd_list) { 8000c94: | >--|-------> 6824 ldr r4, [r4, #0] 8000c96: \--|--|-------- e7df b.n 8000c58 <acd_netif_ip_addr_changed+0x18> acd->state = ACD_STATE_PASSIVE_ONGOING; 8000c98: | \-------> 2306 movs r3, #6 8000c9a: | 7223 strb r3, [r4, #8] break; 8000c9c: \----------- e7fa b.n 8000c94 <acd_netif_ip_addr_changed+0x54> 08000c9e : ecm_sg_t *q = *p; 8000c9e: 6802 ldr r2, [r0, #0] usbd_ep_write_packet(usbdev, ECM_IN_ENDP_ADDR, q->payload, q->len); 8000ca0: 4803 ldr r0, [pc, #12] @ (8000cb0 ) 8000ca2: 8853 ldrh r3, [r2, #2] 8000ca4: 6800 ldr r0, [r0, #0] 8000ca6: 3204 adds r2, #4 8000ca8: 2182 movs r1, #130 @ 0x82 8000caa: f009 be31 b.w 800a910 <usbd_ep_write_packet.isra.0> 8000cae: bf00 nop 8000cb0: 20000060 .word 0x20000060 08000cb4 : { 8000cb4: b510 push {r4, lr} if (usbd_dev->desc->bMaxPacketSize0 < 8000cb6: 6803 ldr r3, [r0, #0] usbd_dev->control_state.ctrl_buf, 8000cb8: 6d82 ldr r2, [r0, #88] @ 0x58 if (usbd_dev->desc->bMaxPacketSize0 < 8000cba: 79d9 ldrb r1, [r3, #7] usbd_dev->control_state.ctrl_len) { 8000cbc: f8b0 305c ldrh.w r3, [r0, #92] @ 0x5c if (usbd_dev->desc->bMaxPacketSize0 < 8000cc0: 4299 cmp r1, r3 { 8000cc2: 4604 mov r4, r0 if (usbd_dev->desc->bMaxPacketSize0 < 8000cc4: /----- d211 bcs.n 8000cea <usb_control_send_chunk+0x36> usbd_ep_write_packet(usbd_dev, 0, 8000cc6: | 460b mov r3, r1 8000cc8: | 2100 movs r1, #0 8000cca: | f009 fe21 bl 800a910 <usbd_ep_write_packet.isra.0> usbd_dev->control_state.state = DATA_IN; 8000cce: | 2302 movs r3, #2 8000cd0: | f884 304c strb.w r3, [r4, #76] @ 0x4c usbd_dev->desc->bMaxPacketSize0; 8000cd4: | 6823 ldr r3, [r4, #0] 8000cd6: | 79da ldrb r2, [r3, #7] usbd_dev->control_state.ctrl_buf += 8000cd8: | 6da3 ldr r3, [r4, #88] @ 0x58 8000cda: | 4413 add r3, r2 8000cdc: | 65a3 str r3, [r4, #88] @ 0x58 usbd_dev->control_state.ctrl_len -= 8000cde: | f8b4 305c ldrh.w r3, [r4, #92] @ 0x5c 8000ce2: | 1a9b subs r3, r3, r2 8000ce4: | f8a4 305c strh.w r3, [r4, #92] @ 0x5c } 8000ce8: | /-> bd10 pop {r4, pc} usbd_ep_write_packet(usbd_dev, 0, 8000cea: \--|-> 2100 movs r1, #0 8000cec: | f009 fe10 bl 800a910 <usbd_ep_write_packet.isra.0> usbd_dev->control_state.state = 8000cf0: | f894 3064 ldrb.w r3, [r4, #100] @ 0x64 8000cf4: | f1c3 0303 rsb r3, r3, #3 8000cf8: | f884 304c strb.w r3, [r4, #76] @ 0x4c usbd_dev->control_state.needs_zlp = false; 8000cfc: | 2300 movs r3, #0 8000cfe: | f884 3064 strb.w r3, [r4, #100] @ 0x64 usbd_dev->control_state.ctrl_len = 0; 8000d02: | f8a4 305c strh.w r3, [r4, #92] @ 0x5c usbd_dev->control_state.ctrl_buf = NULL; 8000d06: | 65a3 str r3, [r4, #88] @ 0x58 } 8000d08: \-- e7ee b.n 8000ce8 <usb_control_send_chunk+0x34> 08000d0a <_usbd_control_in>: stall_transaction(usbd_dev); } } void _usbd_control_in(usbd_device *usbd_dev, uint8_t ea) { 8000d0a: b510 push {r4, lr} (void)ea; struct usb_setup_data *req = &(usbd_dev->control_state.req); switch (usbd_dev->control_state.state) { 8000d0c: f890 304c ldrb.w r3, [r0, #76] @ 0x4c 8000d10: 2b03 cmp r3, #3 { 8000d12: 4604 mov r4, r0 switch (usbd_dev->control_state.state) { 8000d14: /-- d006 beq.n 8000d24 <_usbd_control_in+0x1a> 8000d16: | 2b04 cmp r3, #4 8000d18: /--|-- d008 beq.n 8000d2c <_usbd_control_in+0x22> 8000d1a: | | 2b02 cmp r3, #2 8000d1c: /-----|--|-- d11c bne.n 8000d58 <_usbd_control_in+0x4e> usbd_dev->control_state.state = IDLE; break; default: stall_transaction(usbd_dev); } } 8000d1e: | | | e8bd 4010 ldmia.w sp!, {r4, lr} usb_control_send_chunk(usbd_dev); 8000d22: | | | e7c7 b.n 8000cb4 <usb_control_send_chunk> usbd_dev->control_state.state = STATUS_OUT; 8000d24: | | \-> 2307 movs r3, #7 usbd_dev->control_state.state = IDLE; 8000d26: | /--|----> f884 304c strb.w r3, [r4, #76] @ 0x4c } 8000d2a: | | | bd10 pop {r4, pc} if (usbd_dev->control_state.complete) { 8000d2c: | | \----> 6e03 ldr r3, [r0, #96] @ 0x60 8000d2e: | | /-- b113 cbz r3, 8000d36 <_usbd_control_in+0x2c> usbd_dev->control_state.complete(usbd_dev, 8000d30: | | | f100 0150 add.w r1, r0, #80 @ 0x50 8000d34: | | | 4798 blx r3 if ((req->bmRequestType == 0) && 8000d36: | | \-> f894 3050 ldrb.w r3, [r4, #80] @ 0x50 8000d3a: | | /-- b95b cbnz r3, 8000d54 <_usbd_control_in+0x4a> 8000d3c: | | | f894 3051 ldrb.w r3, [r4, #81] @ 0x51 8000d40: | | | 2b05 cmp r3, #5 8000d42: | | +-- d107 bne.n 8000d54 <_usbd_control_in+0x4a> usbd_dev->driver->set_address(usbd_dev, req->wValue); 8000d44: | | | f8b4 1052 ldrh.w r1, [r4, #82] @ 0x52 8000d48: | | | f8d4 30fc ldr.w r3, [r4, #252] @ 0xfc 8000d4c: | | | b2c9 uxtb r1, r1 8000d4e: | | | 685b ldr r3, [r3, #4] 8000d50: | | | 4620 mov r0, r4 8000d52: | | | 4798 blx r3 usbd_dev->control_state.state = IDLE; 8000d54: | | \-> 2300 movs r3, #0 8000d56: | \-------- e7e6 b.n 8000d26 <_usbd_control_in+0x1c> } 8000d58: \----------> e8bd 4010 ldmia.w sp!, {r4, lr} stall_transaction(usbd_dev); 8000d5c: f7ff bb8c b.w 8000478 <stall_transaction> 08000d60 : { 8000d60: b538 push {r3, r4, r5, lr} usbd_dev->control_state.ctrl_buf = usbd_dev->ctrl_buf; 8000d62: 6903 ldr r3, [r0, #16] 8000d64: 6583 str r3, [r0, #88] @ 0x58 usbd_dev->control_state.ctrl_len = req->wLength; 8000d66: 798b ldrb r3, [r1, #6] 8000d68: 79ca ldrb r2, [r1, #7] 8000d6a: ea43 2302 orr.w r3, r3, r2, lsl #8 8000d6e: f8a0 305c strh.w r3, [r0, #92] @ 0x5c { 8000d72: 4604 mov r4, r0 8000d74: 460d mov r5, r1 if (usb_control_request_dispatch(usbd_dev, req)) { 8000d76: f7ff fbab bl 80004d0 <usb_control_request_dispatch> 8000d7a: /----------- b300 cbz r0, 8000dbe <usb_control_setup_read+0x5e> if (req->wLength) { 8000d7c: | 88eb ldrh r3, [r5, #6] 8000d7e: | /-------- b1ab cbz r3, 8000dac <usb_control_setup_read+0x4c> needs_zlp(usbd_dev->control_state.ctrl_len, 8000d80: | | f8b4 205c ldrh.w r2, [r4, #92] @ 0x5c usbd_dev->desc->bMaxPacketSize0); 8000d84: | | 6821 ldr r1, [r4, #0] if (len < wLength) { 8000d86: | | 4293 cmp r3, r2 usbd_dev->desc->bMaxPacketSize0); 8000d88: | | 79c9 ldrb r1, [r1, #7] if (len < wLength) { 8000d8a: | | /-- d90d bls.n 8000da8 <usb_control_setup_read+0x48> if (len && (len % ep_size == 0)) { 8000d8c: | | /--|-- b132 cbz r2, 8000d9c <usb_control_setup_read+0x3c> 8000d8e: | | | | fbb2 f3f1 udiv r3, r2, r1 8000d92: | | | | fb01 2213 mls r2, r1, r3, r2 8000d96: | | | | fab2 f282 clz r2, r2 8000d9a: | | | | 0952 lsrs r2, r2, #5 usbd_dev->control_state.needs_zlp = 8000d9c: | | >--|-> f884 2064 strb.w r2, [r4, #100] @ 0x64 usb_control_send_chunk(usbd_dev); 8000da0: | | | | 4620 mov r0, r4 } 8000da2: | | | | e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} usb_control_send_chunk(usbd_dev); 8000da6: | | | | e785 b.n 8000cb4 <usb_control_send_chunk> return false; 8000da8: | | | \-> 2200 movs r2, #0 8000daa: | | \----- e7f7 b.n 8000d9c <usb_control_setup_read+0x3c> usbd_ep_write_packet(usbd_dev, 0, NULL, 0); 8000dac: | \-------> 461a mov r2, r3 8000dae: | 4619 mov r1, r3 8000db0: | 4620 mov r0, r4 8000db2: | f009 fdad bl 800a910 <usbd_ep_write_packet.isra.0> usbd_dev->control_state.state = STATUS_IN; 8000db6: | 2304 movs r3, #4 8000db8: | f884 304c strb.w r3, [r4, #76] @ 0x4c } 8000dbc: | bd38 pop {r3, r4, r5, pc} stall_transaction(usbd_dev); 8000dbe: \----------> 4620 mov r0, r4 } 8000dc0: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} stall_transaction(usbd_dev); 8000dc4: f7ff bb58 b.w 8000478 <stall_transaction> 08000dc8 <_usbd_control_setup>: { 8000dc8: b570 push {r4, r5, r6, lr} struct usb_setup_data *req = &usbd_dev->control_state.req; 8000dca: f100 0650 add.w r6, r0, #80 @ 0x50 usbd_dev->control_state.complete = NULL; 8000dce: 2500 movs r5, #0 8000dd0: 6605 str r5, [r0, #96] @ 0x60 if (usbd_ep_read_packet(usbd_dev, 0, req, 8) != 8) { 8000dd2: 2308 movs r3, #8 8000dd4: 4632 mov r2, r6 8000dd6: 4629 mov r1, r5 { 8000dd8: 4604 mov r4, r0 if (usbd_ep_read_packet(usbd_dev, 0, req, 8) != 8) { 8000dda: f7ff fa31 bl 8000240 <usbd_ep_read_packet> 8000dde: 2808 cmp r0, #8 8000de0: /-- d004 beq.n 8000dec <_usbd_control_setup+0x24> stall_transaction(usbd_dev); 8000de2: /-----|-> 4620 mov r0, r4 } 8000de4: | | e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} stall_transaction(usbd_dev); 8000de8: | | f7ff bb46 b.w 8000478 <stall_transaction> if (req->wLength == 0) { 8000dec: | \-> f8b4 3056 ldrh.w r3, [r4, #86] @ 0x56 8000df0: | /-- b923 cbnz r3, 8000dfc <_usbd_control_setup+0x34> usb_control_setup_read(usbd_dev, req); 8000df2: | /--|-> 4631 mov r1, r6 8000df4: | | | 4620 mov r0, r4 } 8000df6: | | | e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} usb_control_setup_read(usbd_dev, req); 8000dfa: | | | e7b1 b.n 8000d60 <usb_control_setup_read> } else if (req->bmRequestType & 0x80) { 8000dfc: | | \-> f994 2050 ldrsb.w r2, [r4, #80] @ 0x50 8000e00: | | 2a00 cmp r2, #0 8000e02: | \----- dbf6 blt.n 8000df2 <_usbd_control_setup+0x2a> if (req->wLength > usbd_dev->ctrl_buf_len) { 8000e04: | 8aa2 ldrh r2, [r4, #20] 8000e06: | 429a cmp r2, r3 8000e08: \-------- d3eb bcc.n 8000de2 <_usbd_control_setup+0x1a> usbd_dev->control_state.ctrl_buf = usbd_dev->ctrl_buf; 8000e0a: 6922 ldr r2, [r4, #16] 8000e0c: 65a2 str r2, [r4, #88] @ 0x58 if (req->wLength > usbd_dev->desc->bMaxPacketSize0) { 8000e0e: 6822 ldr r2, [r4, #0] usbd_dev->control_state.ctrl_len = 0; 8000e10: f8a4 505c strh.w r5, [r4, #92] @ 0x5c if (req->wLength > usbd_dev->desc->bMaxPacketSize0) { 8000e14: 79d2 ldrb r2, [r2, #7] 8000e16: 429a cmp r2, r3 usbd_dev->control_state.state = DATA_OUT; 8000e18: bf34 ite cc 8000e1a: 2305 movcc r3, #5 usbd_dev->control_state.state = LAST_DATA_OUT; 8000e1c: 2306 movcs r3, #6 8000e1e: f884 304c strb.w r3, [r4, #76] @ 0x4c } 8000e22: bd70 pop {r4, r5, r6, pc} 08000e24 <_usbd_control_out>: { 8000e24: b510 push {r4, lr} switch (usbd_dev->control_state.state) { 8000e26: f890 304c ldrb.w r3, [r0, #76] @ 0x4c 8000e2a: 2b06 cmp r3, #6 { 8000e2c: 4604 mov r4, r0 switch (usbd_dev->control_state.state) { 8000e2e: /-- d014 beq.n 8000e5a <_usbd_control_out+0x36> 8000e30: | 2b07 cmp r3, #7 8000e32: /--------|-- d029 beq.n 8000e88 <_usbd_control_out+0x64> 8000e34: | | 2b05 cmp r3, #5 8000e36: | /-----|-- d123 bne.n 8000e80 <_usbd_control_out+0x5c> if (usb_control_recv_chunk(usbd_dev) < 0) { 8000e38: | | | f7ff fb28 bl 800048c <usb_control_recv_chunk> 8000e3c: | | | 2800 cmp r0, #0 8000e3e: /--|--|-----|-- db0b blt.n 8000e58 <_usbd_control_out+0x34> usbd_dev->control_state.ctrl_len) <= 8000e40: | | | | f8b4 205c ldrh.w r2, [r4, #92] @ 0x5c if ((usbd_dev->control_state.req.wLength - 8000e44: | | | | f8b4 3056 ldrh.w r3, [r4, #86] @ 0x56 8000e48: | | | | 1a9b subs r3, r3, r2 usbd_dev->desc->bMaxPacketSize0) { 8000e4a: | | | | 6822 ldr r2, [r4, #0] 8000e4c: | | | | 79d2 ldrb r2, [r2, #7] if ((usbd_dev->control_state.req.wLength - 8000e4e: | | | | 4293 cmp r3, r2 8000e50: +--|--|-----|-- dc02 bgt.n 8000e58 <_usbd_control_out+0x34> usbd_dev->control_state.state = LAST_DATA_OUT; 8000e52: | | | | 2306 movs r3, #6 usbd_dev->control_state.state = STATUS_IN; 8000e54: | | | /--|-> f884 304c strb.w r3, [r4, #76] @ 0x4c } 8000e58: >--|--|--|--|-> bd10 pop {r4, pc} if (usb_control_recv_chunk(usbd_dev) < 0) { 8000e5a: | | | | \-> f7ff fb17 bl 800048c <usb_control_recv_chunk> 8000e5e: | | | | 2800 cmp r0, #0 8000e60: +--|--|--|----- dbfa blt.n 8000e58 <_usbd_control_out+0x34> if (usb_control_request_dispatch(usbd_dev, 8000e62: | | | | f104 0150 add.w r1, r4, #80 @ 0x50 8000e66: | | | | 4620 mov r0, r4 8000e68: | | | | f7ff fb32 bl 80004d0 <usb_control_request_dispatch> 8000e6c: | | | | /-- b138 cbz r0, 8000e7e <_usbd_control_out+0x5a> usbd_ep_write_packet(usbd_dev, 0, NULL, 0); 8000e6e: | | | | | 2300 movs r3, #0 8000e70: | | | | | 461a mov r2, r3 8000e72: | | | | | 4619 mov r1, r3 8000e74: | | | | | 4620 mov r0, r4 8000e76: | | | | | f009 fd4b bl 800a910 <usbd_ep_write_packet.isra.0> usbd_dev->control_state.state = STATUS_IN; 8000e7a: | | | | | 2304 movs r3, #4 8000e7c: | | | \--|-- e7ea b.n 8000e54 <_usbd_control_out+0x30> stall_transaction(usbd_dev); 8000e7e: | | | \-> 4620 mov r0, r4 } 8000e80: | | \-------> e8bd 4010 ldmia.w sp!, {r4, lr} stall_transaction(usbd_dev); 8000e84: | | f7ff baf8 b.w 8000478 <stall_transaction> usbd_ep_read_packet(usbd_dev, 0, NULL, 0); 8000e88: | \----------> 2300 movs r3, #0 8000e8a: | 461a mov r2, r3 8000e8c: | 4619 mov r1, r3 8000e8e: | f7ff f9d7 bl 8000240 <usbd_ep_read_packet> usbd_dev->control_state.state = IDLE; 8000e92: | 2300 movs r3, #0 8000e94: | f884 304c strb.w r3, [r4, #76] @ 0x4c if (usbd_dev->control_state.complete) { 8000e98: | 6e23 ldr r3, [r4, #96] @ 0x60 8000e9a: | /-- b11b cbz r3, 8000ea4 <_usbd_control_out+0x80> usbd_dev->control_state.complete(usbd_dev, 8000e9c: | | f104 0150 add.w r1, r4, #80 @ 0x50 8000ea0: | | 4620 mov r0, r4 8000ea2: | | 4798 blx r3 usbd_dev->control_state.complete = NULL; 8000ea4: | \-> 2300 movs r3, #0 8000ea6: | 6623 str r3, [r4, #96] @ 0x60 break; 8000ea8: \-------------- e7d6 b.n 8000e58 <_usbd_control_out+0x34> 08000eaa : usbd_register_set_config_callback(usbdev, usbd_set_config); bgrt_vint_init(&usbd_vint, 1, (bgrt_code_t)usbd_intr, usbdev); nvic_enable_irq(__usb_irq); } BGRT_ISR(__usb_isr) 8000eaa: b508 push {r3, lr} bgrt_st_t bgrt_vint_push_isr(bgrt_vint_t * vint, bgrt_vic_t * vic) { BGRT_ASSERT(vint, "The #vint must not be NULL!"); BGRT_ASSERT(vic, "The #vic must not be NULL!"); if (((bgrt_pitem_t *)vint)->list) 8000eac: 480b ldr r0, [pc, #44] @ (8000edc ) * @param[in] irqn Unsigned int8. Interrupt number @ref CM3_nvic_defines_irqs */ void nvic_disable_irq(uint8_t irqn) { NVIC_ICER(irqn / 32) = (1 << (irqn % 32)); 8000eae: f04f 23e0 mov.w r3, #3758153728 @ 0xe000e000 8000eb2: 2208 movs r2, #8 8000eb4: f8c3 2188 str.w r2, [r3, #392] @ 0x188 8000eb8: f8d0 3140 ldr.w r3, [r0, #320] @ 0x140 8000ebc: /-- b92b cbnz r3, 8000eca <otg_fs_isr+0x20> { return BGRT_ST_EAGAIN; } else { bgrt_pitem_insert((bgrt_pitem_t *)vint, (bgrt_xlist_t *)vic); 8000ebe: | f500 71a8 add.w r1, r0, #336 @ 0x150 8000ec2: | f500 709c add.w r0, r0, #312 @ 0x138 8000ec6: | f007 fa9b bl 8008400 <bgrt_pitem_insert> 8000eca: \-> f04f 22e0 mov.w r2, #3758153728 @ 0xe000e000 8000ece: f8d2 3d04 ldr.w r3, [r2, #3332] @ 0xd04 8000ed2: f043 5380 orr.w r3, r3, #268435456 @ 0x10000000 8000ed6: f8c2 3d04 str.w r3, [r2, #3332] @ 0xd04 8000eda: bd08 pop {r3, pc} 8000edc: 20000060 .word 0x20000060 08000ee0 : { 8000ee0: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} len = MIN(len, usbd_dev->rxbcnt); 8000ee2: f8b0 6120 ldrh.w r6, [r0, #288] @ 0x120 *buf32++ = REBASE(OTG_FIFO(0)); 8000ee6: f8d0 c0fc ldr.w ip, [r0, #252] @ 0xfc len = MIN(len, usbd_dev->rxbcnt); 8000eea: 429e cmp r6, r3 8000eec: bf28 it cs 8000eee: 461e movcs r6, r3 { 8000ef0: 4605 mov r5, r0 8000ef2: 460c mov r4, r1 8000ef4: 4617 mov r7, r2 uint32_t *buf32 = buf; 8000ef6: 4610 mov r0, r2 for (i = len; i >= 4; i -= 4) { 8000ef8: 4633 mov r3, r6 8000efa: /-------> 2b03 cmp r3, #3 *buf32++ = REBASE(OTG_FIFO(0)); 8000efc: | f8dc 102c ldr.w r1, [ip, #44] @ 0x2c for (i = len; i >= 4; i -= 4) { 8000f00: | /----- dc35 bgt.n 8000f6e <dwc_ep_read_packet+0x8e> 8000f02: | | 08b2 lsrs r2, r6, #2 8000f04: | | f06f 0003 mvn.w r0, #3 8000f08: | | fb00 6202 mla r2, r0, r2, r6 if (i) { 8000f0c: | | /-- b182 cbz r2, 8000f30 <dwc_ep_read_packet+0x50> extra = REBASE(OTG_FIFO(0)); 8000f0e: | | | f501 5180 add.w r1, r1, #4096 @ 0x1000 8000f12: | | | 680b ldr r3, [r1, #0] 8000f14: | | | 9301 str r3, [sp, #4] if (usbd_dev->rxbcnt < 4) { 8000f16: | | | f8b5 3120 ldrh.w r3, [r5, #288] @ 0x120 8000f1a: | | | 2b04 cmp r3, #4 8000f1c: | | | bf38 it cc 8000f1e: | | | 2304 movcc r3, #4 8000f20: | | | 4403 add r3, r0 memcpy(buf32, &extra, i); 8000f22: | | | 4030 ands r0, r6 8000f24: | | | f8a5 3120 strh.w r3, [r5, #288] @ 0x120 8000f28: | | | a901 add r1, sp, #4 8000f2a: | | | 4438 add r0, r7 8000f2c: | | | f00a f852 bl 800afd4 <memcpy> if (IS_ISO_OUT(addr)) { 8000f30: | | \-> f8d5 00fc ldr.w r0, [r5, #252] @ 0xfc 8000f34: | | f104 0158 add.w r1, r4, #88 @ 0x58 8000f38: | | 6ac3 ldr r3, [r0, #44] @ 0x2c 8000f3a: | | 0149 lsls r1, r1, #5 8000f3c: | | 58ca ldr r2, [r1, r3] 8000f3e: | | f402 2240 and.w r2, r2, #786432 @ 0xc0000 8000f42: | | f5b2 2f80 cmp.w r2, #262144 @ 0x40000 8000f46: | | /-- d10f bne.n 8000f68 <dwc_ep_read_packet+0x88> REBASE(OTG_DOEPCTL(addr)) &= ~OTG_DOEPCTLX_FRAME_MASK; 8000f48: | | | 58ca ldr r2, [r1, r3] 8000f4a: | | | f022 5240 bic.w r2, r2, #805306368 @ 0x30000000 8000f4e: | | | 50ca str r2, [r1, r3] if (REBASE(OTG_DSTS) & DSTS_FNSOF_ODD_MASK) { 8000f50: | | | 6ac3 ldr r3, [r0, #44] @ 0x2c 8000f52: | | | f8d3 2808 ldr.w r2, [r3, #2056] @ 0x808 8000f56: | | | f412 7f80 tst.w r2, #256 @ 0x100 REBASE(OTG_DOEPCTL(addr)) |= OTG_DOEPCTLX_SEVNFRM; 8000f5a: | | | 58ca ldr r2, [r1, r3] 8000f5c: | | | bf14 ite ne 8000f5e: | | | f042 5280 orrne.w r2, r2, #268435456 @ 0x10000000 REBASE(OTG_DOEPCTL(addr)) |= OTG_DOEPCTLX_SODDFRM; 8000f62: | | | f042 5200 orreq.w r2, r2, #536870912 @ 0x20000000 8000f66: | | | 50ca str r2, [r1, r3] } 8000f68: | | \-> 4630 mov r0, r6 8000f6a: | | b003 add sp, #12 8000f6c: | | bdf0 pop {r4, r5, r6, r7, pc} *buf32++ = REBASE(OTG_FIFO(0)); 8000f6e: | \----> f501 5180 add.w r1, r1, #4096 @ 0x1000 for (i = len; i >= 4; i -= 4) { 8000f72: | 3b04 subs r3, #4 *buf32++ = REBASE(OTG_FIFO(0)); 8000f74: | 680a ldr r2, [r1, #0] 8000f76: | f840 2b04 str.w r2, [r0], #4 usbd_dev->rxbcnt -= 4; 8000f7a: | f8b5 2120 ldrh.w r2, [r5, #288] @ 0x120 8000f7e: | 3a04 subs r2, #4 8000f80: | f8a5 2120 strh.w r2, [r5, #288] @ 0x120 for (i = len; i >= 4; i -= 4) { 8000f84: \-------- e7b9 b.n 8000efa <dwc_ep_read_packet+0x1a> 08000f86 <_WriteNoCheck>: * NumBytes Number of bytes to be stored in the SEGGER RTT control block. * * Notes * (1) If there might not be enough space in the "Up"-buffer, call _WriteBlocking */ static void _WriteNoCheck(SEGGER_RTT_BUFFER_UP* pRing, const char* pData, unsigned NumBytes) { 8000f86: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} unsigned WrOff; unsigned Rem; volatile char* pDst; WrOff = pRing->WrOff; Rem = pRing->SizeOfBuffer - WrOff; 8000f8a: e9d0 8402 ldrd r8, r4, [r0, #8] static void _WriteNoCheck(SEGGER_RTT_BUFFER_UP* pRing, const char* pData, unsigned NumBytes) { 8000f8e: 4605 mov r5, r0 Rem = pRing->SizeOfBuffer - WrOff; 8000f90: eba8 0604 sub.w r6, r8, r4 if (Rem > NumBytes) { // // All data fits before wrap around // pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; 8000f94: 6840 ldr r0, [r0, #4] if (Rem > NumBytes) { 8000f96: 4296 cmp r6, r2 pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; 8000f98: 4420 add r0, r4 static void _WriteNoCheck(SEGGER_RTT_BUFFER_UP* pRing, const char* pData, unsigned NumBytes) { 8000f9a: 460f mov r7, r1 RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses pRing->WrOff = WrOff; #else SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytes); RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses pRing->WrOff = WrOff + NumBytes; 8000f9c: 4414 add r4, r2 if (Rem > NumBytes) { 8000f9e: /-- d904 bls.n 8000faa <_WriteNoCheck+0x24> NumBytesAtOnce = Rem; pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytesAtOnce); NumBytesAtOnce = NumBytes - Rem; pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; SEGGER_RTT_MEMCPY((void*)pDst, pData + Rem, NumBytesAtOnce); 8000fa0: /--|-> f00a f818 bl 800afd4 <memcpy> pRing->WrOff = WrOff + NumBytes; 8000fa4: | | 60ec str r4, [r5, #12] RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses pRing->WrOff = NumBytesAtOnce; #endif } } 8000fa6: | | e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytesAtOnce); 8000faa: | \-> 4632 mov r2, r6 NumBytesAtOnce = NumBytes - Rem; 8000fac: | eba4 0408 sub.w r4, r4, r8 SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytesAtOnce); 8000fb0: | f00a f810 bl 800afd4 <memcpy> SEGGER_RTT_MEMCPY((void*)pDst, pData + Rem, NumBytesAtOnce); 8000fb4: | 6868 ldr r0, [r5, #4] 8000fb6: | 4622 mov r2, r4 8000fb8: | 19b9 adds r1, r7, r6 8000fba: \----- e7f1 b.n 8000fa0 <_WriteNoCheck+0x1a> 08000fbc <_out_char>: // internal _putchar wrapper static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen) { 8000fbc: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr} (void)buffer; (void)idx; (void)maxlen; if (character) { 8000fc0: /----- b1b0 cbz r0, 8000ff0 <_out_char+0x34> * (1) Data is stored according to buffer flags. */ unsigned SEGGER_RTT_Write(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { unsigned Status; INIT(); 8000fc2: | 4c4a ldr r4, [pc, #296] @ (80010ec <_out_char+0x130>) } #elif defined(RTT) extern unsigned SEGGER_RTT_Write(unsigned, const void *, unsigned); void _putchar(char c) { char cc = c; 8000fc4: | f88d 0007 strb.w r0, [sp, #7] 8000fc8: | f894 2300 ldrb.w r2, [r4, #768] @ 0x300 8000fcc: | f002 03ff and.w r3, r2, #255 @ 0xff 8000fd0: | /-- b18a cbz r2, 8000ff6 <_out_char+0x3a> SEGGER_RTT_LOCK(); 8000fd2: /-----|--|-> f3ef 8811 mrs r8, BASEPRI 8000fd6: | | | f04f 0120 mov.w r1, #32 8000fda: | | | f381 8811 msr BASEPRI, r1 switch (pRing->Flags) { 8000fde: | | | f8d4 332c ldr.w r3, [r4, #812] @ 0x32c 8000fe2: | | | 2b01 cmp r3, #1 8000fe4: /--|-----|--|-- d04a beq.n 800107c <_out_char+0xc0> 8000fe6: | | | | 2b02 cmp r3, #2 8000fe8: /--|--|-----|--|-- d057 beq.n 800109a <_out_char+0xde> 8000fea: | | | /--|--|-- b39b cbz r3, 8001054 <_out_char+0x98> Status = SEGGER_RTT_WriteNoLock(BufferIndex, pBuffer, NumBytes); // Call the non-locking write function SEGGER_RTT_UNLOCK(); 8000fec: /--|--|--|--|--|--|-> f388 8811 msr BASEPRI, r8 _putchar(character); } } 8000ff0: | | | | | \--|-> b003 add sp, #12 8000ff2: | | | | | | e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} p->MaxNumUpBuffers = SEGGER_RTT_MAX_NUM_UP_BUFFERS; 8000ff6: | | | | | \-> 2203 movs r2, #3 8000ff8: | | | | | f8c4 2310 str.w r2, [r4, #784] @ 0x310 p->aUp[0].pBuffer = _acUpBuffer; 8000ffc: | | | | | f504 716a add.w r1, r4, #936 @ 0x3a8 p->MaxNumDownBuffers = SEGGER_RTT_MAX_NUM_DOWN_BUFFERS; 8001000: | | | | | f8c4 2314 str.w r2, [r4, #788] @ 0x314 p->aUp[0].sName = "Terminal"; 8001004: | | | | | 4a3a ldr r2, [pc, #232] @ (80010f0 <_out_char+0x134>) 8001006: | | | | | f8c4 2318 str.w r2, [r4, #792] @ 0x318 p->aUp[0].pBuffer = _acUpBuffer; 800100a: | | | | | f8c4 131c str.w r1, [r4, #796] @ 0x31c p->aUp[0].SizeOfBuffer = BUFFER_SIZE_UP; 800100e: | | | | | f44f 6180 mov.w r1, #1024 @ 0x400 8001012: | | | | | f8c4 1320 str.w r1, [r4, #800] @ 0x320 p->aUp[0].RdOff = 0u; 8001016: | | | | | f8c4 3328 str.w r3, [r4, #808] @ 0x328 p->aUp[0].WrOff = 0u; 800101a: | | | | | f8c4 3324 str.w r3, [r4, #804] @ 0x324 p->aUp[0].Flags = SEGGER_RTT_MODE_DEFAULT; 800101e: | | | | | f8c4 332c str.w r3, [r4, #812] @ 0x32c p->aDown[0].sName = "Terminal"; 8001022: | | | | | f8c4 2360 str.w r2, [r4, #864] @ 0x360 p->aDown[0].pBuffer = _acDownBuffer; 8001026: | | | | | f504 62f5 add.w r2, r4, #1960 @ 0x7a8 800102a: | | | | | f8c4 2364 str.w r2, [r4, #868] @ 0x364 p->aDown[0].SizeOfBuffer = BUFFER_SIZE_DOWN; 800102e: | | | | | 2210 movs r2, #16 8001030: | | | | | f8c4 2368 str.w r2, [r4, #872] @ 0x368 p->aDown[0].RdOff = 0u; 8001034: | | | | | 4a2f ldr r2, [pc, #188] @ (80010f4 <_out_char+0x138>) 8001036: | | | | | f8c4 3370 str.w r3, [r4, #880] @ 0x370 p->aDown[0].WrOff = 0u; 800103a: | | | | | f8c4 336c str.w r3, [r4, #876] @ 0x36c p->aDown[0].Flags = SEGGER_RTT_MODE_DEFAULT; 800103e: | | | | | f8c4 3374 str.w r3, [r4, #884] @ 0x374 p->acID[i] = _aInitStr[sizeof(_aInitStr) - 2 - i]; // Skip terminating \0 at the end of the array 8001042: | | | | | /-> 18e1 adds r1, r4, r3 for (i = 0; i < sizeof(_aInitStr) - 1; ++i) { 8001044: | | | | | | 3301 adds r3, #1 p->acID[i] = _aInitStr[sizeof(_aInitStr) - 2 - i]; // Skip terminating \0 at the end of the array 8001046: | | | | | | f812 0d01 ldrb.w r0, [r2, #-1]! 800104a: | | | | | | f881 0300 strb.w r0, [r1, #768] @ 0x300 for (i = 0; i < sizeof(_aInitStr) - 1; ++i) { 800104e: | | | | | | 2b10 cmp r3, #16 8001050: | | | | | \-- d1f7 bne.n 8001042 <_out_char+0x86> 8001052: | | | \--|-------- e7be b.n 8000fd2 <_out_char+0x16> RdOff = pRing->RdOff; 8001054: | | | \-------> f8d4 3328 ldr.w r3, [r4, #808] @ 0x328 WrOff = pRing->WrOff; 8001058: | | | f8d4 2324 ldr.w r2, [r4, #804] @ 0x324 if (RdOff <= WrOff) { 800105c: | | | 4293 cmp r3, r2 r = pRing->SizeOfBuffer - 1u - WrOff + RdOff; 800105e: | | | bf9c itt ls 8001060: | | | f8d4 1320 ldrls.w r1, [r4, #800] @ 0x320 8001064: | | | 185b addls r3, r3, r1 r = RdOff - WrOff - 1u; 8001066: | | | 3b01 subs r3, #1 8001068: | | | 1a9a subs r2, r3, r2 if (Avail < NumBytes) { 800106a: | | | 2a00 cmp r2, #0 800106c: +--|--|-------------- d0be beq.n 8000fec <_out_char+0x30> _WriteNoCheck(pRing, pData, NumBytes); 800106e: | | | 2201 movs r2, #1 _WriteNoCheck(pRing, pData, Status); 8001070: | | | /-> 4821 ldr r0, [pc, #132] @ (80010f8 <_out_char+0x13c>) 8001072: | | | | f10d 0107 add.w r1, sp, #7 8001076: | | | | f7ff ff86 bl 8000f86 <_WriteNoCheck> break; 800107a: +--|--|-----------|-- e7b7 b.n 8000fec <_out_char+0x30> RdOff = pRing->RdOff; 800107c: | | \-----------|-> f8d4 3328 ldr.w r3, [r4, #808] @ 0x328 WrOff = pRing->WrOff; 8001080: | | | f8d4 2324 ldr.w r2, [r4, #804] @ 0x324 if (RdOff <= WrOff) { 8001084: | | | 4293 cmp r3, r2 r = pRing->SizeOfBuffer - 1u - WrOff + RdOff; 8001086: | | | bf9c itt ls 8001088: | | | f8d4 1320 ldrls.w r1, [r4, #800] @ 0x320 800108c: | | | 185b addls r3, r3, r1 r = RdOff - WrOff - 1u; 800108e: | | | 3b01 subs r3, #1 8001090: | | | 1a9a subs r2, r3, r2 _WriteNoCheck(pRing, pData, Status); 8001092: | | | 2a01 cmp r2, #1 8001094: | | | bf28 it cs 8001096: | | | 2201 movcs r2, #1 8001098: | | \-- e7ea b.n 8001070 <_out_char+0xb4> WrOff = pRing->WrOff; 800109a: | \----------------> f8d4 6324 ldr.w r6, [r4, #804] @ 0x324 800109e: | 2701 movs r7, #1 80010a0: | f10d 0907 add.w r9, sp, #7 RdOff = pRing->RdOff; // May be changed by host (debug probe) in the meantime 80010a4: | /-> f8d4 3328 ldr.w r3, [r4, #808] @ 0x328 NumBytesToWrite = pRing->SizeOfBuffer - (WrOff - RdOff + 1u); 80010a8: | | f8d4 5320 ldr.w r5, [r4, #800] @ 0x320 pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; 80010ac: | | f8d4 031c ldr.w r0, [r4, #796] @ 0x31c if (RdOff > WrOff) { 80010b0: | | 42b3 cmp r3, r6 NumBytesToWrite = pRing->SizeOfBuffer - (WrOff - RdOff + 1u); 80010b2: | | bf98 it ls 80010b4: | | 195b addls r3, r3, r5 NumBytesToWrite = MIN(NumBytesToWrite, (pRing->SizeOfBuffer - WrOff)); // Number of bytes that can be written until buffer wrap-around 80010b6: | | 1bad subs r5, r5, r6 NumBytesToWrite = MIN(NumBytesToWrite, NumBytes); 80010b8: | | 42bd cmp r5, r7 NumBytesToWrite = pRing->SizeOfBuffer - (WrOff - RdOff + 1u); 80010ba: | | f103 33ff add.w r3, r3, #4294967295 @ 0xffffffff NumBytesToWrite = MIN(NumBytesToWrite, NumBytes); 80010be: | | bf28 it cs 80010c0: | | 463d movcs r5, r7 NumBytesToWrite = pRing->SizeOfBuffer - (WrOff - RdOff + 1u); 80010c2: | | 1b9b subs r3, r3, r6 NumBytesToWrite = MIN(NumBytesToWrite, NumBytes); 80010c4: | | 429d cmp r5, r3 80010c6: | | bf28 it cs 80010c8: | | 461d movcs r5, r3 SEGGER_RTT_MEMCPY((void*)pDst, pBuffer, NumBytesToWrite); 80010ca: | | 4649 mov r1, r9 80010cc: | | 4430 add r0, r6 80010ce: | | 462a mov r2, r5 80010d0: | | f009 ff80 bl 800afd4 <memcpy> if (WrOff == pRing->SizeOfBuffer) { 80010d4: | | f8d4 3320 ldr.w r3, [r4, #800] @ 0x320 WrOff += NumBytesToWrite; 80010d8: | | 442e add r6, r5 WrOff = 0u; 80010da: | | 429e cmp r6, r3 80010dc: | | bf08 it eq 80010de: | | 2600 moveq r6, #0 } while (NumBytes); 80010e0: | | 1b7f subs r7, r7, r5 pBuffer += NumBytesToWrite; 80010e2: | | 44a9 add r9, r5 pRing->WrOff = WrOff; 80010e4: | | f8c4 6324 str.w r6, [r4, #804] @ 0x324 } while (NumBytes); 80010e8: | \-- d1dc bne.n 80010a4 <_out_char+0xe8> 80010ea: \-------------------- e77f b.n 8000fec <_out_char+0x30> 80010ec: 20000060 .word 0x20000060 80010f0: 0800b218 .word 0x0800b218 80010f4: 0800d274 .word 0x0800d274 80010f8: 20000378 .word 0x20000378 080010fc : { 80010fc: b5f8 push {r3, r4, r5, r6, r7, lr} 80010fe: 4617 mov r7, r2 descr_idx = usb_descriptor_index(req->wValue); 8001100: 884a ldrh r2, [r1, #2] { 8001102: 461c mov r4, r3 8001104: b2d3 uxtb r3, r2 return wValue >> 8; 8001106: 0a12 lsrs r2, r2, #8 switch (usb_descriptor_type(req->wValue)) { 8001108: 2a02 cmp r2, #2 { 800110a: 4606 mov r6, r0 switch (usb_descriptor_type(req->wValue)) { 800110c: /----- d00d beq.n 800112a <usb_standard_get_descriptor+0x2e> 800110e: | 2a03 cmp r2, #3 8001110: /--|----- d011 beq.n 8001136 <usb_standard_get_descriptor+0x3a> 8001112: | | 2a01 cmp r2, #1 8001114: /--------|--|----- d163 bne.n 80011de <usb_standard_get_descriptor+0xe2> *buf = (uint8_t *) usbd_dev->desc; 8001116: | | | 6803 ldr r3, [r0, #0] 8001118: | | | 603b str r3, [r7, #0] *len = MIN(*len, usbd_dev->desc->bLength); 800111a: | | | 781b ldrb r3, [r3, #0] *len = MIN(*len, usbd_dev->config[descr_idx]->wTotalLength); 800111c: | | | /-> 8822 ldrh r2, [r4, #0] 800111e: | | | | 4293 cmp r3, r2 8001120: | | | | bf28 it cs 8001122: | | | | 4613 movcs r3, r2 8001124: | | | | 8023 strh r3, [r4, #0] return USBD_REQ_HANDLED; 8001126: | /--|--|--|-> 2001 movs r0, #1 } 8001128: | /--|--|--|--|-> bdf8 pop {r3, r4, r5, r6, r7, pc} *buf =(uint8_t *) usbd_dev->config[descr_idx]; 800112a: | | | | \--|-> 6842 ldr r2, [r0, #4] 800112c: | | | | | f852 3023 ldr.w r3, [r2, r3, lsl #2] 8001130: | | | | | 603b str r3, [r7, #0] *len = MIN(*len, usbd_dev->config[descr_idx]->wTotalLength); 8001132: | | | | | 885b ldrh r3, [r3, #2] 8001134: | | | | \-- e7f2 b.n 800111c <usb_standard_get_descriptor+0x20> sd = (struct usb_string_descriptor *)usbd_dev->ctrl_buf; 8001136: | | | \-------> 6905 ldr r5, [r0, #16] if (descr_idx == 0) { 8001138: | | | /-- b96b cbnz r3, 8001156 <usb_standard_get_descriptor+0x5a> sd->wData[0] = USB_LANGID_ENGLISH_US; 800113a: | | | | 2309 movs r3, #9 800113c: | | | | 70ab strb r3, [r5, #2] 800113e: | | | | 2304 movs r3, #4 8001140: | | | | 70eb strb r3, [r5, #3] sd->bLength = sizeof(sd->bLength) + 8001142: | | | | 702b strb r3, [r5, #0] *len = MIN(*len, sd->bLength); 8001144: | | | | 8823 ldrh r3, [r4, #0] 8001146: | | | | 2b04 cmp r3, #4 8001148: | | | | bf28 it cs 800114a: | | | | 2304 movcs r3, #4 800114c: | | | | 8023 strh r3, [r4, #0] sd->bDescriptorType = USB_DT_STRING; 800114e: | | | /-----|-> 2303 movs r3, #3 8001150: | | | | | 706b strb r3, [r5, #1] *buf = (uint8_t *)sd; 8001152: | | | | | 603d str r5, [r7, #0] return USBD_REQ_HANDLED; 8001154: | | \--|-----|-- e7e7 b.n 8001126 <usb_standard_get_descriptor+0x2a> } else if (descr_idx == usbd_dev->extra_string_idx) { 8001156: | | | \-> f8d0 2100 ldr.w r2, [r0, #256] @ 0x100 800115a: | | | 429a cmp r2, r3 800115c: | | | /----- d119 bne.n 8001192 <usb_standard_get_descriptor+0x96> sd->bLength = strlen(usbd_dev->extra_string) * 2 + 800115e: | | | | f8d0 6104 ldr.w r6, [r0, #260] @ 0x104 8001162: | | | | 4630 mov r0, r6 8001164: | | | | f009 ffec bl 800b140 <strlen> sizeof(sd->bLength) + 8001168: | | | | 3001 adds r0, #1 sd->bLength = strlen(usbd_dev->extra_string) * 2 + 800116a: | | | | 0040 lsls r0, r0, #1 800116c: | | | | b2c0 uxtb r0, r0 800116e: | | | | 7028 strb r0, [r5, #0] *len = MIN(*len, sd->bLength); 8001170: | | | | 8823 ldrh r3, [r4, #0] 8001172: | | | | 4283 cmp r3, r0 8001174: | | | | bf28 it cs 8001176: | | | | 4603 movcs r3, r0 8001178: | | | | 8023 strh r3, [r4, #0] for (i = 0; i < (*len / 2) - 1; i++) { 800117a: | | | | 2300 movs r3, #0 800117c: | | | | /-> 8822 ldrh r2, [r4, #0] 800117e: | | | | | 0852 lsrs r2, r2, #1 8001180: | | | | | 3a01 subs r2, #1 8001182: | | | | | 429a cmp r2, r3 8001184: | | +--|--|-- dde3 ble.n 800114e <usb_standard_get_descriptor+0x52> sd->wData[i] = 8001186: | | | | | eb05 0243 add.w r2, r5, r3, lsl #1 usbd_dev->extra_string[i]; 800118a: | | | | | 5cf1 ldrb r1, [r6, r3] sd->wData[i] = 800118c: | | | | | 8051 strh r1, [r2, #2] for (i = 0; i < (*len / 2) - 1; i++) { 800118e: | | | | | 3301 adds r3, #1 8001190: | | | | \-- e7f4 b.n 800117c <usb_standard_get_descriptor+0x80> if (!usbd_dev->strings) { 8001192: | | | \----> 6880 ldr r0, [r0, #8] array_idx = descr_idx - 1; 8001194: | | | 3b01 subs r3, #1 if (!usbd_dev->strings) { 8001196: | | | 2800 cmp r0, #0 8001198: | +-----|-------- d0c6 beq.n 8001128 <usb_standard_get_descriptor+0x2c> if (array_idx >= usbd_dev->num_strings) { 800119a: | | | 68f2 ldr r2, [r6, #12] 800119c: | | | 429a cmp r2, r3 800119e: +--|-----|-------- dd1e ble.n 80011de <usb_standard_get_descriptor+0xe2> if (req->wIndex != USB_LANGID_ENGLISH_US) { 80011a0: | | | 8889 ldrh r1, [r1, #4] 80011a2: | | | f240 4209 movw r2, #1033 @ 0x409 80011a6: | | | 4291 cmp r1, r2 80011a8: +--|-----|-------- d119 bne.n 80011de <usb_standard_get_descriptor+0xe2> sd->bLength = strlen(usbd_dev->strings[array_idx]) * 2 + 80011aa: | | | f850 6023 ldr.w r6, [r0, r3, lsl #2] 80011ae: | | | 4630 mov r0, r6 80011b0: | | | f009 ffc6 bl 800b140 <strlen> sizeof(sd->bLength) + 80011b4: | | | 3001 adds r0, #1 sd->bLength = strlen(usbd_dev->strings[array_idx]) * 2 + 80011b6: | | | 0040 lsls r0, r0, #1 80011b8: | | | b2c0 uxtb r0, r0 80011ba: | | | 7028 strb r0, [r5, #0] *len = MIN(*len, sd->bLength); 80011bc: | | | 8823 ldrh r3, [r4, #0] 80011be: | | | 4283 cmp r3, r0 80011c0: | | | bf28 it cs 80011c2: | | | 4603 movcs r3, r0 80011c4: | | | 8023 strh r3, [r4, #0] for (i = 0; i < (*len / 2) - 1; i++) { 80011c6: | | | 2300 movs r3, #0 80011c8: | | | /-> 8822 ldrh r2, [r4, #0] 80011ca: | | | | 0852 lsrs r2, r2, #1 80011cc: | | | | 3a01 subs r2, #1 80011ce: | | | | 429a cmp r2, r3 80011d0: | | \-----|-- ddbd ble.n 800114e <usb_standard_get_descriptor+0x52> sd->wData[i] = 80011d2: | | | eb05 0243 add.w r2, r5, r3, lsl #1 usbd_dev->strings[array_idx][i]; 80011d6: | | | 5cf1 ldrb r1, [r6, r3] sd->wData[i] = 80011d8: | | | 8051 strh r1, [r2, #2] for (i = 0; i < (*len / 2) - 1; i++) { 80011da: | | | 3301 adds r3, #1 80011dc: | | \-- e7f4 b.n 80011c8 <usb_standard_get_descriptor+0xcc> return USBD_REQ_NOTSUPP; 80011de: \--|-------------> 2000 movs r0, #0 80011e0: \-------------- e7a2 b.n 8001128 <usb_standard_get_descriptor+0x2c> 080011e2 : { 80011e2: b538 push {r3, r4, r5, lr} for (src = &_data_loadaddr, dest = &_data; 80011e4: 4a1c ldr r2, [pc, #112] @ (8001258 ) 80011e6: 4b1d ldr r3, [pc, #116] @ (800125c ) dest < &_edata; 80011e8: 491d ldr r1, [pc, #116] @ (8001260 ) 80011ea: /----------------------------> 428b cmp r3, r1 80011ec: | /-------------------- d320 bcc.n 8001230 <reset_handler+0x4e> while (dest < &_ebss) { 80011ee: | | 4a1d ldr r2, [pc, #116] @ (8001264 ) *dest++ = 0; 80011f0: | | 2100 movs r1, #0 while (dest < &_ebss) { 80011f2: | /-----|-------------------> 4293 cmp r3, r2 80011f4: | | /--|-------------------- d321 bcc.n 800123a <reset_handler+0x58> SCB_CCR |= SCB_CCR_STKALIGN; 80011f6: | | | | f04f 23e0 mov.w r3, #3758153728 @ 0xe000e000 for (fp = &__preinit_array_start; fp < &__preinit_array_end; fp++) { 80011fa: | | | | 4c1b ldr r4, [pc, #108] @ (8001268 ) SCB_CCR |= SCB_CCR_STKALIGN; 80011fc: | | | | f8d3 2d14 ldr.w r2, [r3, #3348] @ 0xd14 for (fp = &__preinit_array_start; fp < &__preinit_array_end; fp++) { 8001200: | | | | 4d1a ldr r5, [pc, #104] @ (800126c ) SCB_CCR |= SCB_CCR_STKALIGN; 8001202: | | | | f442 7200 orr.w r2, r2, #512 @ 0x200 8001206: | | | | f8c3 2d14 str.w r2, [r3, #3348] @ 0xd14 #include static void pre_main(void) { /* Enable access to Floating-Point coprocessor. */ SCB_CPACR |= SCB_CPACR_FULL * (SCB_CPACR_CP10 | SCB_CPACR_CP11); 800120a: | | | | f8d3 2d88 ldr.w r2, [r3, #3464] @ 0xd88 800120e: | | | | f442 0270 orr.w r2, r2, #15728640 @ 0xf00000 8001212: | | | | f8c3 2d88 str.w r2, [r3, #3464] @ 0xd88 for (fp = &__preinit_array_start; fp < &__preinit_array_end; fp++) { 8001216: | | | | /-------------> 42ac cmp r4, r5 8001218: | | | | | /----- d312 bcc.n 8001240 <reset_handler+0x5e> for (fp = &__init_array_start; fp < &__init_array_end; fp++) { 800121a: | | | | | | 4c15 ldr r4, [pc, #84] @ (8001270 ) 800121c: | | | | | | 4d15 ldr r5, [pc, #84] @ (8001274 ) 800121e: | | | | /--|--------|----> 42ac cmp r4, r5 8001220: | | | | | | /--|----- d312 bcc.n 8001248 <reset_handler+0x66> (void)main(); 8001222: | | | | | | | | f009 fb7d bl 800a920 <main.isra.0> for (fp = &__fini_array_start; fp < &__fini_array_end; fp++) { 8001226: | | | | | | | | 4c14 ldr r4, [pc, #80] @ (8001278 ) 8001228: | | | | | | | | 4d14 ldr r5, [pc, #80] @ (800127c ) 800122a: | | | | | | /--|--|----> 42ac cmp r4, r5 800122c: | | | | | | | | | /-- d310 bcc.n 8001250 <reset_handler+0x6e> } 800122e: | | | | | | | | | | bd38 pop {r3, r4, r5, pc} *dest = *src; 8001230: | | | \--|--|--|--|--|--|-> f852 0b04 ldr.w r0, [r2], #4 8001234: | | | | | | | | | f843 0b04 str.w r0, [r3], #4 src++, dest++) { 8001238: \--|--|-----|--|--|--|--|--|-- e7d7 b.n 80011ea <reset_handler+0x8> *dest++ = 0; 800123a: | \-----|--|--|--|--|--|-> f843 1b04 str.w r1, [r3], #4 800123e: \--------|--|--|--|--|--|-- e7d8 b.n 80011f2 <reset_handler+0x10> (*fp)(); 8001240: | | | | \--|-> f854 3b04 ldr.w r3, [r4], #4 8001244: | | | | | 4798 blx r3 for (fp = &__preinit_array_start; fp < &__preinit_array_end; fp++) { 8001246: | \--|--|-----|-- e7e6 b.n 8001216 <reset_handler+0x34> (*fp)(); 8001248: | | \-----|-> f854 3b04 ldr.w r3, [r4], #4 800124c: | | | 4798 blx r3 for (fp = &__init_array_start; fp < &__init_array_end; fp++) { 800124e: \-----|--------|-- e7e6 b.n 800121e <reset_handler+0x3c> (*fp)(); 8001250: | \-> f854 3b04 ldr.w r3, [r4], #4 8001254: | 4798 blx r3 for (fp = &__fini_array_start; fp < &__fini_array_end; fp++) { 8001256: \----------- e7e8 b.n 800122a <reset_handler+0x48> 8001258: 0800d5ac .word 0x0800d5ac 800125c: 20000000 .word 0x20000000 8001260: 20000060 .word 0x20000060 8001264: 200081d4 .word 0x200081d4 8001268: 0800d5a4 .word 0x0800d5a4 800126c: 0800d5a4 .word 0x0800d5a4 8001270: 0800d5a4 .word 0x0800d5a4 8001274: 0800d5a4 .word 0x0800d5a4 8001278: 0800d5a4 .word 0x0800d5a4 800127c: 0800d5a4 .word 0x0800d5a4 08001280 : #define BGRT_ATM_BSET_ISR(map_ptr, msk) __atomic_fetch_or((map_ptr), (msk), __ATOMIC_SEQ_CST) static inline void bgrt_atm_bset(bgrt_map_t * fic, bgrt_map_t msk) { BGRT_ATM_BSET_ISR(fic,msk); 8001280: f3bf 8f5b dmb ish 8001284: /-> e850 3f00 ldrex r3, [r0] 8001288: | 430b orrs r3, r1 800128a: | e840 3200 strex r2, r3, [r0] 800128e: | 2a00 cmp r2, #0 8001290: \-- d1f8 bne.n 8001284 <bgrt_atm_bset.lto_priv.0.lto_priv.0+0x4> 8001292: f3bf 8f5b dmb ish } 8001296: 4770 bx lr 08001298 : { 8001298: b510 push {r4, lr} st = bgrt_queue_trypost_cb_cs(TXQUEUE, NULL, ecm_tx_q_cb); 800129a: 4c07 ldr r4, [pc, #28] @ (80012b8 ) 800129c: 4907 ldr r1, [pc, #28] @ (80012bc ) 800129e: f8d4 07bc ldr.w r0, [r4, #1980] @ 0x7bc 80012a2: f007 ff97 bl 80091d4 <bgrt_queue_post_cs_fn.constprop.0> if (st == BGRT_ST_ROLL) 80012a6: 2809 cmp r0, #9 80012a8: /-- d105 bne.n 80012b6 <ecm_tx_cb+0x1e> bgrt_atm_bset(&ev, TX_RDY); 80012aa: | f504 60f8 add.w r0, r4, #1984 @ 0x7c0 80012ae: | 2102 movs r1, #2 } 80012b0: | e8bd 4010 ldmia.w sp!, {r4, lr} bgrt_atm_bset(&ev, TX_RDY); 80012b4: | e7e4 b.n 8001280 <bgrt_atm_bset.lto_priv.0.lto_priv.0> } 80012b6: \-> bd10 pop {r4, pc} 80012b8: 20000060 .word 0x20000060 80012bc: 08000c9f .word 0x08000c9f 080012c0 : #define BGRT_ATM_BGET_ISR(map_ptr, msk) (*(map_ptr) & (msk)) static inline bgrt_map_t bgrt_atm_bget(bgrt_map_t * fic, bgrt_map_t msk) { return BGRT_ATM_BGET_ISR(fic,msk); 80012c0: 4b0c ldr r3, [pc, #48] @ (80012f4 ) 80012c2: f8d3 27c0 ldr.w r2, [r3, #1984] @ 0x7c0 80012c6: f002 0203 and.w r2, r2, #3 if (bgrt_atm_bget(&ev, TX_REQ|TX_RDY) == (TX_REQ|TX_RDY)) { 80012ca: 2a03 cmp r2, #3 80012cc: /----- d110 bne.n 80012f0 <ecm_sof_cb+0x30> #define BGRT_ATM_BCLR_ISR(map_ptr, msk) ((msk) & __atomic_fetch_and((map_ptr), ~(msk), __ATOMIC_SEQ_CST)) static inline bgrt_map_t bgrt_atm_bclr(bgrt_map_t * fic, bgrt_map_t msk) { return BGRT_ATM_BCLR_ISR(fic,msk); 80012ce: | f3bf 8f5b dmb ish 80012d2: | f503 62f8 add.w r2, r3, #1984 @ 0x7c0 80012d6: | /-> e852 0f00 ldrex r0, [r2] 80012da: | | f020 0001 bic.w r0, r0, #1 80012de: | | e842 0100 strex r1, r0, [r2] 80012e2: | | 2900 cmp r1, #0 80012e4: | \-- d1f7 bne.n 80012d6 <ecm_sof_cb+0x16> 80012e6: | f3bf 8f5b dmb ish ecm_tx_cb(usbdev, ECM_IN_ENDP_ADDR); 80012ea: | 2182 movs r1, #130 @ 0x82 80012ec: | 6818 ldr r0, [r3, #0] 80012ee: | e7d3 b.n 8001298 <ecm_tx_cb> } 80012f0: \----> 4770 bx lr 80012f2: bf00 nop 80012f4: 20000060 .word 0x20000060 080012f8 : /////////////////////////////////////////////////////////////////////////////// int printf_(const char* format, ...) { 80012f8: b40f push {r0, r1, r2, r3} 80012fa: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 80012fe: b08d sub sp, #52 @ 0x34 8001300: ad16 add r5, sp, #88 @ 0x58 va_list va; va_start(va, format); 8001302: 2400 movs r4, #0 { 8001304: f855 6b04 ldr.w r6, [r5], #4 va_start(va, format); 8001308: 950b str r5, [sp, #44] @ 0x2c while (*format) 800130a: /-------------------------------------------------------> 7830 ldrb r0, [r6, #0] 800130c: | /-- b978 cbnz r0, 800132e <printf_+0x36> out((char)0, buffer, idx < maxlen ? idx : maxlen - 1U, maxlen); 800130e: | | f06f 0201 mvn.w r2, #1 8001312: | | 42a2 cmp r2, r4 8001314: | | f04f 33ff mov.w r3, #4294967295 @ 0xffffffff 8001318: | | bf28 it cs 800131a: | | 4622 movcs r2, r4 800131c: | | a90a add r1, sp, #40 @ 0x28 800131e: | | f7ff fe4d bl 8000fbc <_out_char> char buffer[1]; const int ret = _vsnprintf(_out_char, buffer, (size_t)-1, format, va); va_end(va); return ret; } 8001322: | | 4620 mov r0, r4 8001324: | | b00d add sp, #52 @ 0x34 8001326: | | e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 800132a: | | b004 add sp, #16 800132c: | | 4770 bx lr if (*format != '%') { 800132e: | \-> 2825 cmp r0, #37 @ 0x25 format++; 8001330: | f106 0601 add.w r6, r6, #1 if (*format != '%') { 8001334: | /-- d008 beq.n 8001348 <printf_+0x50> out(*format, buffer, idx++, maxlen); 8001336: | /-----------------------------------|-> 4622 mov r2, r4 8001338: | | | 1c67 adds r7, r4, #1 800133a: | | | f04f 33ff mov.w r3, #4294967295 @ 0xffffffff 800133e: | | | a90a add r1, sp, #40 @ 0x28 8001340: | | | f7ff fe3c bl 8000fbc <_out_char> 8001344: | | | 463c mov r4, r7 break; 8001346: +-----------------|-----------------------------------|-- e7e0 b.n 800130a <printf_+0x12> flags = 0U; 8001348: | | \-> 2200 movs r2, #0 switch (*format) { 800134a: | | /-------> 4631 mov r1, r6 800134c: | | | f811 3b01 ldrb.w r3, [r1], #1 8001350: | | | 2b2b cmp r3, #43 @ 0x2b 8001352: | | /--|-------- d017 beq.n 8001384 <printf_+0x8c> 8001354: | | | | /-- d80b bhi.n 800136e <printf_+0x76> 8001356: | | | | | 2b20 cmp r3, #32 8001358: | | /--|--|-----|-- d017 beq.n 800138a <printf_+0x92> 800135a: | | | | | | 2b23 cmp r3, #35 @ 0x23 800135c: | | /--|--|--|-----|-- d018 beq.n 8001390 <printf_+0x98> if (_is_digit(*format)) { 800135e: | | | | | | /--|-> f1a3 0030 sub.w r0, r3, #48 @ 0x30 8001362: | | | | | | | | 2809 cmp r0, #9 8001364: | | /-----|--|--|--|--|--|-- d834 bhi.n 80013d0 <printf_+0xd8> unsigned int i = 0U; 8001366: | | | | | | | | | 2700 movs r7, #0 i = i * 10U + (unsigned int)(*((*str)++) - '0'); 8001368: | | | | | | | | | f04f 0c0a mov.w ip, #10 800136c: | | | /--|--|--|--|--|--|-- e018 b.n 80013a0 <printf_+0xa8> switch (*format) { 800136e: | | | | | | | | | \-> 2b2d cmp r3, #45 @ 0x2d 8001370: | | | | | | | | | /-- d005 beq.n 800137e <printf_+0x86> 8001372: | | | | | | | | | | 2b30 cmp r3, #48 @ 0x30 8001374: | | | | | | | | \--|-- d1f3 bne.n 800135e <printf_+0x66> case '0': flags |= FLAGS_ZEROPAD; format++; n = 1U; break; 8001376: | | | | | | | | | f042 0201 orr.w r2, r2, #1 flags = 0U; 800137a: | | | | | | | | /--|-> 460e mov r6, r1 800137c: | | | | | | | \--|--|-- e7e5 b.n 800134a <printf_+0x52> case '-': flags |= FLAGS_LEFT; format++; n = 1U; break; 800137e: | | | | | | | | \-> f042 0202 orr.w r2, r2, #2 8001382: | | | | | | | +----- e7fa b.n 800137a <printf_+0x82> case '+': flags |= FLAGS_PLUS; format++; n = 1U; break; 8001384: | | | | | | \-----|----> f042 0204 orr.w r2, r2, #4 8001388: | | | | | | +----- e7f7 b.n 800137a <printf_+0x82> case ' ': flags |= FLAGS_SPACE; format++; n = 1U; break; 800138a: | | | | | \--------|----> f042 0208 orr.w r2, r2, #8 800138e: | | | | | +----- e7f4 b.n 800137a <printf_+0x82> case '#': flags |= FLAGS_HASH; format++; n = 1U; break; 8001390: | | | | \-----------|----> f042 0210 orr.w r2, r2, #16 8001394: | | | | \----- e7f1 b.n 800137a <printf_+0x82> i = i * 10U + (unsigned int)(*((*str)++) - '0'); 8001396: | | | | /-> fb0c 3307 mla r3, ip, r7, r3 800139a: | | | | | f1a3 0730 sub.w r7, r3, #48 @ 0x30 800139e: | | | | | 460e mov r6, r1 while (_is_digit(**str)) { 80013a0: | | | \-----------------|-> 4631 mov r1, r6 80013a2: | | | | f811 3b01 ldrb.w r3, [r1], #1 80013a6: | | | | f1a3 0030 sub.w r0, r3, #48 @ 0x30 80013aa: | | | | 2809 cmp r0, #9 80013ac: | | | \-- d9f3 bls.n 8001396 <printf_+0x9e> if (*format == '.') { 80013ae: | | | /-------> 7833 ldrb r3, [r6, #0] 80013b0: | | | | 2b2e cmp r3, #46 @ 0x2e 80013b2: | | /--------|--------------|-------- d151 bne.n 8001458 <printf_+0x160> if (_is_digit(*format)) { 80013b4: | | | | | 7871 ldrb r1, [r6, #1] 80013b6: | | | | | f1a1 0030 sub.w r0, r1, #48 @ 0x30 80013ba: | | | | | 2809 cmp r0, #9 format++; 80013bc: | | | | | f106 0301 add.w r3, r6, #1 flags |= FLAGS_PRECISION; 80013c0: | | | | | f442 6280 orr.w r2, r2, #1024 @ 0x400 if (_is_digit(*format)) { 80013c4: | | | /--|--------------|-------- d83f bhi.n 8001446 <printf_+0x14e> unsigned int i = 0U; 80013c6: | | | | | | f04f 0800 mov.w r8, #0 i = i * 10U + (unsigned int)(*((*str)++) - '0'); 80013ca: | | | | | | f04f 0c0a mov.w ip, #10 80013ce: | | | | | | /----- e011 b.n 80013f4 <printf_+0xfc> else if (*format == '*') { 80013d0: | | | | \--------------|--|----> 2b2a cmp r3, #42 @ 0x2a 80013d2: | | | | | | /-- d108 bne.n 80013e6 <printf_+0xee> const int w = va_arg(va, int); 80013d4: | | | | | | | f855 7b04 ldr.w r7, [r5], #4 if (w < 0) { 80013d8: | | | | | | | 2f00 cmp r7, #0 flags |= FLAGS_LEFT; // reverse padding 80013da: | | | | | | | bfbc itt lt 80013dc: | | | | | | | f042 0202 orrlt.w r2, r2, #2 width = (unsigned int)-w; 80013e0: | | | | | | | 427f neglt r7, r7 format++; 80013e2: | | | | | | | 460e mov r6, r1 80013e4: | | | | +--|--|-- e7e3 b.n 80013ae <printf_+0xb6> width = 0U; 80013e6: | | | | | | \-> 2700 movs r7, #0 80013e8: | | | | \--|----- e7e1 b.n 80013ae <printf_+0xb6> i = i * 10U + (unsigned int)(*((*str)++) - '0'); 80013ea: | | | | | /-> fb0c 1108 mla r1, ip, r8, r1 80013ee: | | | | | | f1a1 0830 sub.w r8, r1, #48 @ 0x30 80013f2: | | | | | | 4603 mov r3, r0 while (_is_digit(**str)) { 80013f4: | | | | \--|-> 4618 mov r0, r3 80013f6: | | | | | f810 1b01 ldrb.w r1, [r0], #1 80013fa: | | | | | f1a1 0630 sub.w r6, r1, #48 @ 0x30 80013fe: | | | | | 2e09 cmp r6, #9 8001400: | | | | \-- d9f3 bls.n 80013ea <printf_+0xf2> 8001402: | | | | 461e mov r6, r3 switch (*format) { 8001404: | | | | /-------> 4633 mov r3, r6 8001406: | | | | | f813 1b01 ldrb.w r1, [r3], #1 800140a: | | | | | 296c cmp r1, #108 @ 0x6c 800140c: | | | | /--|-------- d02c beq.n 8001468 <printf_+0x170> 800140e: | | | | | | /----- d826 bhi.n 800145e <printf_+0x166> 8001410: | | | | | | | 2968 cmp r1, #104 @ 0x68 8001412: | | | | /--|--|--|----- d030 beq.n 8001476 <printf_+0x17e> 8001414: | | | | | | | | 296a cmp r1, #106 @ 0x6a 8001416: | | | | /--------|--|--|--|----- d038 beq.n 800148a <printf_+0x192> switch (*format) { 8001418: | | | | | /--|--|--|--|----> f816 0b01 ldrb.w r0, [r6], #1 800141c: | | | | | | | | | | 2878 cmp r0, #120 @ 0x78 800141e: | +-----|-----|--|-----|--|--|--|--|----- d88a bhi.n 8001336 <printf_+0x3e> 8001420: | | | | | | | | | | 2863 cmp r0, #99 @ 0x63 8001422: | | | | | /--|--|--|--|--|----- d835 bhi.n 8001490 <printf_+0x198> 8001424: | | | | | | | | | | | 2862 cmp r0, #98 @ 0x62 8001426: | /--------------|-----|-----|--|--|--|--|--|--|--|----- f000 814e beq.w 80016c6 <printf_+0x3ce> 800142a: | | | | | | | | | | | | 2863 cmp r0, #99 @ 0x63 800142c: | | | /--|-----|--|--|--|--|--|--|--|----- f000 8098 beq.w 8001560 <printf_+0x268> 8001430: | | | | | | | | | | | | | 2825 cmp r0, #37 @ 0x25 8001432: | | +--|--|-----|--|--|--|--|--|--|--|----- d080 beq.n 8001336 <printf_+0x3e> 8001434: | | | | | | | | | | | | | 2858 cmp r0, #88 @ 0x58 8001436: | | +--|--|-----|--|--|--|--|--|--|--|----- f47f af7e bne.w 8001336 <printf_+0x3e> flags |= FLAGS_UPPERCASE; 800143a: | | | | | | | | | | | | | f042 0220 orr.w r2, r2, #32 switch (*format) { 800143e: | | | | | /--|--|--|--|--|--|--|--|----> 2110 movs r1, #16 flags &= ~(FLAGS_PLUS | FLAGS_SPACE); 8001440: | | /--------|--|--|--|--|--|--|--|--|--|--|--|----> f022 020c bic.w r2, r2, #12 8001444: | | /--|--------|--|--|--|--|--|--|--|--|--|--|--|----- e14a b.n 80016dc <printf_+0x3e4> else if (*format == '*') { 8001446: | | | | | | | | \--|--|--|--|--|--|--|----> 292a cmp r1, #42 @ 0x2a 8001448: | | | | | | | | | | | | | | | /-- d105 bne.n 8001456 <printf_+0x15e> precision = prec > 0 ? (unsigned int)prec : 0U; 800144a: | | | | | | | | | | | | | | | | f855 3b04 ldr.w r3, [r5], #4 format++; 800144e: | | | | | | | | | | | | | | | | 3602 adds r6, #2 precision = prec > 0 ? (unsigned int)prec : 0U; 8001450: | | | | | | | | | | | | | | | | ea23 78e3 bic.w r8, r3, r3, asr #31 8001454: | | | | | | | | | | | | | +--|--|-- e7d6 b.n 8001404 <printf_+0x10c> format++; 8001456: | | | | | | | | | | | | | | | \-> 461e mov r6, r3 precision = 0U; 8001458: | | | | | | \--|-----|--|--|--|--|--|--|----> f04f 0800 mov.w r8, #0 800145c: | | | | | | | | | | | | \--|----- e7d2 b.n 8001404 <printf_+0x10c> switch (*format) { 800145e: | | | | | | | | | | | | \----> 297a cmp r1, #122 @ 0x7a 8001460: | | | | | | | | | +--|--|----------- d1da bne.n 8001418 <printf_+0x120> flags |= (sizeof(size_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); 8001462: | | | | | | | | | | | | /-> f442 7280 orr.w r2, r2, #256 @ 0x100 8001466: | | | | | | | | | | | | /-----|-- e00b b.n 8001480 <printf_+0x188> if (*format == 'l') { 8001468: | | | | | | | | | | | \--|-----|-> 7871 ldrb r1, [r6, #1] 800146a: | | | | | | | | | | | | | 296c cmp r1, #108 @ 0x6c 800146c: | | | | | | | | | | | | \-- d1f9 bne.n 8001462 <printf_+0x16a> flags |= FLAGS_LONG_LONG; 800146e: | | | | | | | | | | | | f442 7240 orr.w r2, r2, #768 @ 0x300 format++; 8001472: | | | | | | | | | | | | /----> 3602 adds r6, #2 8001474: | | | | | | | | | +--|-----|--|----- e7d0 b.n 8001418 <printf_+0x120> if (*format == 'h') { 8001476: | | | | | | | | | | \-----|--|----> 7871 ldrb r1, [r6, #1] 8001478: | | | | | | | | | | | | 2968 cmp r1, #104 @ 0x68 800147a: | | | | | | | | | | | | /-- d003 beq.n 8001484 <printf_+0x18c> flags |= FLAGS_SHORT; 800147c: | | | | | | | | | | | | | f042 0280 orr.w r2, r2, #128 @ 0x80 format++; 8001480: | | | | | | | | | | >--|--|-> 461e mov r6, r3 break; 8001482: | | | | | | | | | \--------|--|--|-- e7c9 b.n 8001418 <printf_+0x120> flags |= FLAGS_CHAR; 8001484: | | | | | | | | | | | \-> f042 02c0 orr.w r2, r2, #192 @ 0xc0 8001488: | | | | | | | | | | \----- e7f3 b.n 8001472 <printf_+0x17a> flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); 800148a: | | | | | | | \--|-----------|-------> f442 7200 orr.w r2, r2, #512 @ 0x200 800148e: | | | | | | | | \-------- e7f7 b.n 8001480 <printf_+0x188> switch (*format) { 8001490: | | | | | | | \-------------------> f1a0 0364 sub.w r3, r0, #100 @ 0x64 8001494: | | | | | | | 2101 movs r1, #1 8001496: | | | | | | | b2db uxtb r3, r3 8001498: | | | | | | | fa01 f303 lsl.w r3, r1, r3 800149c: | | | | | | | 499a ldr r1, [pc, #616] @ (8001708 ) 800149e: | | | | | | | 400b ands r3, r1 80014a0: | | | | | | | /-- d117 bne.n 80014d2 <printf_+0x1da> 80014a2: | | | | | | | | 2873 cmp r0, #115 @ 0x73 80014a4: | | | | | | | /-----------------|-- f000 80a2 beq.w 80015ec <printf_+0x2f4> 80014a8: | | | | | | | | | 2870 cmp r0, #112 @ 0x70 80014aa: | | | | \--|-----|--------|-----------------|-- f47f af44 bne.w 8001336 <printf_+0x3e> flags |= FLAGS_ZEROPAD | FLAGS_UPPERCASE; 80014ae: | | | | | | | | f042 0221 orr.w r2, r2, #33 @ 0x21 idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned long)((uintptr_t)va_arg(va, void*)), false, 16U, precision, width, flags); 80014b2: | | | | | | | | 9204 str r2, [sp, #16] 80014b4: | | | | | | | | 2208 movs r2, #8 80014b6: | | | | | | | | e9cd 8202 strd r8, r2, [sp, #8] 80014ba: | | | | | | | | 2210 movs r2, #16 80014bc: | | | | | | | | e9cd 3200 strd r3, r2, [sp] 80014c0: | | | | | | | | 4892 ldr r0, [pc, #584] @ (800170c ) 80014c2: | | | | | | | | f855 3b04 ldr.w r3, [r5], #4 80014c6: | | | | | | | | 4622 mov r2, r4 80014c8: | | | | | | | | a90a add r1, sp, #40 @ 0x28 80014ca: | | | | | | | | f007 ffb3 bl 8009434 <_ntoa_long.constprop.0> 80014ce: | | | | | | | | 4604 mov r4, r0 break; 80014d0: +--|--|--|-----------|-----|--------|-----------------|-- e71b b.n 800130a <printf_+0x12> 80014d2: | | | | | | | \-> 286f cmp r0, #111 @ 0x6f 80014d4: | | | | /--|-----|--------|-------------------- f040 80f9 bne.w 80016ca <printf_+0x3d2> switch (*format) { 80014d8: | | | | | | | | 2108 movs r1, #8 80014da: | | | +--------|--|-----|--------|-------------------- e7b1 b.n 8001440 <printf_+0x148> 80014dc: | | | | | | /--|--------|-------------------> 2878 cmp r0, #120 @ 0x78 80014de: | | | | | | | \--------|-------------------- d0ae beq.n 800143e <printf_+0x146> flags &= ~FLAGS_HASH; // no hash for dec format 80014e0: | | | | | | | | f022 0210 bic.w r2, r2, #16 80014e4: | | | | | | | | 210a movs r1, #10 if ((*format != 'i') && (*format != 'd')) { 80014e6: | | | | | | | /--------|-------------------> 2864 cmp r0, #100 @ 0x64 80014e8: | | +--|--------|--|--|--|--------|-------------------- f000 80f8 beq.w 80016dc <printf_+0x3e4> 80014ec: | | | +--------|--|--|--|--------|-------------------- e7a8 b.n 8001440 <printf_+0x148> const int value = (flags & FLAGS_CHAR) ? (char)va_arg(va, int) : (flags & FLAGS_SHORT) ? (short int)va_arg(va, int) : va_arg(va, int); 80014ee: | | | | /--|--|--|--|--------|-------------------> 0650 lsls r0, r2, #25 80014f0: | | | | | | | | | | /-- d512 bpl.n 8001518 <printf_+0x220> 80014f2: | | | | | | | | | | | 782b ldrb r3, [r5, #0] idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned int)(value > 0 ? value : 0 - value), value < 0, base, precision, width, flags); 80014f4: | | | | /--|--|--|--|--|--------|-----------------|-> e9cd 1801 strd r1, r8, [sp, #4] 80014f8: | | | | | | | | | | | | e9cd 7203 strd r7, r2, [sp, #12] 80014fc: | | | | | | | | | | | | 2b00 cmp r3, #0 80014fe: | | | | | | | | | | | | ea4f 72d3 mov.w r2, r3, lsr #31 8001502: | | | | | | | | | | | | 9200 str r2, [sp, #0] 8001504: | | | | | | | | | | | | bfb8 it lt 8001506: | | | | | | | | | | | | 425b neglt r3, r3 idx = _ntoa_long(out, buffer, idx, maxlen, va_arg(va, unsigned long), false, base, precision, width, flags); 8001508: | | | | | | | | | | | /-----|-> 4622 mov r2, r4 800150a: | | | | | | | | | | | | | 4880 ldr r0, [pc, #512] @ (800170c ) 800150c: | | | | | | | | | | | | | a90a add r1, sp, #40 @ 0x28 800150e: | | | | | | | | | | | | | f007 ff91 bl 8009434 <_ntoa_long.constprop.0> 8001512: | | | | | | | | | | | | | 464d mov r5, r9 8001514: | | | | | | | | | | | | | 4604 mov r4, r0 8001516: +--|--|--|--|--|--|--|--|--|--------|-----------|-----|-- e6f8 b.n 800130a <printf_+0x12> const int value = (flags & FLAGS_CHAR) ? (char)va_arg(va, int) : (flags & FLAGS_SHORT) ? (short int)va_arg(va, int) : va_arg(va, int); 8001518: | | | | | | | | | | | | \-> 0613 lsls r3, r2, #24 800151a: | | | | | | | | | | /-----|-----------|-------- f140 80f2 bpl.w 8001702 <printf_+0x40a> 800151e: | | | | | | | | | | | | | f9b5 3000 ldrsh.w r3, [r5] 8001522: | | | | +--|--|--|--|--|--|-----|-----------|-------- e7e7 b.n 80014f4 <printf_+0x1fc> if (flags & FLAGS_LONG_LONG) { 8001524: | | | | | | | | | | | /--|-----------|-------> 2b00 cmp r3, #0 8001526: +--|--|--|--|--|--|--|--|--|--|--|--|-----------|-------- f47f aef0 bne.w 800130a <printf_+0x12> else if (flags & FLAGS_LONG) { 800152a: | | | | | | | | | | | | | | 05d0 lsls r0, r2, #23 idx = _ntoa_long(out, buffer, idx, maxlen, va_arg(va, unsigned long), false, base, precision, width, flags); 800152c: | | | | | | | | | | | | | | f105 0904 add.w r9, r5, #4 else if (flags & FLAGS_LONG) { 8001530: | | | | | | | | | | | | | | /-- d506 bpl.n 8001540 <printf_+0x248> idx = _ntoa_long(out, buffer, idx, maxlen, va_arg(va, unsigned long), false, base, precision, width, flags); 8001532: | | | | | | | | | | | | | | | e9cd 7203 strd r7, r2, [sp, #12] 8001536: | | | | | | | | | | | | | | | e9cd 1801 strd r1, r8, [sp, #4] 800153a: | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 800153c: | | | | | | | | | | | | | | | 682b ldr r3, [r5, #0] 800153e: | | | | | | | | | | | | | +-----|-- e7e3 b.n 8001508 <printf_+0x210> const unsigned int value = (flags & FLAGS_CHAR) ? (unsigned char)va_arg(va, unsigned int) : (flags & FLAGS_SHORT) ? (unsigned short int)va_arg(va, unsigned int) : va_arg(va, unsigned int); 8001540: | | | | | | | | | | | | | | \-> 0653 lsls r3, r2, #25 8001542: | | | | | | | | | | | | | | /-- d507 bpl.n 8001554 <printf_+0x25c> 8001544: | | | | | | | | | | | | | | | 782b ldrb r3, [r5, #0] idx = _ntoa_long(out, buffer, idx, maxlen, value, false, base, precision, width, flags); 8001546: | | | | | | | | | | | | | | /--|-> e9cd 7203 strd r7, r2, [sp, #12] 800154a: | | | | | | | | | | | | | | | | 2200 movs r2, #0 800154c: | | | | | | | | | | | | | | | | e9cd 1801 strd r1, r8, [sp, #4] 8001550: | | | | | | | | | | | | | | | | 9200 str r2, [sp, #0] 8001552: | | | | | | | | | | | | | \--|--|-- e7d9 b.n 8001508 <printf_+0x210> 8001554: | | | | | | | | | | | | | | \-> 682b ldr r3, [r5, #0] const unsigned int value = (flags & FLAGS_CHAR) ? (unsigned char)va_arg(va, unsigned int) : (flags & FLAGS_SHORT) ? (unsigned short int)va_arg(va, unsigned int) : va_arg(va, unsigned int); 8001556: | | | | | | | | | | | | | | f012 0f80 tst.w r2, #128 @ 0x80 800155a: | | | | | | | | | | | | | | bf18 it ne 800155c: | | | | | | | | | | | | | | b29b uxthne r3, r3 800155e: | | | | | | | | | | | | | \----- e7f2 b.n 8001546 <printf_+0x24e> if (!(flags & FLAGS_LEFT)) { 8001560: | | | | | | | \--|--|--|--|--|-------------------> f012 0802 ands.w r8, r2, #2 8001564: | | | | | | | | | | | | /-------------- d02c beq.n 80015c0 <printf_+0x2c8> unsigned int l = 1U; 8001566: | | | | | | | | | | | | | f04f 0901 mov.w r9, #1 out((char)va_arg(va, int), buffer, idx++, maxlen); 800156a: | | | | | | | | | | | | | /----------> f815 0b04 ldrb.w r0, [r5], #4 800156e: | | | | | | | | | | | | | | f04f 33ff mov.w r3, #4294967295 @ 0xffffffff 8001572: | | | | | | | | | | | | | | 4622 mov r2, r4 8001574: | | | | | | | | | | | | | | a90a add r1, sp, #40 @ 0x28 8001576: | | | | | | | | | | | | | | f104 0a01 add.w sl, r4, #1 800157a: | | | | | | | | | | | | | | f7ff fd1f bl 8000fbc <_out_char> if (flags & FLAGS_LEFT) { 800157e: | | | | | | | | | | | | | | f1b8 0f00 cmp.w r8, #0 8001582: | | | | | | | | | | | | /--|--|----------- d031 beq.n 80015e8 <printf_+0x2f0> 8001584: | | | | | | | | | | | | | | | 464c mov r4, r9 out((char)va_arg(va, int), buffer, idx++, maxlen); 8001586: | | | | | | | | | | | | | | | 4652 mov r2, sl 8001588: | | | | | | | | | | | | | | | /-------- e026 b.n 80015d8 <printf_+0x2e0> out(' ', buffer, idx++, maxlen); 800158a: | | | | | | | | | | | | | | | | /-> f04f 33ff mov.w r3, #4294967295 @ 0xffffffff 800158e: | | | | | | | | | | | | | | | | | a90a add r1, sp, #40 @ 0x28 8001590: | | | | | | | | | | | | | | | | | 2020 movs r0, #32 8001592: | | | | | | | | | | | | | | | | | f7ff fd13 bl 8000fbc <_out_char> 8001596: | | | | | | | | | | | | | | | | /--|-> eb04 0209 add.w r2, r4, r9 while (l++ < width) { 800159a: | | | | | | | | | | | | | | | | | | f109 0901 add.w r9, r9, #1 800159e: | | | | | | | | | | | | | | | | | | 454f cmp r7, r9 80015a0: | | | | | | | | | | | | | | | | | \-- d8f3 bhi.n 800158a <printf_+0x292> 80015a2: | | | | | | | | | | | | | | | | | 1e3a subs r2, r7, #0 80015a4: | | | | | | | | | | | | | | | | | bf18 it ne 80015a6: | | | | | | | | | | | | | | | | | 2201 movne r2, #1 80015a8: | | | | | | | | | | | | | | | | | 2a00 cmp r2, #0 80015aa: | | | | | | | | | | | | | | | | | f107 33ff add.w r3, r7, #4294967295 @ 0xffffffff 80015ae: | | | | | | | | | | | | | | | | | bf08 it eq 80015b0: | | | | | | | | | | | | | | | | | 2300 moveq r3, #0 80015b2: | | | | | | | | | | | | | | | | | f107 0901 add.w r9, r7, #1 80015b6: | | | | | | | | | | | | | | | | | 441c add r4, r3 80015b8: | | | | | | | | | | | | | | | | | bf08 it eq 80015ba: | | | | | | | | | | | | | | | | | f04f 0902 moveq.w r9, #2 80015be: | | | | | | | | | | | | | | \--|--|----- e7d4 b.n 800156a <printf_+0x272> 80015c0: | | | | | | | | | | | | | \-----|--|----> 46c1 mov r9, r8 80015c2: | | | | | | | | | | | | | | \----- e7e8 b.n 8001596 <printf_+0x29e> out(' ', buffer, idx++, maxlen); 80015c4: | | | | | | | | | | | | | | /-> f102 0801 add.w r8, r2, #1 80015c8: | | | | | | | | | | | | | | | f04f 33ff mov.w r3, #4294967295 @ 0xffffffff 80015cc: | | | | | | | | | | | | | | | a90a add r1, sp, #40 @ 0x28 80015ce: | | | | | | | | | | | | | | | 2020 movs r0, #32 80015d0: | | | | | | | | | | | | | | | f7ff fcf4 bl 8000fbc <_out_char> 80015d4: | | | | | | | | | | | | | | | 3401 adds r4, #1 80015d6: | | | | | | | | | | | | | | | 4642 mov r2, r8 while (l++ < width) { 80015d8: | | | | | | | | | | | | | \-----|-> 42a7 cmp r7, r4 80015da: | | | | | | | | | | | | | \-- d8f3 bhi.n 80015c4 <printf_+0x2cc> 80015dc: | | | | | | | | | | | | | eba7 0309 sub.w r3, r7, r9 80015e0: | | | | | | | | | | | | | 454f cmp r7, r9 80015e2: | | | | | | | | | | | | | bf38 it cc 80015e4: | | | | | | | | | | | | | 2300 movcc r3, #0 80015e6: | | | | | | | | | | | | | 449a add sl, r3 break; 80015e8: | | | | | | | | | | | | \----------------> 4654 mov r4, sl 80015ea: +--|--|--|--|--|--|-----|--|--|--|--|-------------------- e68e b.n 800130a <printf_+0x12> const char* p = va_arg(va, char*); 80015ec: | | | | | | | | | | | \-------------------> f855 ab04 ldr.w sl, [r5], #4 unsigned int l = _strnlen_s(p, precision ? precision : (size_t)-1); 80015f0: | | | | | | | | | | | f1b8 0f00 cmp.w r8, #0 80015f4: | | | | | | | | | | | bf14 ite ne 80015f6: | | | | | | | | | | | 4643 movne r3, r8 80015f8: | | | | | | | | | | | f04f 33ff moveq.w r3, #4294967295 @ 0xffffffff 80015fc: | | | | | | | | | | | 4453 add r3, sl 80015fe: | | | | | | | | | | | 46d1 mov r9, sl for (s = str; *s && maxsize--; ++s); 8001600: | | | | | | | | | | | /----------> f899 1000 ldrb.w r1, [r9] 8001604: | | | | | | | | | | | | /-- b109 cbz r1, 800160a <printf_+0x312> 8001606: | | | | | | | | | | | | | 4599 cmp r9, r3 8001608: | | | | | | | | | | | | /-----|-- d111 bne.n 800162e <printf_+0x336> if (flags & FLAGS_PRECISION) { 800160a: | | | | | | | | | | | | | \-> f412 6380 ands.w r3, r2, #1024 @ 0x400 return (unsigned int)(s - str); 800160e: | | | | | | | | | | | | | eba9 090a sub.w r9, r9, sl if (flags & FLAGS_PRECISION) { 8001612: | | | | | | | | | | | | | 9307 str r3, [sp, #28] 8001614: | | | | | | | | | | | | | /-- d002 beq.n 800161c <printf_+0x324> l = (l < precision ? l : precision); 8001616: | | | | | | | | | | | | | | 45c1 cmp r9, r8 8001618: | | | | | | | | | | | | | | bf28 it cs 800161a: | | | | | | | | | | | | | | 46c1 movcs r9, r8 if (!(flags & FLAGS_LEFT)) { 800161c: | | | | | | | | | | | | | \-> f012 0302 ands.w r3, r2, #2 8001620: | | | | | | | | | | | | | 9308 str r3, [sp, #32] 8001622: | | | | | | | | | | | /--|--|-------- d11d bne.n 8001660 <printf_+0x368> 8001624: | | | | | | | | | | | | | | eba9 0304 sub.w r3, r9, r4 8001628: | | | | | | | | | | | | | | 4622 mov r2, r4 800162a: | | | | | | | | | | | | | | 9309 str r3, [sp, #36] @ 0x24 800162c: | | | | | | | | | | | | | | /----- e00b b.n 8001646 <printf_+0x34e> for (s = str; *s && maxsize--; ++s); 800162e: | | | | | | | | | | | | | \--|----> f109 0901 add.w r9, r9, #1 8001632: | | | | | | | | | | | | \-----|----- e7e5 b.n 8001600 <printf_+0x308> out(' ', buffer, idx++, maxlen); 8001634: | | | | | | | | | | | | | /-> f102 0b01 add.w fp, r2, #1 8001638: | | | | | | | | | | | | | | f04f 33ff mov.w r3, #4294967295 @ 0xffffffff 800163c: | | | | | | | | | | | | | | a90a add r1, sp, #40 @ 0x28 800163e: | | | | | | | | | | | | | | 2020 movs r0, #32 8001640: | | | | | | | | | | | | | | f7ff fcbc bl 8000fbc <_out_char> 8001644: | | | | | | | | | | | | | | 465a mov r2, fp while (l++ < width) { 8001646: | | | | | | | | | | | | \--|-> 9b09 ldr r3, [sp, #36] @ 0x24 8001648: | | | | | | | | | | | | | 18d3 adds r3, r2, r3 800164a: | | | | | | | | | | | | | 429f cmp r7, r3 800164c: | | | | | | | | | | | | \-- d8f2 bhi.n 8001634 <printf_+0x33c> 800164e: | | | | | | | | | | | | eba7 0309 sub.w r3, r7, r9 8001652: | | | | | | | | | | | | 454f cmp r7, r9 8001654: | | | | | | | | | | | | bf38 it cc 8001656: | | | | | | | | | | | | 2300 movcc r3, #0 8001658: | | | | | | | | | | | | f109 0901 add.w r9, r9, #1 800165c: | | | | | | | | | | | | 441c add r4, r3 800165e: | | | | | | | | | | | | 4499 add r9, r3 8001660: | | | | | | | | | | | \-------------> eba4 0b0a sub.w fp, r4, sl 8001664: | | | | | | | | | | | /-- e006 b.n 8001674 <printf_+0x37c> while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { 8001666: | | | | | | | | | | | /-----|-> 4698 mov r8, r3 out(*(p++), buffer, idx++, maxlen); 8001668: | | | | | | | | | | | | /--|-> f04f 33ff mov.w r3, #4294967295 @ 0xffffffff 800166c: | | | | | | | | | | | | | | 4622 mov r2, r4 800166e: | | | | | | | | | | | | | | a90a add r1, sp, #40 @ 0x28 8001670: | | | | | | | | | | | | | | f7ff fca4 bl 8000fbc <_out_char> 8001674: | | | | | | | | | | | | | \-> eb0b 040a add.w r4, fp, sl while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { 8001678: | | | | | | | | | | | | | f81a 0b01 ldrb.w r0, [sl], #1 800167c: | | | | | | | | | | | | | /-- b138 cbz r0, 800168e <printf_+0x396> 800167e: | | | | | | | | | | | | | | 9b07 ldr r3, [sp, #28] 8001680: | | | | | | | | | | | | | | 2b00 cmp r3, #0 8001682: | | | | | | | | | | | | \--|-- d0f1 beq.n 8001668 <printf_+0x370> 8001684: | | | | | | | | | | | | | f108 33ff add.w r3, r8, #4294967295 @ 0xffffffff 8001688: | | | | | | | | | | | | | f1b8 0f00 cmp.w r8, #0 800168c: | | | | | | | | | | | \-----|-- d1eb bne.n 8001666 <printf_+0x36e> if (flags & FLAGS_LEFT) { 800168e: | | | | | | | | | | | \-> 9b08 ldr r3, [sp, #32] 8001690: | | | | | | | | | | | 2b00 cmp r3, #0 8001692: +--|--|--|--|--|--|-----|--|--|--|----------------------- f43f ae3a beq.w 800130a <printf_+0x12> 8001696: | | | | | | | | | | | 4622 mov r2, r4 8001698: | | | | | | | | | | | eba9 0804 sub.w r8, r9, r4 800169c: | | | | | | | | | | | /-- e008 b.n 80016b0 <printf_+0x3b8> out(' ', buffer, idx++, maxlen); 800169e: | | | | | | | | | | | /--|-> f102 0a01 add.w sl, r2, #1 80016a2: | | | | | | | | | | | | | f04f 33ff mov.w r3, #4294967295 @ 0xffffffff 80016a6: | | | | | | | | | | | | | a90a add r1, sp, #40 @ 0x28 80016a8: | | | | | | | | | | | | | 2020 movs r0, #32 80016aa: | | | | | | | | | | | | | f7ff fc87 bl 8000fbc <_out_char> 80016ae: | | | | | | | | | | | | | 4652 mov r2, sl while (l++ < width) { 80016b0: | | | | | | | | | | | | \-> eb02 0308 add.w r3, r2, r8 80016b4: | | | | | | | | | | | | 42bb cmp r3, r7 80016b6: | | | | | | | | | | | \----- d3f2 bcc.n 800169e <printf_+0x3a6> 80016b8: | | | | | | | | | | | eba7 0309 sub.w r3, r7, r9 80016bc: | | | | | | | | | | | 454f cmp r7, r9 80016be: | | | | | | | | | | | bf38 it cc 80016c0: | | | | | | | | | | | 2300 movcc r3, #0 80016c2: | | | | | | | | | | | 441c add r4, r3 break; 80016c4: +--|--|--|--|--|--|-----|--|--|--|----------------------- e621 b.n 800130a <printf_+0x12> switch (*format) { 80016c6: | \--|--|--|--|--|-----|--|--|--|----------------------> 2102 movs r1, #2 80016c8: | | \--|--|--|-----|--|--|--|----------------------- e6ba b.n 8001440 <printf_+0x148> 80016ca: | | | | \-----\--|--|--|----------------------X f63f af07 bhi.w 80014dc <printf_+0x1e4> if ((*format != 'i') && (*format != 'd')) { 80016ce: | | | | | | | 2869 cmp r0, #105 @ 0x69 flags &= ~FLAGS_HASH; // no hash for dec format 80016d0: | | | | | | | f022 0210 bic.w r2, r2, #16 80016d4: | | | | | | | f04f 010a mov.w r1, #10 if ((*format != 'i') && (*format != 'd')) { 80016d8: | | | | \--|--|----------------------- f47f af05 bne.w 80014e6 <printf_+0x1ee> if (flags & FLAGS_PRECISION) { 80016dc: | \-----|--|--------------|--|----------------------> 0553 lsls r3, r2, #21 flags &= ~FLAGS_ZEROPAD; 80016de: | | | | | bf48 it mi 80016e0: | | | | | f022 0201 bicmi.w r2, r2, #1 if ((*format == 'i') || (*format == 'd')) { 80016e4: | | | | | 2869 cmp r0, #105 @ 0x69 if (flags & FLAGS_LONG_LONG) { 80016e6: | | | | | f402 7300 and.w r3, r2, #512 @ 0x200 if ((*format == 'i') || (*format == 'd')) { 80016ea: | | | | | /-- d002 beq.n 80016f2 <printf_+0x3fa> 80016ec: | | | | | | 2864 cmp r0, #100 @ 0x64 80016ee: | | | | \--------------------|-- f47f af19 bne.w 8001524 <printf_+0x22c> if (flags & FLAGS_LONG_LONG) { 80016f2: | | | | \-> 2b00 cmp r3, #0 80016f4: \-----------|--|--------------|-------------------------- f47f ae09 bne.w 800130a <printf_+0x12> else if (flags & FLAGS_LONG) { 80016f8: | | | 05d3 lsls r3, r2, #23 idx = _ntoa_long(out, buffer, idx, maxlen, va_arg(va, unsigned long), false, base, precision, width, flags); 80016fa: | | | f105 0904 add.w r9, r5, #4 else if (flags & FLAGS_LONG) { 80016fe: | \--------------|-------------------------- f57f aef6 bpl.w 80014ee <printf_+0x1f6> const int value = (flags & FLAGS_CHAR) ? (char)va_arg(va, int) : (flags & FLAGS_SHORT) ? (short int)va_arg(va, int) : va_arg(va, int); 8001702: | \-------------------------> 682b ldr r3, [r5, #0] 8001704: \-------------------------------------------- e6f6 b.n 80014f4 <printf_+0x1fc> 8001706: bf00 nop 8001708: 00120821 .word 0x00120821 800170c: 08000fbd .word 0x08000fbd 08001710 : { 8001710: b513 push {r0, r1, r4, lr} st = bgrt_queue_trypost_cb_cs(RXQUEUE, NULL, ecm_rx_q_cb); 8001712: 4c0a ldr r4, [pc, #40] @ (800173c ) 8001714: 490a ldr r1, [pc, #40] @ (8001740 ) 8001716: f8d4 07b8 ldr.w r0, [r4, #1976] @ 0x7b8 800171a: f007 fd5b bl 80091d4 <bgrt_queue_post_cs_fn.constprop.0> LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 800171e: /-- b158 cbz r0, 8001738 <ecm_rx_cb+0x28> 8001720: | b672 cpsid i 8001722: | 4b08 ldr r3, [pc, #32] @ (8001744 ) LWIP_MEMPOOL_INIT(bgrt_proc); } uint32_t sys_now() { return bgrt_kernel.timer.val; 8001724: | f8d4 12fc ldr.w r1, [r4, #764] @ 0x2fc 8001728: | 4a07 ldr r2, [pc, #28] @ (8001748 ) 800172a: | 9300 str r3, [sp, #0] 800172c: | 4807 ldr r0, [pc, #28] @ (800174c ) 800172e: | f44f 7384 mov.w r3, #264 @ 0x108 8001732: | f7ff fde1 bl 80012f8 <printf_> 8001736: | be00 bkpt 0x0000 } 8001738: \-> b002 add sp, #8 800173a: bd10 pop {r4, pc} 800173c: 20000060 .word 0x20000060 8001740: 08000251 .word 0x08000251 8001744: 0800b262 .word 0x0800b262 8001748: 0800b221 .word 0x0800b221 800174c: 0800b232 .word 0x0800b232 08001750 : { 8001750: b570 push {r4, r5, r6, lr} 8001752: 4c19 ldr r4, [pc, #100] @ (80017b8 ) LWIP_DEBUGF(ECM_DEBUG, ("altset_cb: wIndex: %d wValue: %d\n", wIndex, wValue)); 8001754: 4819 ldr r0, [pc, #100] @ (80017bc ) { 8001756: 460e mov r6, r1 LWIP_DEBUGF(ECM_DEBUG, ("altset_cb: wIndex: %d wValue: %d\n", wIndex, wValue)); 8001758: 4613 mov r3, r2 800175a: f8d4 12fc ldr.w r1, [r4, #764] @ 0x2fc { 800175e: b088 sub sp, #32 8001760: 4615 mov r5, r2 LWIP_DEBUGF(ECM_DEBUG, ("altset_cb: wIndex: %d wValue: %d\n", wIndex, wValue)); 8001762: 4632 mov r2, r6 8001764: f7ff fdc8 bl 80012f8 <printf_> if(wIndex != 1) return; /* wIndex: iface # */ 8001768: 2e01 cmp r6, #1 800176a: /----- d112 bne.n 8001792 <ecm_altset_cb+0x42> if (wValue) { /* wValue: alt setting # */ 800176c: | f504 60f8 add.w r0, r4, #1984 @ 0x7c0 8001770: | 4c13 ldr r4, [pc, #76] @ (80017c0 ) 8001772: | /-- b185 cbz r5, 8001796 <ecm_altset_cb+0x46> bgrt_atm_bset(&ev, TX_RDY); 8001774: | | 2102 movs r1, #2 8001776: | | f7ff fd83 bl 8001280 <bgrt_atm_bset.lto_priv.0.lto_priv.0> err_t err; NETIFAPI_VAR_DECLARE(msg); NETIFAPI_VAR_ALLOC(msg); NETIFAPI_VAR_REF(msg).netif = netif; NETIFAPI_VAR_REF(msg).msg.common.voidfunc = voidfunc; 800177a: | | 4b12 ldr r3, [pc, #72] @ (80017c4 ) 800177c: | | 9302 str r3, [sp, #8] NETIFAPI_VAR_REF(msg).msg.common.errtfunc = errtfunc; 800177e: | | 2300 movs r3, #0 NETIFAPI_VAR_REF(msg).netif = netif; 8001780: | | 9401 str r4, [sp, #4] NETIFAPI_VAR_REF(msg).msg.common.errtfunc = errtfunc; 8001782: | | 9303 str r3, [sp, #12] err_t tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call) { #if LWIP_TCPIP_CORE_LOCKING err_t err; LOCK_TCPIP_CORE(); 8001784: /--|--|-> f007 fc48 bl 8009018 <sys_mutex_lock.constprop.0> err = fn(call); 8001788: | | | 4668 mov r0, sp 800178a: | | | f006 fc7c bl 8008086 <netifapi_do_netif_common.lto_priv.0> UNLOCK_TCPIP_CORE(); 800178e: | | | f007 fc87 bl 80090a0 <sys_mutex_unlock.constprop.0> } 8001792: | \--|-> b008 add sp, #32 8001794: | | bd70 pop {r4, r5, r6, pc} 8001796: | \-> f3bf 8f5b dmb ish 800179a: | /-> e850 3f00 ldrex r3, [r0] 800179e: | | f023 0302 bic.w r3, r3, #2 80017a2: | | e840 3200 strex r2, r3, [r0] 80017a6: | | 2a00 cmp r2, #0 80017a8: | \-- d1f7 bne.n 800179a <ecm_altset_cb+0x4a> 80017aa: | f3bf 8f5b dmb ish NETIFAPI_VAR_REF(msg).msg.common.voidfunc = voidfunc; 80017ae: | 4b06 ldr r3, [pc, #24] @ (80017c8 ) NETIFAPI_VAR_REF(msg).netif = netif; 80017b0: | 9401 str r4, [sp, #4] NETIFAPI_VAR_REF(msg).msg.common.errtfunc = errtfunc; 80017b2: | e9cd 3502 strd r3, r5, [sp, #8] 80017b6: \-------- e7e5 b.n 8001784 <ecm_altset_cb+0x34> 80017b8: 20000060 .word 0x20000060 80017bc: 0800b268 .word 0x0800b268 80017c0: 20000000 .word 0x20000000 80017c4: 08004f71 .word 0x08004f71 80017c8: 0800192d .word 0x0800192d 080017cc : { 80017cc: b51f push {r0, r1, r2, r3, r4, lr} LWIP_DEBUGF(ECM_DEBUG, ("cs_cb: bRequest: %02x wValue: %04x wIndex: %04x len: %d data=%02x\n", 80017ce: 6812 ldr r2, [r2, #0] 80017d0: 480a ldr r0, [pc, #40] @ (80017fc ) 80017d2: 7812 ldrb r2, [r2, #0] { 80017d4: 460c mov r4, r1 80017d6: 490a ldr r1, [pc, #40] @ (8001800 ) 80017d8: f8d1 12fc ldr.w r1, [r1, #764] @ 0x2fc LWIP_DEBUGF(ECM_DEBUG, ("cs_cb: bRequest: %02x wValue: %04x wIndex: %04x len: %d data=%02x\n", 80017dc: 9202 str r2, [sp, #8] 80017de: 881b ldrh r3, [r3, #0] 80017e0: 9301 str r3, [sp, #4] 80017e2: 88a3 ldrh r3, [r4, #4] 80017e4: 9300 str r3, [sp, #0] 80017e6: 8863 ldrh r3, [r4, #2] 80017e8: 7862 ldrb r2, [r4, #1] 80017ea: f7ff fd85 bl 80012f8 <printf_> if (req->bRequest == 0x43) 80017ee: 7860 ldrb r0, [r4, #1] } 80017f0: f1a0 0343 sub.w r3, r0, #67 @ 0x43 80017f4: 4258 negs r0, r3 80017f6: 4158 adcs r0, r3 80017f8: b004 add sp, #16 80017fa: bd10 pop {r4, pc} 80017fc: 0800b292 .word 0x0800b292 8001800: 20000060 .word 0x20000060 08001804 : return ERR_OK; } #if LWIP_NETIF_STATUS_CALLBACK static void ecm_status_cb(struct netif *iface) { 8001804: e92d 47f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, r9, sl, lr} 8001808: 4a25 ldr r2, [pc, #148] @ (80018a0 ) u8_t rem; u8_t n; u8_t i; int len = 0; s_addr = ip4_addr_get_u32(addr); 800180a: 6803 ldr r3, [r0, #0] 800180c: f8d2 12fc ldr.w r1, [r2, #764] @ 0x2fc 8001810: 9301 str r3, [sp, #4] int len = 0; 8001812: 2000 movs r0, #0 8001814: af01 add r7, sp, #4 rp = buf; 8001816: f202 72c4 addw r2, r2, #1988 @ 0x7c4 ap = (u8_t *)&s_addr; for (n = 0; n < 4; n++) { 800181a: 4604 mov r4, r0 i = 0; 800181c: 4680 mov r8, r0 do { rem = *ap % (u8_t)10; 800181e: f04f 0e0a mov.w lr, #10 8001822: /----> f817 6b01 ldrb.w r6, [r7], #1 i = 0; 8001826: | 2500 movs r5, #0 rem = *ap % (u8_t)10; 8001828: | /-> fbb6 f3fe udiv r3, r6, lr 800182c: | | 46b1 mov r9, r6 800182e: | | fb0e 6c13 mls ip, lr, r3, r6 *ap /= (u8_t)10; 8001832: | | b2de uxtb r6, r3 8001834: | | 462b mov r3, r5 inv[i++] = (char)('0' + rem); 8001836: | | f103 0a08 add.w sl, r3, #8 800183a: | | 44ea add sl, sp 800183c: | | 3501 adds r5, #1 800183e: | | f10c 0c30 add.w ip, ip, #48 @ 0x30 } while (*ap); 8001842: | | f1b9 0f09 cmp.w r9, #9 inv[i++] = (char)('0' + rem); 8001846: | | b2ed uxtb r5, r5 8001848: | | f80a cc08 strb.w ip, [sl, #-8] } while (*ap); 800184c: | \-- d8ec bhi.n 8001828 <ecm_status_cb+0x24> 800184e: | f807 8c01 strb.w r8, [r7, #-1] 8001852: | 4606 mov r6, r0 8001854: | 4615 mov r5, r2 while (i--) { 8001856: /-----|----> 2bff cmp r3, #255 @ 0xff if (len++ >= buflen) { 8001858: | | f100 0001 add.w r0, r0, #1 while (i--) { 800185c: | | /-- d111 bne.n 8001882 <ecm_status_cb+0x7e> return NULL; } *rp++ = inv[i]; } if (len++ >= buflen) { 800185e: | | | 2e10 cmp r6, #16 8001860: | /--|--|-- d01c beq.n 800189c <ecm_status_cb+0x98> for (n = 0; n < 4; n++) { 8001862: | | | | 3401 adds r4, #1 return NULL; } *rp++ = '.'; 8001864: | | | | 462a mov r2, r5 for (n = 0; n < 4; n++) { 8001866: | | | | b2e4 uxtb r4, r4 *rp++ = '.'; 8001868: | | | | 232e movs r3, #46 @ 0x2e for (n = 0; n < 4; n++) { 800186a: | | | | 2c04 cmp r4, #4 *rp++ = '.'; 800186c: | | | | f802 3b01 strb.w r3, [r2], #1 for (n = 0; n < 4; n++) { 8001870: | | \--|-- d1d7 bne.n 8001822 <ecm_status_cb+0x1e> ap++; } *--rp = 0; 8001872: | | | 2300 movs r3, #0 return buf; 8001874: | | | 4a0b ldr r2, [pc, #44] @ (80018a4 ) *--rp = 0; 8001876: | | | 702b strb r3, [r5, #0] LWIP_DEBUGF(ECM_DEBUG, ("address: %s\n", ip4addr_ntoa(netif_ip4_addr(iface)))); 8001878: | | /--|-> 480b ldr r0, [pc, #44] @ (80018a8 ) } 800187a: | | | | b002 add sp, #8 800187c: | | | | e8bd 47f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, lr} LWIP_DEBUGF(ECM_DEBUG, ("address: %s\n", ip4addr_ntoa(netif_ip4_addr(iface)))); 8001880: | | | | e53a b.n 80012f8 <printf_> if (len++ >= buflen) { 8001882: | | | \-> 1e5a subs r2, r3, #1 8001884: | | | 2811 cmp r0, #17 8001886: | | | b2d2 uxtb r2, r2 8001888: | +--|----- d008 beq.n 800189c <ecm_status_cb+0x98> *rp++ = inv[i]; 800188a: | | | 3308 adds r3, #8 800188c: | | | 446b add r3, sp if (len++ >= buflen) { 800188e: | | | 4606 mov r6, r0 *rp++ = inv[i]; 8001890: | | | f813 3c08 ldrb.w r3, [r3, #-8] 8001894: | | | f805 3b01 strb.w r3, [r5], #1 8001898: | | | 4613 mov r3, r2 800189a: \--|--|----- e7dc b.n 8001856 <ecm_status_cb+0x52> return NULL; 800189c: \--|----> 2200 movs r2, #0 800189e: \----- e7eb b.n 8001878 <ecm_status_cb+0x74> 80018a0: 20000060 .word 0x20000060 80018a4: 20000824 .word 0x20000824 80018a8: 0800b2dd .word 0x0800b2dd 080018ac : 80018ac: 4b06 ldr r3, [pc, #24] @ (80018c8 ) #endif #if LWIP_NETIF_LINK_CALLBACK static void ecm_link_cb(struct netif *iface) { LWIP_DEBUGF(ECM_DEBUG, ("iface is %s\n", netif_is_link_up(iface) ? "up" : "down")); 80018ae: 4a07 ldr r2, [pc, #28] @ (80018cc ) 80018b0: f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80018b4: f890 3035 ldrb.w r3, [r0, #53] @ 0x35 80018b8: 4805 ldr r0, [pc, #20] @ (80018d0 ) 80018ba: f013 0f04 tst.w r3, #4 80018be: 4b05 ldr r3, [pc, #20] @ (80018d4 ) 80018c0: bf18 it ne 80018c2: 461a movne r2, r3 80018c4: e518 b.n 80012f8 <printf_> 80018c6: bf00 nop 80018c8: 20000060 .word 0x20000060 80018cc: 0800b2f5 .word 0x0800b2f5 80018d0: 0800b2fa .word 0x0800b2fa 80018d4: 0800b2f2 .word 0x0800b2f2 080018d8 : do_memp_free_pool(const struct memp_desc *desc, void *mem) { struct memp *memp; SYS_ARCH_DECL_PROTECT(old_level); LWIP_ASSERT("memp_free: mem properly aligned", 80018d8: 078b lsls r3, r1, #30 { 80018da: b537 push {r0, r1, r2, r4, r5, lr} 80018dc: 4605 mov r5, r0 80018de: 460c mov r4, r1 LWIP_ASSERT("memp_free: mem properly aligned", 80018e0: /-- d00c beq.n 80018fc <do_memp_free_pool+0x24> 80018e2: | b672 cpsid i 80018e4: | 4b0d ldr r3, [pc, #52] @ (800191c ) 80018e6: | 4a0e ldr r2, [pc, #56] @ (8001920 ) 80018e8: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80018ec: | 4b0d ldr r3, [pc, #52] @ (8001924 ) 80018ee: | 9300 str r3, [sp, #0] 80018f0: | 480d ldr r0, [pc, #52] @ (8001928 ) 80018f2: | f44f 73b6 mov.w r3, #364 @ 0x16c 80018f6: | f7ff fcff bl 80012f8 <printf_> 80018fa: | be00 bkpt 0x0000 ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0); /* cast through void* to get rid of alignment warnings */ memp = (struct memp *)(void *)((u8_t *)mem - MEMP_SIZE); SYS_ARCH_PROTECT(old_level); 80018fc: \-> f006 fc4c bl 8008198 <bgrt_crit_sec_enter> #if MEMP_OVERFLOW_CHECK == 1 memp_overflow_check_element(memp, desc); #endif /* MEMP_OVERFLOW_CHECK */ #if MEMP_STATS desc->stats->used--; 8001900: 686a ldr r2, [r5, #4] 8001902: 8913 ldrh r3, [r2, #8] 8001904: 3b01 subs r3, #1 8001906: 8113 strh r3, [r2, #8] #if MEMP_MEM_MALLOC LWIP_UNUSED_ARG(desc); SYS_ARCH_UNPROTECT(old_level); mem_free(memp); #else /* MEMP_MEM_MALLOC */ memp->next = *desc->tab; 8001908: 692b ldr r3, [r5, #16] 800190a: 681a ldr r2, [r3, #0] 800190c: 6022 str r2, [r4, #0] *desc->tab = memp; 800190e: 601c str r4, [r3, #0] LWIP_ASSERT("memp sanity", memp_sanity(desc)); #endif /* MEMP_SANITY_CHECK */ SYS_ARCH_UNPROTECT(old_level); #endif /* !MEMP_MEM_MALLOC */ } 8001910: b003 add sp, #12 8001912: e8bd 4030 ldmia.w sp!, {r4, r5, lr} SYS_ARCH_UNPROTECT(old_level); 8001916: f006 bc53 b.w 80081c0 <bgrt_crit_sec_exit> 800191a: bf00 nop 800191c: 20000060 .word 0x20000060 8001920: 0800b30f .word 0x0800b30f 8001924: 0800b32f .word 0x0800b32f 8001928: 0800b232 .word 0x0800b232 0800192c : LWIP_ERROR("netif_set_link_down: invalid netif", netif != NULL, return); 800192c: /-- b920 cbnz r0, 8001938 <netif_set_link_down+0xc> 800192e: | 4b0b ldr r3, [pc, #44] @ (800195c ) 8001930: | 480b ldr r0, [pc, #44] @ (8001960 ) 8001932: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001936: | e4df b.n 80012f8 <printf_> if (netif->flags & NETIF_FLAG_LINK_UP) { 8001938: \-> f890 3035 ldrb.w r3, [r0, #53] @ 0x35 800193c: 075a lsls r2, r3, #29 800193e: /-------- d50c bpl.n 800195a <netif_set_link_down+0x2e> netif_clear_flags(netif, NETIF_FLAG_LINK_UP); 8001940: | f023 0304 bic.w r3, r3, #4 8001944: | f880 3035 strb.w r3, [r0, #53] @ 0x35 acd_network_changed_link_down(netif); 8001948: | 6bc3 ldr r3, [r0, #60] @ 0x3c acd->state = ACD_STATE_OFF; 800194a: | 2200 movs r2, #0 ACD_FOREACH(acd, netif->acd_list) { 800194c: | /--/-X b913 cbnz r3, 8001954 <netif_set_link_down+0x28> NETIF_LINK_CALLBACK(netif); 800194e: | | | 69c3 ldr r3, [r0, #28] 8001950: +--|--|-- b11b cbz r3, 800195a <netif_set_link_down+0x2e> 8001952: | | | 4718 bx r3 acd->state = ACD_STATE_OFF; 8001954: | | \-> 721a strb r2, [r3, #8] ACD_FOREACH(acd, netif->acd_list) { 8001956: | | 681b ldr r3, [r3, #0] 8001958: | \----- e7f8 b.n 800194c <netif_set_link_down+0x20> } 800195a: \-------> 4770 bx lr 800195c: 20000060 .word 0x20000060 8001960: 0800b344 .word 0x0800b344 08001964 : * * @note Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain). */ void pbuf_realloc(struct pbuf *p, u16_t new_len) { 8001964: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr} 8001968: 460e mov r6, r1 struct pbuf *q; u16_t rem_len; /* remaining length */ u16_t shrink; LWIP_ASSERT("pbuf_realloc: p != NULL", p != NULL); 800196a: 4604 mov r4, r0 800196c: /-- b960 cbnz r0, 8001988 <pbuf_realloc+0x24> 800196e: | b672 cpsid i 8001970: | 4b1d ldr r3, [pc, #116] @ (80019e8 ) 8001972: | 4a1e ldr r2, [pc, #120] @ (80019ec ) 8001974: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001978: | 4b1d ldr r3, [pc, #116] @ (80019f0 ) 800197a: | 9300 str r3, [sp, #0] 800197c: | 481d ldr r0, [pc, #116] @ (80019f4 ) 800197e: | f44f 73cc mov.w r3, #408 @ 0x198 8001982: | f7ff fcb9 bl 80012f8 <printf_> 8001986: | be00 bkpt 0x0000 /* desired length larger than current length? */ if (new_len >= p->tot_len) { 8001988: \-> f8b4 8008 ldrh.w r8, [r4, #8] 800198c: 45b0 cmp r8, r6 800198e: /-------- d912 bls.n 80019b6 <pbuf_realloc+0x52> 8001990: | f8df 9054 ldr.w r9, [pc, #84] @ 80019e8 rem_len = (u16_t)(rem_len - q->len); /* decrease total length indicator */ q->tot_len = (u16_t)(q->tot_len - shrink); /* proceed to next pbuf in chain */ q = q->next; LWIP_ASSERT("pbuf_realloc: q != NULL", q != NULL); 8001994: | f8df a058 ldr.w sl, [pc, #88] @ 80019f0 8001998: | f8df b05c ldr.w fp, [pc, #92] @ 80019f8 rem_len = new_len; 800199c: | 4635 mov r5, r6 while (rem_len > q->len) { 800199e: /--|-------> 8963 ldrh r3, [r4, #10] q = q->next; 80019a0: | | 6827 ldr r7, [r4, #0] while (rem_len > q->len) { 80019a2: | | 42ab cmp r3, r5 80019a4: | | /----- d30a bcc.n 80019bc <pbuf_realloc+0x58> /* help to detect faulty overridden implementation of mem_trim */ LWIP_ASSERT("mem_trim returned r != q", r == q); LWIP_UNUSED_ARG(r); } /* adjust length fields for new last pbuf */ q->len = rem_len; 80019a6: | | | 8165 strh r5, [r4, #10] q->tot_len = q->len; 80019a8: | | | 8125 strh r5, [r4, #8] /* any remaining pbufs in chain? */ if (q->next != NULL) { 80019aa: | | | /-- b117 cbz r7, 80019b2 <pbuf_realloc+0x4e> /* free remaining pbufs in chain */ pbuf_free(q->next); 80019ac: | | | | 4638 mov r0, r7 80019ae: | | | | f008 fa05 bl 8009dbc <pbuf_free.isra.0> } /* q is last packet in chain */ q->next = NULL; 80019b2: | | | \-> 2300 movs r3, #0 80019b4: | | | 6023 str r3, [r4, #0] } 80019b6: | \--|----> b003 add sp, #12 80019b8: | | e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} q->tot_len = (u16_t)(q->tot_len - shrink); 80019bc: | \----> 8922 ldrh r2, [r4, #8] rem_len = (u16_t)(rem_len - q->len); 80019be: | 1aeb subs r3, r5, r3 80019c0: | b29d uxth r5, r3 q->tot_len = (u16_t)(q->tot_len - shrink); 80019c2: | eba6 0308 sub.w r3, r6, r8 80019c6: | 4413 add r3, r2 80019c8: | 8123 strh r3, [r4, #8] LWIP_ASSERT("pbuf_realloc: q != NULL", q != NULL); 80019ca: | /-- b95f cbnz r7, 80019e4 <pbuf_realloc+0x80> 80019cc: | | b672 cpsid i 80019ce: | | f240 13af movw r3, #431 @ 0x1af 80019d2: | | f8d9 12fc ldr.w r1, [r9, #764] @ 0x2fc 80019d6: | | 4807 ldr r0, [pc, #28] @ (80019f4 ) 80019d8: | | f8cd a000 str.w sl, [sp] 80019dc: | | 465a mov r2, fp 80019de: | | f7ff fc8b bl 80012f8 <printf_> 80019e2: | | be00 bkpt 0x0000 { 80019e4: | \-> 463c mov r4, r7 80019e6: \----------- e7da b.n 800199e <pbuf_realloc+0x3a> 80019e8: 20000060 .word 0x20000060 80019ec: 0800b36f .word 0x0800b36f 80019f0: 0800b387 .word 0x0800b387 80019f4: 0800b232 .word 0x0800b232 80019f8: 0800b39c .word 0x0800b39c 080019fc : * or p_to is not big enough to hold copy_len at offset * ERR_VAL if any of the pbufs are part of a queue */ err_t pbuf_copy_partial_pbuf(struct pbuf *p_to, const struct pbuf *p_from, u16_t copy_len, u16_t offset) { 80019fc: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 8001a00: 4605 mov r5, r0 8001a02: b085 sub sp, #20 8001a04: 4616 mov r6, r2 8001a06: 461f mov r7, r3 LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy_partial_pbuf(%p, %p, %"U16_F", %"U16_F")\n", (const void *)p_to, (const void *)p_from, copy_len, offset)); /* is the copy_len in range? */ LWIP_ERROR("pbuf_copy_partial_pbuf: copy_len bigger than source", ((p_from != NULL) && 8001a08: 460c mov r4, r1 8001a0a: /-- b111 cbz r1, 8001a12 <pbuf_copy_partial_pbuf+0x16> 8001a0c: | 890b ldrh r3, [r1, #8] 8001a0e: | 4293 cmp r3, r2 8001a10: /--|-- d20a bcs.n 8001a28 <pbuf_copy_partial_pbuf+0x2c> 8001a12: | \-> 4b48 ldr r3, [pc, #288] @ (8001b34 ) 8001a14: | 4848 ldr r0, [pc, #288] @ (8001b38 ) 8001a16: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc (p_from->tot_len >= copy_len)), return ERR_ARG;); /* is the target big enough to hold the source? */ LWIP_ERROR("pbuf_copy_partial_pbuf: target not big enough", ((p_to != NULL) && 8001a1a: /-----|----> f7ff fc6d bl 80012f8 <printf_> LWIP_ERROR("pbuf_copy_partial_pbuf: copy_len bigger than source", ((p_from != NULL) && 8001a1e: | | f06f 000f mvn.w r0, #15 (p_to->next == NULL), return ERR_VAL;); } } while (copy_len); LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy_partial_pbuf: copy complete.\n")); return ERR_OK; } 8001a22: /-----------------|-----|----> b005 add sp, #20 8001a24: | | | e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} LWIP_ERROR("pbuf_copy_partial_pbuf: target not big enough", ((p_to != NULL) && 8001a28: | | \--/-X b118 cbz r0, 8001a32 <pbuf_copy_partial_pbuf+0x36> 8001a2a: | | | 8902 ldrh r2, [r0, #8] 8001a2c: | | | 19bb adds r3, r7, r6 8001a2e: | | | 429a cmp r2, r3 8001a30: | | /--|-- da04 bge.n 8001a3c <pbuf_copy_partial_pbuf+0x40> 8001a32: | | | \-> 4b40 ldr r3, [pc, #256] @ (8001b34 ) 8001a34: | | | 4841 ldr r0, [pc, #260] @ (8001b3c ) 8001a36: | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001a3a: | +-----|----- e7ee b.n 8001a1a <pbuf_copy_partial_pbuf+0x1e> 8001a3c: | | \----> f8df 90f4 ldr.w r9, [pc, #244] @ 8001b34 LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len); 8001a40: | | f8df a110 ldr.w sl, [pc, #272] @ 8001b54 8001a44: | | f8df b110 ldr.w fp, [pc, #272] @ 8001b58 size_t offset_to = offset, offset_from = 0, len; 8001a48: | | f04f 0800 mov.w r8, #0 if ((p_to->len - offset_to) >= (p_from->len - offset_from)) { 8001a4c: | /--------------|----------> 896a ldrh r2, [r5, #10] 8001a4e: | | | 8963 ldrh r3, [r4, #10] MEMCPY((u8_t *)p_to->payload + offset_to, (u8_t *)p_from->payload + offset_from, len); 8001a50: | | | 6868 ldr r0, [r5, #4] 8001a52: | | | 6861 ldr r1, [r4, #4] if ((p_to->len - offset_to) >= (p_from->len - offset_from)) { 8001a54: | | | 1bd2 subs r2, r2, r7 8001a56: | | | eba3 0308 sub.w r3, r3, r8 8001a5a: | | | 429a cmp r2, r3 8001a5c: | | | bf28 it cs 8001a5e: | | | 461a movcs r2, r3 len = LWIP_MIN(copy_len, len); 8001a60: | | | 42b2 cmp r2, r6 8001a62: | | | bf28 it cs 8001a64: | | | 4632 movcs r2, r6 MEMCPY((u8_t *)p_to->payload + offset_to, (u8_t *)p_from->payload + offset_from, len); 8001a66: | | | 4441 add r1, r8 8001a68: | | | 4438 add r0, r7 8001a6a: | | | 9203 str r2, [sp, #12] 8001a6c: | | | f009 fab2 bl 800afd4 <memcpy> offset_to += len; 8001a70: | | | 9a03 ldr r2, [sp, #12] LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len); 8001a72: | | | 896b ldrh r3, [r5, #10] offset_to += len; 8001a74: | | | 4417 add r7, r2 offset_from += len; 8001a76: | | | 4490 add r8, r2 LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len); 8001a78: | | | 42bb cmp r3, r7 copy_len = (u16_t)(copy_len - len); 8001a7a: | | | eba6 0202 sub.w r2, r6, r2 8001a7e: | | | b296 uxth r6, r2 LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len); 8001a80: | | | /-- d20b bcs.n 8001a9a <pbuf_copy_partial_pbuf+0x9e> 8001a82: | | | | b672 cpsid i 8001a84: | | | | f240 33f7 movw r3, #1015 @ 0x3f7 8001a88: | | | | f8d9 12fc ldr.w r1, [r9, #764] @ 0x2fc 8001a8c: | | | | 482c ldr r0, [pc, #176] @ (8001b40 ) 8001a8e: | | | | f8cd a000 str.w sl, [sp] 8001a92: | | | | 465a mov r2, fp 8001a94: | | | | f7ff fc30 bl 80012f8 <printf_> 8001a98: | | | | be00 bkpt 0x0000 LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len); 8001a9a: | | | \-> 8963 ldrh r3, [r4, #10] 8001a9c: | | | 4543 cmp r3, r8 8001a9e: | | | /-- d20b bcs.n 8001ab8 <pbuf_copy_partial_pbuf+0xbc> 8001aa0: | | | | b672 cpsid i 8001aa2: | | | | 4a28 ldr r2, [pc, #160] @ (8001b44 ) 8001aa4: | | | | f8d9 12fc ldr.w r1, [r9, #764] @ 0x2fc 8001aa8: | | | | 4825 ldr r0, [pc, #148] @ (8001b40 ) 8001aaa: | | | | f8cd a000 str.w sl, [sp] 8001aae: | | | | f44f 737e mov.w r3, #1016 @ 0x3f8 8001ab2: | | | | f7ff fc21 bl 80012f8 <printf_> 8001ab6: | | | | be00 bkpt 0x0000 if (offset_from >= p_from->len) { 8001ab8: | | | \-> 8963 ldrh r3, [r4, #10] 8001aba: | | | 4543 cmp r3, r8 8001abc: | | | /-------- d809 bhi.n 8001ad2 <pbuf_copy_partial_pbuf+0xd6> p_from = p_from->next; 8001abe: | | | | 6824 ldr r4, [r4, #0] LWIP_ERROR("p_from != NULL", (p_from != NULL) || (copy_len == 0), return ERR_ARG;); 8001ac0: | | | | /-- b92c cbnz r4, 8001ace <pbuf_copy_partial_pbuf+0xd2> 8001ac2: | | | | /--|-- b18e cbz r6, 8001ae8 <pbuf_copy_partial_pbuf+0xec> 8001ac4: | | | | | | 4b1b ldr r3, [pc, #108] @ (8001b34 ) 8001ac6: | | | | | | 4820 ldr r0, [pc, #128] @ (8001b48 ) 8001ac8: | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001acc: | | +--|--|--|-- e7a5 b.n 8001a1a <pbuf_copy_partial_pbuf+0x1e> offset_from = 0; 8001ace: | | | | | \-> f04f 0800 mov.w r8, #0 if (offset_to == p_to->len) { 8001ad2: | | | >--|----> 896b ldrh r3, [r5, #10] 8001ad4: | | | | | 42bb cmp r3, r7 8001ad6: | | /-----------|--|--|----- d12a bne.n 8001b2e <pbuf_copy_partial_pbuf+0x132> p_to = p_to->next; 8001ad8: | | | | | | 682d ldr r5, [r5, #0] LWIP_ERROR("p_to != NULL", (p_to != NULL) || (copy_len == 0), return ERR_ARG;); 8001ada: | | | /--------|--|--|----- bb3d cbnz r5, 8001b2c <pbuf_copy_partial_pbuf+0x130> 8001adc: | | | | /-----|--|--|----- b316 cbz r6, 8001b24 <pbuf_copy_partial_pbuf+0x128> 8001ade: | | | | | | | | 4b15 ldr r3, [pc, #84] @ (8001b34 ) 8001ae0: | | | | | | | | 481a ldr r0, [pc, #104] @ (8001b4c ) 8001ae2: | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001ae6: | | | | | \--|--|----- e798 b.n 8001a1a <pbuf_copy_partial_pbuf+0x1e> offset_from = 0; 8001ae8: | | | | | | \----> 46b0 mov r8, r6 8001aea: | | | | | \-------- e7f2 b.n 8001ad2 <pbuf_copy_partial_pbuf+0xd6> offset_to = 0; 8001aec: | | | | | /----------> 4637 mov r7, r6 if ((p_from != NULL) && (p_from->len == p_from->tot_len)) { 8001aee: | | | | | /--|----------> 8962 ldrh r2, [r4, #10] 8001af0: | | | | | | | 8923 ldrh r3, [r4, #8] 8001af2: | | | | | | | 429a cmp r2, r3 8001af4: | | | | | | | /----- d10a bne.n 8001b0c <pbuf_copy_partial_pbuf+0x110> LWIP_ERROR("pbuf_copy_partial_pbuf() does not allow packet queues!", 8001af6: | | | | | | | | 6823 ldr r3, [r4, #0] 8001af8: | | | | | | | +----- b143 cbz r3, 8001b0c <pbuf_copy_partial_pbuf+0x110> 8001afa: | | | | | | | /--|----> 4b0e ldr r3, [pc, #56] @ (8001b34 ) LWIP_ERROR("pbuf_copy_partial_pbuf() does not allow packet queues!", 8001afc: | | | | | | | | | 4814 ldr r0, [pc, #80] @ (8001b50 ) 8001afe: | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001b02: | | | | | | | | | f7ff fbf9 bl 80012f8 <printf_> LWIP_ERROR("pbuf_copy_partial_pbuf() does not allow packet queues!", 8001b06: | | | | | | | | | f06f 0005 mvn.w r0, #5 8001b0a: +--|--|--|--|--|--|--|--|----- e78a b.n 8001a22 <pbuf_copy_partial_pbuf+0x26> if ((p_to != NULL) && (p_to->len == p_to->tot_len)) { 8001b0c: | | | | | | | | \--/-X b135 cbz r5, 8001b1c <pbuf_copy_partial_pbuf+0x120> 8001b0e: | | | | | | | | /--|-> 896a ldrh r2, [r5, #10] 8001b10: | | | | | | | | | | 892b ldrh r3, [r5, #8] 8001b12: | | | | | | | | | | 429a cmp r2, r3 8001b14: | | | | | | | | | +-- d102 bne.n 8001b1c <pbuf_copy_partial_pbuf+0x120> LWIP_ERROR("pbuf_copy_partial_pbuf() does not allow packet queues!", 8001b16: | | | | | | | | | | 682b ldr r3, [r5, #0] 8001b18: | | | | | | | | | | 2b00 cmp r3, #0 8001b1a: | | | | | | | \--|--|-- d1ee bne.n 8001afa <pbuf_copy_partial_pbuf+0xfe> } while (copy_len); 8001b1c: | | | | | | | | \-> 2e00 cmp r6, #0 8001b1e: | \--|--|--|--|--|-----|----- d195 bne.n 8001a4c <pbuf_copy_partial_pbuf+0x50> return ERR_OK; 8001b20: | | | | | | | 4630 mov r0, r6 8001b22: +-----|--|--|--|--|-----|----- e77e b.n 8001a22 <pbuf_copy_partial_pbuf+0x26> if ((p_from != NULL) && (p_from->len == p_from->tot_len)) { 8001b24: | | | \--|--|-----|----> 2c00 cmp r4, #0 8001b26: | | | | \-----|----- d1e1 bne.n 8001aec <pbuf_copy_partial_pbuf+0xf0> return ERR_OK; 8001b28: | | | | | 4620 mov r0, r4 8001b2a: \-----|--|-----|--------|----- e77a b.n 8001a22 <pbuf_copy_partial_pbuf+0x26> offset_to = 0; 8001b2c: | \-----|--------|----> 2700 movs r7, #0 if ((p_from != NULL) && (p_from->len == p_from->tot_len)) { 8001b2e: \--------|--------|----> 2c00 cmp r4, #0 8001b30: \--------|----- d1dd bne.n 8001aee <pbuf_copy_partial_pbuf+0xf2> 8001b32: \----- e7ec b.n 8001b0e <pbuf_copy_partial_pbuf+0x112> 8001b34: 20000060 .word 0x20000060 8001b38: 0800b3b4 .word 0x0800b3b4 8001b3c: 0800b3f0 .word 0x0800b3f0 8001b40: 0800b232 .word 0x0800b232 8001b44: 0800b43d .word 0x0800b43d 8001b48: 0800b458 .word 0x0800b458 8001b4c: 0800b46f .word 0x0800b46f 8001b50: 0800b484 .word 0x0800b484 8001b54: 0800b387 .word 0x0800b387 8001b58: 0800b426 .word 0x0800b426 08001b5c : * @param offset offset into the packet buffer from where to begin copying len bytes * @return the number of bytes copied, or 0 on failure */ u16_t pbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset) { 8001b5c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 8001b60: 460f mov r7, r1 8001b62: 4690 mov r8, r2 const struct pbuf *p; u16_t left = 0; u16_t buf_copy_len; u16_t copied_total = 0; LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;); 8001b64: 4605 mov r5, r0 8001b66: /-- b948 cbnz r0, 8001b7c <pbuf_copy_partial+0x20> 8001b68: | 4b18 ldr r3, [pc, #96] @ (8001bcc ) 8001b6a: | 4819 ldr r0, [pc, #100] @ (8001bd0 ) 8001b6c: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc LWIP_ERROR("pbuf_copy_partial: invalid dataptr", (dataptr != NULL), return 0;); 8001b70: /--|-> f7ff fbc2 bl 80012f8 <printf_> LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;); 8001b74: | | 2600 movs r6, #0 len = (u16_t)(len - buf_copy_len); offset = 0; } } return copied_total; } 8001b76: /--|--|-> 4630 mov r0, r6 8001b78: | | | e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} LWIP_ERROR("pbuf_copy_partial: invalid dataptr", (dataptr != NULL), return 0;); 8001b7c: /--------|--|--\-X bb21 cbnz r1, 8001bc8 <pbuf_copy_partial+0x6c> 8001b7e: | | | 4b13 ldr r3, [pc, #76] @ (8001bcc ) 8001b80: | | | 4814 ldr r0, [pc, #80] @ (8001bd4 ) 8001b82: | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001b86: | | \----- e7f3 b.n 8001b70 <pbuf_copy_partial+0x14> if ((offset != 0) && (offset >= p->len)) { 8001b88: | | /-> 896c ldrh r4, [r5, #10] 8001b8a: | | /--|-- b153 cbz r3, 8001ba2 <pbuf_copy_partial+0x46> 8001b8c: | | | | 429c cmp r4, r3 8001b8e: | | +--|-- d808 bhi.n 8001ba2 <pbuf_copy_partial+0x46> offset = (u16_t)(offset - p->len); 8001b90: | | | | 1b1b subs r3, r3, r4 8001b92: | | | | b29b uxth r3, r3 for (p = buf; len != 0 && p != NULL; p = p->next) { 8001b94: | /--|--|--|-> 682d ldr r5, [r5, #0] 8001b96: | /--|--|--|--|-> f1b8 0f00 cmp.w r8, #0 8001b9a: | | | +--|--|-- d0ec beq.n 8001b76 <pbuf_copy_partial+0x1a> 8001b9c: | | | | | | 2d00 cmp r5, #0 8001b9e: | | | | | \-- d1f3 bne.n 8001b88 <pbuf_copy_partial+0x2c> 8001ba0: | | | \--|----- e7e9 b.n 8001b76 <pbuf_copy_partial+0x1a> buf_copy_len = (u16_t)(p->len - offset); 8001ba2: | | | \----> 1ae4 subs r4, r4, r3 if (buf_copy_len > len) { 8001ba4: | | | b2a4 uxth r4, r4 8001ba6: | | | 4544 cmp r4, r8 MEMCPY(&((char *)dataptr)[left], &((char *)p->payload)[offset], buf_copy_len); 8001ba8: | | | 6869 ldr r1, [r5, #4] if (buf_copy_len > len) { 8001baa: | | | bf28 it cs 8001bac: | | | 4644 movcs r4, r8 MEMCPY(&((char *)dataptr)[left], &((char *)p->payload)[offset], buf_copy_len); 8001bae: | | | 4622 mov r2, r4 8001bb0: | | | 4419 add r1, r3 8001bb2: | | | 19b8 adds r0, r7, r6 copied_total = (u16_t)(copied_total + buf_copy_len); 8001bb4: | | | 4426 add r6, r4 len = (u16_t)(len - buf_copy_len); 8001bb6: | | | eba8 0404 sub.w r4, r8, r4 MEMCPY(&((char *)dataptr)[left], &((char *)p->payload)[offset], buf_copy_len); 8001bba: | | | f009 fa0b bl 800afd4 <memcpy> copied_total = (u16_t)(copied_total + buf_copy_len); 8001bbe: | | | b2b6 uxth r6, r6 len = (u16_t)(len - buf_copy_len); 8001bc0: | | | fa1f f884 uxth.w r8, r4 offset = 0; 8001bc4: | | | 2300 movs r3, #0 8001bc6: | | \----------- e7e5 b.n 8001b94 <pbuf_copy_partial+0x38> u16_t left = 0; 8001bc8: \--|-------------> 2600 movs r6, #0 8001bca: \-------------- e7e4 b.n 8001b96 <pbuf_copy_partial+0x3a> 8001bcc: 20000060 .word 0x20000060 8001bd0: 0800b4c3 .word 0x0800b4c3 8001bd4: 0800b4ea .word 0x0800b4ea 08001bd8 : { 8001bd8: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} bgrt_queue_t *q = ((struct ifstate *)iface->state)->txqueue; 8001bdc: 6a03 ldr r3, [r0, #32] total = p->tot_len; 8001bde: 890c ldrh r4, [r1, #8] bgrt_queue_t *q = ((struct ifstate *)iface->state)->txqueue; 8001be0: 685b ldr r3, [r3, #4] sg->len = pbuf_copy_partial(p, sg->payload, len, offset); 8001be2: f8df 80ac ldr.w r8, [pc, #172] @ 8001c90 8001be6: f8df 90ac ldr.w r9, [pc, #172] @ 8001c94 LWIP_ASSERT("sg->len == len\n", sg->len == len); 8001bea: f8df a0ac ldr.w sl, [pc, #172] @ 8001c98 { 8001bee: b085 sub sp, #20 8001bf0: 460e mov r6, r1 bgrt_queue_t *q = ((struct ifstate *)iface->state)->txqueue; 8001bf2: 9303 str r3, [sp, #12] offset = 0; 8001bf4: 2700 movs r7, #0 while (total) { 8001bf6: /--/-X b93c cbnz r4, 8001c08 <ecm_output+0x30> bgrt_atm_bset(&ev, TX_REQ); 8001bf8: | | 481f ldr r0, [pc, #124] @ (8001c78 ) 8001bfa: | | 2101 movs r1, #1 8001bfc: | | f7ff fb40 bl 8001280 <bgrt_atm_bset.lto_priv.0.lto_priv.0> } 8001c00: | | 4620 mov r0, r4 8001c02: | | b005 add sp, #20 8001c04: | | e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} sg->len = pbuf_copy_partial(p, sg->payload, len, offset); 8001c08: | \-> f8d8 b040 ldr.w fp, [r8, #64] @ 0x40 len = MIN(ECM_PACKET_SIZE, total); 8001c0c: | 2c40 cmp r4, #64 @ 0x40 8001c0e: | 4625 mov r5, r4 8001c10: | bf28 it cs 8001c12: | 2540 movcs r5, #64 @ 0x40 sg->len = pbuf_copy_partial(p, sg->payload, len, offset); 8001c14: | 463b mov r3, r7 8001c16: | 462a mov r2, r5 8001c18: | f10b 0104 add.w r1, fp, #4 8001c1c: | 4630 mov r0, r6 8001c1e: | f7ff ff9d bl 8001b5c <pbuf_copy_partial> LWIP_ASSERT("sg->len == len\n", sg->len == len); 8001c22: | f8d8 3040 ldr.w r3, [r8, #64] @ 0x40 sg->len = pbuf_copy_partial(p, sg->payload, len, offset); 8001c26: | f8ab 0002 strh.w r0, [fp, #2] LWIP_ASSERT("sg->len == len\n", sg->len == len); 8001c2a: | 885b ldrh r3, [r3, #2] 8001c2c: | 42ab cmp r3, r5 8001c2e: | /-- d00b beq.n 8001c48 <ecm_output+0x70> 8001c30: | | b672 cpsid i 8001c32: | | 4a12 ldr r2, [pc, #72] @ (8001c7c ) 8001c34: | | f8d9 12fc ldr.w r1, [r9, #764] @ 0x2fc 8001c38: | | 4811 ldr r0, [pc, #68] @ (8001c80 ) 8001c3a: | | f8cd a000 str.w sl, [sp] 8001c3e: | | f44f 73d5 mov.w r3, #426 @ 0x1aa 8001c42: | | f7ff fb59 bl 80012f8 <printf_> 8001c46: | | be00 bkpt 0x0000 st = bgrt_queue_swap(q, (void **)&sg); 8001c48: | \-> 4a0e ldr r2, [pc, #56] @ (8001c84 ) 8001c4a: | 490f ldr r1, [pc, #60] @ (8001c88 ) 8001c4c: | 9803 ldr r0, [sp, #12] 8001c4e: | f006 fb2b bl 80082a8 <bgrt_queue_fetch_fn> LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 8001c52: | /-- b158 cbz r0, 8001c6c <ecm_output+0x94> 8001c54: | | b672 cpsid i 8001c56: | | 4a0d ldr r2, [pc, #52] @ (8001c8c ) 8001c58: | | f8d9 12fc ldr.w r1, [r9, #764] @ 0x2fc 8001c5c: | | 4808 ldr r0, [pc, #32] @ (8001c80 ) 8001c5e: | | f8cd a000 str.w sl, [sp] 8001c62: | | f240 13ad movw r3, #429 @ 0x1ad 8001c66: | | f7ff fb47 bl 80012f8 <printf_> 8001c6a: | | be00 bkpt 0x0000 total -= len; 8001c6c: | \-> 1b64 subs r4, r4, r5 offset += len; 8001c6e: | 443d add r5, r7 total -= len; 8001c70: | b2a4 uxth r4, r4 offset += len; 8001c72: | b2af uxth r7, r5 8001c74: \----- e7bf b.n 8001bf6 <ecm_output+0x1e> 8001c76: bf00 nop 8001c78: 20000820 .word 0x20000820 8001c7c: 0800b515 .word 0x0800b515 8001c80: 0800b232 .word 0x0800b232 8001c84: 08007dab .word 0x08007dab 8001c88: 20000040 .word 0x20000040 8001c8c: 0800b221 .word 0x0800b221 8001c90: 20000000 .word 0x20000000 8001c94: 20000060 .word 0x20000060 8001c98: 0800b262 .word 0x0800b262 08001c9c : * Returns how much extra window would be advertised if we sent an * update now. */ u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb) { 8001c9c: b573 push {r0, r1, r4, r5, r6, lr} u32_t new_right_edge; LWIP_ASSERT("tcp_update_rcv_ann_wnd: invalid pcb", pcb != NULL); 8001c9e: 4604 mov r4, r0 8001ca0: /-- b960 cbnz r0, 8001cbc <tcp_update_rcv_ann_wnd+0x20> 8001ca2: | b672 cpsid i 8001ca4: | 4b19 ldr r3, [pc, #100] @ (8001d0c ) 8001ca6: | 4a1a ldr r2, [pc, #104] @ (8001d10 ) 8001ca8: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001cac: | 4b19 ldr r3, [pc, #100] @ (8001d14 ) 8001cae: | 9300 str r3, [sp, #0] 8001cb0: | 4819 ldr r0, [pc, #100] @ (8001d18 ) 8001cb2: | f240 33aa movw r3, #938 @ 0x3aa 8001cb6: | f7ff fb1f bl 80012f8 <printf_> 8001cba: | be00 bkpt 0x0000 new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd; 8001cbc: \-> 8d23 ldrh r3, [r4, #40] @ 0x28 if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) { 8001cbe: 6ae1 ldr r1, [r4, #44] @ 0x2c 8001cc0: 8e66 ldrh r6, [r4, #50] @ 0x32 new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd; 8001cc2: 6a62 ldr r2, [r4, #36] @ 0x24 if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) { 8001cc4: 1a58 subs r0, r3, r1 8001cc6: f5b6 6f86 cmp.w r6, #1072 @ 0x430 8001cca: 4410 add r0, r2 8001ccc: bf94 ite ls 8001cce: 1b85 subls r5, r0, r6 8001cd0: f5a0 6586 subhi.w r5, r0, #1072 @ 0x430 8001cd4: 2d00 cmp r5, #0 8001cd6: /-------- da13 bge.n 8001d00 <tcp_update_rcv_ann_wnd+0x64> /* we can advertise more window */ pcb->rcv_ann_wnd = pcb->rcv_wnd; return new_right_edge - pcb->rcv_ann_right_edge; } else { if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) { 8001cd8: | 1a8d subs r5, r1, r2 8001cda: | /----- d414 bmi.n 8001d06 <tcp_update_rcv_ann_wnd+0x6a> pcb->rcv_ann_wnd = 0; } else { /* keep the right edge of window constant */ u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt; #if !LWIP_WND_SCALE LWIP_ASSERT("new_rcv_ann_wnd <= 0xffff", new_rcv_ann_wnd <= 0xffff); 8001cdc: | | f5b5 3f80 cmp.w r5, #65536 @ 0x10000 8001ce0: | | /-- d30c bcc.n 8001cfc <tcp_update_rcv_ann_wnd+0x60> 8001ce2: | | | b672 cpsid i 8001ce4: | | | 4b09 ldr r3, [pc, #36] @ (8001d0c ) 8001ce6: | | | 4a0d ldr r2, [pc, #52] @ (8001d1c ) 8001ce8: | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001cec: | | | 4b09 ldr r3, [pc, #36] @ (8001d14 ) 8001cee: | | | 9300 str r3, [sp, #0] 8001cf0: | | | 4809 ldr r0, [pc, #36] @ (8001d18 ) 8001cf2: | | | f240 33ba movw r3, #954 @ 0x3ba 8001cf6: | | | f7ff faff bl 80012f8 <printf_> 8001cfa: | | | be00 bkpt 0x0000 #endif pcb->rcv_ann_wnd = (tcpwnd_size_t)new_rcv_ann_wnd; 8001cfc: | | \-> b2ab uxth r3, r5 } return 0; 8001cfe: | | 2000 movs r0, #0 pcb->rcv_ann_wnd = pcb->rcv_wnd; 8001d00: >--|----> 8563 strh r3, [r4, #42] @ 0x2a } } 8001d02: | | b002 add sp, #8 8001d04: | | bd70 pop {r4, r5, r6, pc} 8001d06: | \----> 2300 movs r3, #0 return 0; 8001d08: | 4618 mov r0, r3 8001d0a: \-------- e7f9 b.n 8001d00 <tcp_update_rcv_ann_wnd+0x64> 8001d0c: 20000060 .word 0x20000060 8001d10: 0800b525 .word 0x0800b525 8001d14: 0800b549 .word 0x0800b549 8001d18: 0800b232 .word 0x0800b232 8001d1c: 0800b55d .word 0x0800b55d 08001d20 : * * @param pcb the tcp_pcb for which a segment arrived */ static void tcp_parseopt(struct tcp_pcb *pcb) { 8001d20: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} 8001d22: 4c22 ldr r4, [pc, #136] @ (8001dac ) u16_t mss; #if LWIP_TCP_TIMESTAMPS u32_t tsval; #endif LWIP_ASSERT("tcp_parseopt: invalid pcb", pcb != NULL); 8001d24: 4605 mov r5, r0 8001d26: /-- b958 cbnz r0, 8001d40 <tcp_parseopt+0x20> 8001d28: | b672 cpsid i 8001d2a: | 4b21 ldr r3, [pc, #132] @ (8001db0 ) 8001d2c: | f8d4 12fc ldr.w r1, [r4, #764] @ 0x2fc 8001d30: | 4a20 ldr r2, [pc, #128] @ (8001db4 ) 8001d32: | 9300 str r3, [sp, #0] 8001d34: | 4820 ldr r0, [pc, #128] @ (8001db8 ) 8001d36: | f240 7383 movw r3, #1923 @ 0x783 8001d3a: | f7ff fadd bl 80012f8 <printf_> 8001d3e: | be00 bkpt 0x0000 /* Parse the TCP MSS option, if present. */ if (tcphdr_optlen != 0) { 8001d40: \-> f8b4 67d4 ldrh.w r6, [r4, #2004] @ 0x7d4 8001d44: /-------------- b386 cbz r6, 8001da8 <tcp_parseopt+0x88> for (tcp_optidx = 0; tcp_optidx < tcphdr_optlen; ) { 8001d46: | 2300 movs r3, #0 and we don't process them further. */ return; } /* All other options have a length field, so that we easily can skip past them. */ tcp_optidx += data - 2; 8001d48: | /----> f8a4 3128 strh.w r3, [r4, #296] @ 0x128 8001d4c: | /--|----- e028 b.n 8001da0 <tcp_parseopt+0x80> u8_t opt = tcp_get_next_optbyte(); 8001d4e: | /--|--|----> f7fe ff5e bl 8000c0e <tcp_get_next_optbyte> switch (opt) { 8001d52: | | | | 2801 cmp r0, #1 8001d54: | | +--|----- d024 beq.n 8001da0 <tcp_parseopt+0x80> 8001d56: | | | | 2802 cmp r0, #2 8001d58: | | | | /-- d009 beq.n 8001d6e <tcp_parseopt+0x4e> 8001d5a: +--|--|--|--|-- b328 cbz r0, 8001da8 <tcp_parseopt+0x88> data = tcp_get_next_optbyte(); 8001d5c: | | | | | f7fe ff57 bl 8000c0e <tcp_get_next_optbyte> if (data < 2) { 8001d60: | | | | | 2801 cmp r0, #1 8001d62: +--|--|--|--|-- d921 bls.n 8001da8 <tcp_parseopt+0x88> tcp_optidx += data - 2; 8001d64: | | | | | f8b4 3128 ldrh.w r3, [r4, #296] @ 0x128 8001d68: | | | | | 3b02 subs r3, #2 8001d6a: | | | | | 4403 add r3, r0 8001d6c: | | | \--|-- e7ec b.n 8001d48 <tcp_parseopt+0x28> if (tcp_get_next_optbyte() != LWIP_TCP_OPT_LEN_MSS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_MSS) > tcphdr_optlen) { 8001d6e: | | | \-> f7fe ff4e bl 8000c0e <tcp_get_next_optbyte> 8001d72: | | | 2804 cmp r0, #4 8001d74: +--|--|-------- d118 bne.n 8001da8 <tcp_parseopt+0x88> 8001d76: | | | f8b4 3128 ldrh.w r3, [r4, #296] @ 0x128 8001d7a: | | | 3301 adds r3, #1 8001d7c: | | | 42b3 cmp r3, r6 8001d7e: +--|--|-------- da13 bge.n 8001da8 <tcp_parseopt+0x88> mss = (u16_t)(tcp_get_next_optbyte() << 8); 8001d80: | | | f7fe ff45 bl 8000c0e <tcp_get_next_optbyte> 8001d84: | | | 0207 lsls r7, r0, #8 mss |= tcp_get_next_optbyte(); 8001d86: | | | f7fe ff42 bl 8000c0e <tcp_get_next_optbyte> mss = (u16_t)(tcp_get_next_optbyte() << 8); 8001d8a: | | | b2bf uxth r7, r7 mss |= tcp_get_next_optbyte(); 8001d8c: | | | ea40 0307 orr.w r3, r0, r7 8001d90: | | | b29b uxth r3, r3 pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss; 8001d92: | | | 1e5a subs r2, r3, #1 8001d94: | | | f5b2 7f06 cmp.w r2, #536 @ 0x218 8001d98: | | | bf28 it cs 8001d9a: | | | f44f 7306 movcs.w r3, #536 @ 0x218 8001d9e: | | | 866b strh r3, [r5, #50] @ 0x32 for (tcp_optidx = 0; tcp_optidx < tcphdr_optlen; ) { 8001da0: | | \-------> f8b4 3128 ldrh.w r3, [r4, #296] @ 0x128 8001da4: | | 42b3 cmp r3, r6 8001da6: | \----------- d3d2 bcc.n 8001d4e <tcp_parseopt+0x2e> } } } } 8001da8: \-------------> b003 add sp, #12 8001daa: bdf0 pop {r4, r5, r6, r7, pc} 8001dac: 20000060 .word 0x20000060 8001db0: 0800b591 .word 0x0800b591 8001db4: 0800b577 .word 0x0800b577 8001db8: 0800b232 .word 0x0800b232 08001dbc : * @arg seg the tcp segment to check * @return 1 if ref != 1, 0 if ref == 1 */ static int tcp_output_segment_busy(const struct tcp_seg *seg) { 8001dbc: b513 push {r0, r1, r4, lr} LWIP_ASSERT("tcp_output_segment_busy: invalid seg", seg != NULL); 8001dbe: 4604 mov r4, r0 8001dc0: /-- b960 cbnz r0, 8001ddc <tcp_output_segment_busy+0x20> 8001dc2: | b672 cpsid i 8001dc4: | 4b09 ldr r3, [pc, #36] @ (8001dec ) 8001dc6: | 4a0a ldr r2, [pc, #40] @ (8001df0 ) 8001dc8: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001dcc: | 4b09 ldr r3, [pc, #36] @ (8001df4 ) 8001dce: | 9300 str r3, [sp, #0] 8001dd0: | 4809 ldr r0, [pc, #36] @ (8001df8 ) 8001dd2: | f240 539e movw r3, #1438 @ 0x59e 8001dd6: | f7ff fa8f bl 80012f8 <printf_> 8001dda: | be00 bkpt 0x0000 /* We only need to check the first pbuf here: If a pbuf is queued for transmission, a driver calls pbuf_ref(), which only changes the ref count of the first pbuf */ if (seg->p->ref != 1) { 8001ddc: \-> 6863 ldr r3, [r4, #4] 8001dde: 7b98 ldrb r0, [r3, #14] /* other reference found */ return 1; } /* no other references found */ return 0; } 8001de0: 3801 subs r0, #1 8001de2: bf18 it ne 8001de4: 2001 movne r0, #1 8001de6: b002 add sp, #8 8001de8: bd10 pop {r4, pc} 8001dea: bf00 nop 8001dec: 20000060 .word 0x20000060 8001df0: 0800b5a8 .word 0x0800b5a8 8001df4: 0800b5cd .word 0x0800b5cd 8001df8: 0800b232 .word 0x0800b232 08001dfc : * * @param pcb the tcp_pcb for which to re-enqueue all unacked segments */ err_t tcp_rexmit_rto_prepare(struct tcp_pcb *pcb) { 8001dfc: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} struct tcp_seg *seg; LWIP_ASSERT("tcp_rexmit_rto_prepare: invalid pcb", pcb != NULL); 8001dfe: 4604 mov r4, r0 8001e00: /-- b960 cbnz r0, 8001e1c <tcp_rexmit_rto_prepare+0x20> 8001e02: | b672 cpsid i 8001e04: | 4b1e ldr r3, [pc, #120] @ (8001e80 ) 8001e06: | 4a1f ldr r2, [pc, #124] @ (8001e84 ) 8001e08: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001e0c: | 4b1e ldr r3, [pc, #120] @ (8001e88 ) 8001e0e: | 9300 str r3, [sp, #0] 8001e10: | 481e ldr r0, [pc, #120] @ (8001e8c ) 8001e12: | f240 6367 movw r3, #1639 @ 0x667 8001e16: | f7ff fa6f bl 80012f8 <printf_> 8001e1a: | be00 bkpt 0x0000 if (pcb->unacked == NULL) { 8001e1c: \-> 6f25 ldr r5, [r4, #112] @ 0x70 8001e1e: /----- b945 cbnz r5, 8001e32 <tcp_rexmit_rto_prepare+0x36> return ERR_VAL; 8001e20: /--|----> f06f 0005 mvn.w r0, #5 pcb->rto_end = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); /* Don't take any RTT measurements after retransmitting. */ pcb->rttest = 0; return ERR_OK; } 8001e24: /--|--|----> b003 add sp, #12 8001e26: | | | bdf0 pop {r4, r5, r6, r7, pc} if (tcp_output_segment_busy(seg)) { 8001e28: | | | /-> f7ff ffc8 bl 8001dbc <tcp_output_segment_busy> 8001e2c: | | | | 2800 cmp r0, #0 8001e2e: | +--|--|-- d1f7 bne.n 8001e20 <tcp_rexmit_rto_prepare+0x24> for (seg = pcb->unacked; seg->next != NULL; seg = seg->next) { 8001e30: | | | | 682d ldr r5, [r5, #0] 8001e32: | | \--|-> 682b ldr r3, [r5, #0] if (tcp_output_segment_busy(seg)) { 8001e34: | | | 4628 mov r0, r5 for (seg = pcb->unacked; seg->next != NULL; seg = seg->next) { 8001e36: | | | 2b00 cmp r3, #0 8001e38: | | \-- d1f6 bne.n 8001e28 <tcp_rexmit_rto_prepare+0x2c> if (tcp_output_segment_busy(seg)) { 8001e3a: | | f7ff ffbf bl 8001dbc <tcp_output_segment_busy> 8001e3e: | | 2800 cmp r0, #0 8001e40: | \-------- d1ee bne.n 8001e20 <tcp_rexmit_rto_prepare+0x24> seg->next = pcb->unsent; 8001e42: | 6ee3 ldr r3, [r4, #108] @ 0x6c 8001e44: | 602b str r3, [r5, #0] if (pcb->unsent == NULL) { 8001e46: | /-- b913 cbnz r3, 8001e4e <tcp_rexmit_rto_prepare+0x52> pcb->unsent_oversize = seg->oversize_left; 8001e48: | | 896b ldrh r3, [r5, #10] 8001e4a: | | f8a4 3068 strh.w r3, [r4, #104] @ 0x68 pcb->unsent = pcb->unacked; 8001e4e: | \-> 6f23 ldr r3, [r4, #112] @ 0x70 8001e50: | 66e3 str r3, [r4, #108] @ 0x6c tcp_set_flags(pcb, TF_RTO); 8001e52: | 8b63 ldrh r3, [r4, #26] pcb->rto_end = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); 8001e54: | 692f ldr r7, [r5, #16] pcb->unacked = NULL; 8001e56: | 2600 movs r6, #0 tcp_set_flags(pcb, TF_RTO); 8001e58: | f443 6300 orr.w r3, r3, #2048 @ 0x800 8001e5c: | 8363 strh r3, [r4, #26] pcb->unacked = NULL; 8001e5e: | 6726 str r6, [r4, #112] @ 0x70 pcb->rto_end = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); 8001e60: | 6878 ldr r0, [r7, #4] 8001e62: | f006 f967 bl 8008134 <lwip_htonl> 8001e66: | 89bb ldrh r3, [r7, #12] 8001e68: | 892a ldrh r2, [r5, #8] pcb->rttest = 0; 8001e6a: | 6366 str r6, [r4, #52] @ 0x34 * @return n in network byte order */ u16_t lwip_htons(u16_t n) { return PP_HTONS(n); 8001e6c: | ba5b rev16 r3, r3 pcb->rto_end = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); 8001e6e: | f013 0303 ands.w r3, r3, #3 8001e72: | bf18 it ne 8001e74: | 2301 movne r3, #1 8001e76: | 4413 add r3, r2 8001e78: | 4403 add r3, r0 8001e7a: | 64e3 str r3, [r4, #76] @ 0x4c return ERR_OK; 8001e7c: | 4630 mov r0, r6 8001e7e: \----------- e7d1 b.n 8001e24 <tcp_rexmit_rto_prepare+0x28> 8001e80: 20000060 .word 0x20000060 8001e84: 0800b5e5 .word 0x0800b5e5 8001e88: 0800b5cd .word 0x0800b5cd 8001e8c: 0800b232 .word 0x0800b232 08001e90 : * * @param pcb the tcp_pcb for which to retransmit the first unacked segment */ err_t tcp_rexmit(struct tcp_pcb *pcb) { 8001e90: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} struct tcp_seg *seg; struct tcp_seg **cur_seg; LWIP_ASSERT("tcp_rexmit: invalid pcb", pcb != NULL); if (pcb->unacked == NULL) { 8001e94: 6f05 ldr r5, [r0, #112] @ 0x70 { 8001e96: 4604 mov r4, r0 if (pcb->unacked == NULL) { 8001e98: /-- b91d cbnz r5, 8001ea2 <tcp_rexmit+0x12> return ERR_VAL; 8001e9a: /--|-> f06f 0005 mvn.w r0, #5 /* Do the actual retransmission. */ MIB2_STATS_INC(mib2.tcpretranssegs); /* No need to call tcp_output: we are always called from tcp_input() and thus tcp_output directly returns. */ return ERR_OK; } 8001e9e: /-----|--|-> e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (tcp_output_segment_busy(seg)) { 8001ea2: | | \-> 4628 mov r0, r5 8001ea4: | | f7ff ff8a bl 8001dbc <tcp_output_segment_busy> 8001ea8: | | 2800 cmp r0, #0 8001eaa: | \----- d1f6 bne.n 8001e9a <tcp_rexmit+0xa> pcb->unacked = seg->next; 8001eac: | 682b ldr r3, [r5, #0] cur_seg = &(pcb->unsent); 8001eae: | f8d4 806c ldr.w r8, [r4, #108] @ 0x6c pcb->unacked = seg->next; 8001eb2: | 6723 str r3, [r4, #112] @ 0x70 cur_seg = &(pcb->unsent); 8001eb4: | f104 076c add.w r7, r4, #108 @ 0x6c while (*cur_seg && 8001eb8: | /-------> f1b8 0f00 cmp.w r8, #0 8001ebc: | | /-- d00c beq.n 8001ed8 <tcp_rexmit+0x48> TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) { 8001ebe: | | | f8d8 3010 ldr.w r3, [r8, #16] 8001ec2: | | | 6858 ldr r0, [r3, #4] 8001ec4: | | | f006 f936 bl 8008134 <lwip_htonl> 8001ec8: | | | 692b ldr r3, [r5, #16] 8001eca: | | | 4606 mov r6, r0 8001ecc: | | | 6858 ldr r0, [r3, #4] 8001ece: | | | f006 f931 bl 8008134 <lwip_htonl> 8001ed2: | | | 1a36 subs r6, r6, r0 while (*cur_seg && 8001ed4: | | | 2e00 cmp r6, #0 8001ed6: | | /--|-- db12 blt.n 8001efe <tcp_rexmit+0x6e> seg->next = *cur_seg; 8001ed8: | | | \-> f8c5 8000 str.w r8, [r5] *cur_seg = seg; 8001edc: | | | 603d str r5, [r7, #0] if (seg->next == NULL) { 8001ede: | | | 682b ldr r3, [r5, #0] 8001ee0: | | | /-- b90b cbnz r3, 8001ee6 <tcp_rexmit+0x56> pcb->unsent_oversize = 0; 8001ee2: | | | | f8a4 3068 strh.w r3, [r4, #104] @ 0x68 if (pcb->nrtx < 0xFF) { 8001ee6: | | | \-> f894 3042 ldrb.w r3, [r4, #66] @ 0x42 8001eea: | | | 2bff cmp r3, #255 @ 0xff ++pcb->nrtx; 8001eec: | | | bf18 it ne 8001eee: | | | 3301 addne r3, #1 pcb->rttest = 0; 8001ef0: | | | f04f 0000 mov.w r0, #0 ++pcb->nrtx; 8001ef4: | | | bf18 it ne 8001ef6: | | | f884 3042 strbne.w r3, [r4, #66] @ 0x42 pcb->rttest = 0; 8001efa: | | | 6360 str r0, [r4, #52] @ 0x34 return ERR_OK; 8001efc: \--|--|----- e7cf b.n 8001e9e <tcp_rexmit+0xe> cur_seg = &((*cur_seg)->next ); 8001efe: | \----> 683f ldr r7, [r7, #0] 8001f00: | f8d7 8000 ldr.w r8, [r7] 8001f04: \-------- e7d8 b.n 8001eb8 <tcp_rexmit+0x28> 08001f06 : { 8001f06: b537 push {r0, r1, r2, r4, r5, lr} 8001f08: 4604 mov r4, r0 SYS_ARCH_PROTECT(old_level); 8001f0a: f006 f945 bl 8008198 <bgrt_crit_sec_enter> memp = *desc->tab; 8001f0e: 6923 ldr r3, [r4, #16] 8001f10: 681d ldr r5, [r3, #0] if (memp != NULL) { 8001f12: /----- b1f5 cbz r5, 8001f52 <do_memp_malloc_pool.lto_priv.0+0x4c> *desc->tab = memp->next; 8001f14: | 682a ldr r2, [r5, #0] 8001f16: | 601a str r2, [r3, #0] LWIP_ASSERT("memp_malloc: memp properly aligned", 8001f18: | 07ab lsls r3, r5, #30 8001f1a: | /-- d00c beq.n 8001f36 <do_memp_malloc_pool.lto_priv.0+0x30> 8001f1c: | | b672 cpsid i 8001f1e: | | 4b14 ldr r3, [pc, #80] @ (8001f70 ) 8001f20: | | 4a14 ldr r2, [pc, #80] @ (8001f74 ) 8001f22: | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001f26: | | 4b14 ldr r3, [pc, #80] @ (8001f78 ) 8001f28: | | 9300 str r3, [sp, #0] 8001f2a: | | 4814 ldr r0, [pc, #80] @ (8001f7c ) 8001f2c: | | f44f 738c mov.w r3, #280 @ 0x118 8001f30: | | f7ff f9e2 bl 80012f8 <printf_> 8001f34: | | be00 bkpt 0x0000 desc->stats->used++; 8001f36: | \-> 6862 ldr r2, [r4, #4] 8001f38: | 8913 ldrh r3, [r2, #8] if (desc->stats->used > desc->stats->max) { 8001f3a: | 8951 ldrh r1, [r2, #10] desc->stats->used++; 8001f3c: | 3301 adds r3, #1 8001f3e: | b29b uxth r3, r3 if (desc->stats->used > desc->stats->max) { 8001f40: | 4299 cmp r1, r3 desc->stats->used++; 8001f42: | 8113 strh r3, [r2, #8] desc->stats->max = desc->stats->used; 8001f44: | bf38 it cc 8001f46: | 8153 strhcc r3, [r2, #10] SYS_ARCH_UNPROTECT(old_level); 8001f48: | f006 f93a bl 80081c0 <bgrt_crit_sec_exit> } 8001f4c: | /-> 4628 mov r0, r5 8001f4e: | | b003 add sp, #12 8001f50: | | bd30 pop {r4, r5, pc} desc->stats->err++; 8001f52: \--|-> 6862 ldr r2, [r4, #4] 8001f54: | 8893 ldrh r3, [r2, #4] 8001f56: | 3301 adds r3, #1 8001f58: | 8093 strh r3, [r2, #4] SYS_ARCH_UNPROTECT(old_level); 8001f5a: | f006 f931 bl 80081c0 <bgrt_crit_sec_exit> 8001f5e: | 4b04 ldr r3, [pc, #16] @ (8001f70 ) LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", desc->desc)); 8001f60: | 6822 ldr r2, [r4, #0] 8001f62: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001f66: | 4806 ldr r0, [pc, #24] @ (8001f80 ) 8001f68: | f7ff f9c6 bl 80012f8 <printf_> return NULL; 8001f6c: \-- e7ee b.n 8001f4c <do_memp_malloc_pool.lto_priv.0+0x46> 8001f6e: bf00 nop 8001f70: 20000060 .word 0x20000060 8001f74: 0800b609 .word 0x0800b609 8001f78: 0800b32f .word 0x0800b32f 8001f7c: 0800b232 .word 0x0800b232 8001f80: 0800b62c .word 0x0800b62c 08001f84 : } #endif static err_t ecmif_init(struct netif *iface) { 8001f84: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr} struct ifstate *ifs = iface->state; 8001f88: 6a07 ldr r7, [r0, #32] { 8001f8a: 4604 mov r4, r0 return do_memp_malloc_pool(desc); 8001f8c: 4848 ldr r0, [pc, #288] @ (80020b0 ) 8001f8e: f7ff ffba bl 8001f06 <do_memp_malloc_pool.lto_priv.0> bgrt_queue_t *q; void **p; /* allocate queues */ q = LWIP_MEMPOOL_ALLOC(bgrt_queue); LWIP_ASSERT("rxqueue != NULL", q != NULL); 8001f92: 4605 mov r5, r0 8001f94: /-- b960 cbnz r0, 8001fb0 <ecmif_init+0x2c> 8001f96: | b672 cpsid i 8001f98: | 4b46 ldr r3, [pc, #280] @ (80020b4 ) 8001f9a: | 4a47 ldr r2, [pc, #284] @ (80020b8 ) 8001f9c: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001fa0: | 4b46 ldr r3, [pc, #280] @ (80020bc ) 8001fa2: | 9300 str r3, [sp, #0] 8001fa4: | 4846 ldr r0, [pc, #280] @ (80020c0 ) 8001fa6: | f44f 73e7 mov.w r3, #462 @ 0x1ce 8001faa: | f7ff f9a5 bl 80012f8 <printf_> 8001fae: | be00 bkpt 0x0000 8001fb0: \-> 4844 ldr r0, [pc, #272] @ (80020c4 ) 8001fb2: f7ff ffa8 bl 8001f06 <do_memp_malloc_pool.lto_priv.0> q->deq = LWIP_MEMPOOL_ALLOC(bgrt_sync); 8001fb6: 60e8 str r0, [r5, #12] LWIP_ASSERT("rxqueue->sem != NULL", q->deq != NULL); 8001fb8: /-- b960 cbnz r0, 8001fd4 <ecmif_init+0x50> 8001fba: | b672 cpsid i 8001fbc: | 4b3d ldr r3, [pc, #244] @ (80020b4 ) 8001fbe: | 4a42 ldr r2, [pc, #264] @ (80020c8 ) 8001fc0: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8001fc4: | 4b3d ldr r3, [pc, #244] @ (80020bc ) 8001fc6: | 9300 str r3, [sp, #0] 8001fc8: | 483d ldr r0, [pc, #244] @ (80020c0 ) 8001fca: | f44f 73e8 mov.w r3, #464 @ 0x1d0 8001fce: | f7ff f993 bl 80012f8 <printf_> 8001fd2: | be00 bkpt 0x0000 bgrt_queue_init(q, IF_Q_SZ, Q_SW|Q_CS); 8001fd4: \-> 2206 movs r2, #6 8001fd6: 2120 movs r1, #32 8001fd8: 4628 mov r0, r5 8001fda: f007 fbe5 bl 80097a8 <bgrt_queue_init.isra.0> 8001fde: f8df 90d4 ldr.w r9, [pc, #212] @ 80020b4 /* populate rx queue with pbufs */ p = q->queue; for (int i=0; i 8001fe6: f8df b100 ldr.w fp, [pc, #256] @ 80020e8 8001fea: f105 060c add.w r6, r5, #12 8001fee: f105 088c add.w r8, r5, #140 @ 0x8c *p = (void *)pbuf_alloc(PBUF_RAW, ECM_PACKET_SIZE, PBUF_RAM); 8001ff2: /----> 2140 movs r1, #64 @ 0x40 8001ff4: | 2000 movs r0, #0 8001ff6: | f007 f93f bl 8009278 <pbuf_alloc.constprop.0> 8001ffa: | f846 0f04 str.w r0, [r6, #4]! LWIP_ASSERT("pbuf != NULL", *p != NULL); 8001ffe: | /-- b958 cbnz r0, 8002018 <ecmif_init+0x94> 8002000: | | b672 cpsid i 8002002: | | f44f 73eb mov.w r3, #470 @ 0x1d6 8002006: | | f8d9 12fc ldr.w r1, [r9, #764] @ 0x2fc 800200a: | | 482d ldr r0, [pc, #180] @ (80020c0 ) 800200c: | | f8cd a000 str.w sl, [sp] 8002010: | | 465a mov r2, fp 8002012: | | f7ff f971 bl 80012f8 <printf_> 8002016: | | be00 bkpt 0x0000 for (int i=0; i 4546 cmp r6, r8 800201a: \----- d1ea bne.n 8001ff2 <ecmif_init+0x6e> } ifs->rxqueue = q; 800201c: 603d str r5, [r7, #0] 800201e: 4824 ldr r0, [pc, #144] @ (80020b0 ) 8002020: f7ff ff71 bl 8001f06 <do_memp_malloc_pool.lto_priv.0> q = LWIP_MEMPOOL_ALLOC(bgrt_queue); LWIP_ASSERT("txqueue != NULL", q != NULL); 8002024: 4605 mov r5, r0 8002026: /-- b960 cbnz r0, 8002042 <ecmif_init+0xbe> 8002028: | b672 cpsid i 800202a: | 4b22 ldr r3, [pc, #136] @ (80020b4 ) 800202c: | 4a27 ldr r2, [pc, #156] @ (80020cc ) 800202e: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002032: | 4b22 ldr r3, [pc, #136] @ (80020bc ) 8002034: | 9300 str r3, [sp, #0] 8002036: | 4822 ldr r0, [pc, #136] @ (80020c0 ) 8002038: | f240 13db movw r3, #475 @ 0x1db 800203c: | f7ff f95c bl 80012f8 <printf_> 8002040: | be00 bkpt 0x0000 8002042: \-> 4820 ldr r0, [pc, #128] @ (80020c4 ) 8002044: f7ff ff5f bl 8001f06 <do_memp_malloc_pool.lto_priv.0> q->deq = LWIP_MEMPOOL_ALLOC(bgrt_sync); 8002048: 60e8 str r0, [r5, #12] LWIP_ASSERT("txqueue->sem != NULL", q->deq != NULL); 800204a: /-- b960 cbnz r0, 8002066 <ecmif_init+0xe2> 800204c: | b672 cpsid i 800204e: | 4b19 ldr r3, [pc, #100] @ (80020b4 ) 8002050: | 4a1f ldr r2, [pc, #124] @ (80020d0 ) 8002052: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002056: | 4b19 ldr r3, [pc, #100] @ (80020bc ) 8002058: | 9300 str r3, [sp, #0] 800205a: | 4819 ldr r0, [pc, #100] @ (80020c0 ) 800205c: | f240 13dd movw r3, #477 @ 0x1dd 8002060: | f7ff f94a bl 80012f8 <printf_> 8002064: | be00 bkpt 0x0000 bgrt_queue_init(q, IF_Q_SZ, Q_SW|Q_CS|Q_REV); 8002066: \-> 2207 movs r2, #7 8002068: 2120 movs r1, #32 800206a: 4628 mov r0, r5 800206c: f007 fb9c bl 80097a8 <bgrt_queue_init.isra.0> /* populate tx queue with sgbufs */ p = q->queue; 8002070: 4a18 ldr r2, [pc, #96] @ (80020d4 ) 8002072: f105 0310 add.w r3, r5, #16 for (int i=0; i f843 2b04 str.w r2, [r3], #4 for (int i=0; i ifs->txqueue = q; iface->linkoutput = ecm_output; 8002086: 4b14 ldr r3, [pc, #80] @ (80020d8 ) ifs->txqueue = q; 8002088: 607d str r5, [r7, #4] iface->linkoutput = ecm_output; 800208a: 6163 str r3, [r4, #20] iface->output = etharp_output; 800208c: 4b13 ldr r3, [pc, #76] @ (80020dc ) 800208e: 6123 str r3, [r4, #16] iface->mtu = 1500; 8002090: f240 53dc movw r3, #1500 @ 0x5dc 8002094: 85a3 strh r3, [r4, #44] @ 0x2c iface->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP; 8002096: 230a movs r3, #10 8002098: f884 3035 strb.w r3, [r4, #53] @ 0x35 sys_thread_new("ecm_input", ecm_input, iface, 800209c: 4910 ldr r1, [pc, #64] @ (80020e0 ) 800209e: 4811 ldr r0, [pc, #68] @ (80020e4 ) 80020a0: 2380 movs r3, #128 @ 0x80 80020a2: 4622 mov r2, r4 80020a4: f007 faa8 bl 80095f8 <sys_thread_new.constprop.0.isra.0> BGRT_PROC_STACK_SIZE, DEFAULT_THREAD_PRIO); return ERR_OK; } 80020a8: 2000 movs r0, #0 80020aa: b003 add sp, #12 80020ac: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} 80020b0: 0800d278 .word 0x0800d278 80020b4: 20000060 .word 0x20000060 80020b8: 0800b65b .word 0x0800b65b 80020bc: 0800b262 .word 0x0800b262 80020c0: 0800b232 .word 0x0800b232 80020c4: 0800d28c .word 0x0800d28c 80020c8: 0800b66b .word 0x0800b66b 80020cc: 0800b68d .word 0x0800b68d 80020d0: 0800b69d .word 0x0800b69d 80020d4: 20000836 .word 0x20000836 80020d8: 08001bd9 .word 0x08001bd9 80020dc: 08005ae9 .word 0x08005ae9 80020e0: 08002709 .word 0x08002709 80020e4: 0800b6b2 .word 0x0800b6b2 80020e8: 0800b680 .word 0x0800b680 080020ec : memp = do_memp_malloc_pool(memp_pools[type]); 80020ec: 4b02 ldr r3, [pc, #8] @ (80020f8 ) 80020ee: eb03 0380 add.w r3, r3, r0, lsl #2 80020f2: 6bd8 ldr r0, [r3, #60] @ 0x3c 80020f4: e707 b.n 8001f06 <do_memp_malloc_pool.lto_priv.0> 80020f6: bf00 nop 80020f8: 0800d264 .word 0x0800d264 080020fc : #if LWIP_DEBUG_TIMERNAMES sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg, const char *handler_name) #else /* LWIP_DEBUG_TIMERNAMES */ sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg) #endif { 80020fc: b573 push {r0, r1, r4, r5, r6, lr} 80020fe: 4604 mov r4, r0 struct sys_timeo *timeout, *t; timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT); 8002100: 2009 movs r0, #9 { 8002102: 460e mov r6, r1 8002104: 4615 mov r5, r2 timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT); 8002106: f7ff fff1 bl 80020ec <memp_malloc> if (timeout == NULL) { 800210a: /-- b968 cbnz r0, 8002128 <sys_timeout_abs+0x2c> LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL); 800210c: | b672 cpsid i 800210e: | 4b14 ldr r3, [pc, #80] @ (8002160 ) 8002110: | 4a14 ldr r2, [pc, #80] @ (8002164 ) 8002112: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002116: | 4b14 ldr r3, [pc, #80] @ (8002168 ) 8002118: | 9300 str r3, [sp, #0] 800211a: | 4814 ldr r0, [pc, #80] @ (800216c ) 800211c: | 23be movs r3, #190 @ 0xbe 800211e: | f7ff f8eb bl 80012f8 <printf_> 8002122: | be00 bkpt 0x0000 t->next = timeout; break; } } } } 8002124: /--------|-> b002 add sp, #8 8002126: | | bd70 pop {r4, r5, r6, pc} if (next_timeout == NULL) { 8002128: | \-> 4a11 ldr r2, [pc, #68] @ (8002170 ) timeout->time = abs_time; 800212a: | 6044 str r4, [r0, #4] timeout->next = NULL; 800212c: | 2300 movs r3, #0 800212e: | 6003 str r3, [r0, #0] if (next_timeout == NULL) { 8002130: | f852 3c5c ldr.w r3, [r2, #-92] timeout->arg = arg; 8002134: | e9c0 6502 strd r6, r5, [r0, #8] if (next_timeout == NULL) { 8002138: | /-- b913 cbnz r3, 8002140 <sys_timeout_abs+0x44> next_timeout = timeout; 800213a: | /--|-> f842 0c5c str.w r0, [r2, #-92] 800213e: +-----|--|-- e7f1 b.n 8002124 <sys_timeout_abs+0x28> if (TIME_LESS_THAN(timeout->time, next_timeout->time)) { 8002140: | | \-> 6859 ldr r1, [r3, #4] 8002142: | | 1a61 subs r1, r4, r1 8002144: | | 2900 cmp r1, #0 8002146: | /--|----- da01 bge.n 800214c <sys_timeout_abs+0x50> timeout->next = next_timeout; 8002148: | | | 6003 str r3, [r0, #0] 800214a: | | \----- e7f6 b.n 800213a <sys_timeout_abs+0x3e> if ((t->next == NULL) || TIME_LESS_THAN(timeout->time, t->next->time)) { 800214c: | >-------> 4619 mov r1, r3 800214e: | | 681b ldr r3, [r3, #0] 8002150: | | /-- b11b cbz r3, 800215a <sys_timeout_abs+0x5e> 8002152: | | | 685a ldr r2, [r3, #4] 8002154: | | | 1aa2 subs r2, r4, r2 8002156: | | | 2a00 cmp r2, #0 8002158: | \-----|-- daf8 bge.n 800214c <sys_timeout_abs+0x50> timeout->next = t->next; 800215a: | \-> 6003 str r3, [r0, #0] t->next = timeout; 800215c: | 6008 str r0, [r1, #0] break; 800215e: \----------- e7e1 b.n 8002124 <sys_timeout_abs+0x28> 8002160: 20000060 .word 0x20000060 8002164: 0800b6bc .word 0x0800b6bc 8002168: 0800b6f9 .word 0x0800b6f9 800216c: 0800b232 .word 0x0800b232 8002170: 20001158 .word 0x20001158 08002174 : #if !LWIP_TESTMODE static #endif void lwip_cyclic_timer(void *arg) { 8002174: b570 push {r4, r5, r6, lr} const struct lwip_cyclic_timer *cyclic = (const struct lwip_cyclic_timer *)arg; #if LWIP_DEBUG_TIMERNAMES LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: %s()\n", cyclic->handler_name)); #endif cyclic->handler(); 8002176: 6843 ldr r3, [r0, #4] { 8002178: 4604 mov r4, r0 cyclic->handler(); 800217a: 4798 blx r3 800217c: 4b08 ldr r3, [pc, #32] @ (80021a0 ) now = sys_now(); next_timeout_time = (u32_t)(current_timeout_due_time + cyclic->interval_ms); /* overflow handled by TIME_LESS_THAN macro */ 800217e: 6826 ldr r6, [r4, #0] 8002180: f8d3 52fc ldr.w r5, [r3, #764] @ 0x2fc 8002184: 4b07 ldr r3, [pc, #28] @ (80021a4 ) if (TIME_LESS_THAN(next_timeout_time, now)) { /* timer would immediately expire again -> "overload" -> restart without any correction */ #if LWIP_DEBUG_TIMERNAMES sys_timeout_abs((u32_t)(now + cyclic->interval_ms), lwip_cyclic_timer, arg, cyclic->handler_name); #else sys_timeout_abs((u32_t)(now + cyclic->interval_ms), lwip_cyclic_timer, arg); 8002186: 4908 ldr r1, [pc, #32] @ (80021a8 ) next_timeout_time = (u32_t)(current_timeout_due_time + cyclic->interval_ms); /* overflow handled by TIME_LESS_THAN macro */ 8002188: f853 0c58 ldr.w r0, [r3, #-88] 800218c: 4430 add r0, r6 if (TIME_LESS_THAN(next_timeout_time, now)) { 800218e: 1b43 subs r3, r0, r5 8002190: 2b00 cmp r3, #0 sys_timeout_abs((u32_t)(now + cyclic->interval_ms), lwip_cyclic_timer, arg); 8002192: 4622 mov r2, r4 8002194: bfb8 it lt 8002196: 1970 addlt r0, r6, r5 sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg, cyclic->handler_name); #else sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg); #endif } } 8002198: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg); 800219c: e7ae b.n 80020fc <sys_timeout_abs> 800219e: bf00 nop 80021a0: 20000060 .word 0x20000060 80021a4: 20001158 .word 0x20001158 80021a8: 08002175 .word 0x08002175 080021ac : { u32_t next_timeout_time; LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("Timeout time too long, max is LWIP_UINT32_MAX/4 msecs", msecs <= (LWIP_UINT32_MAX / 4)); 80021ac: f1b0 4f80 cmp.w r0, #1073741824 @ 0x40000000 { 80021b0: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} 80021b2: 4f0d ldr r7, [pc, #52] @ (80021e8 ) 80021b4: 4604 mov r4, r0 80021b6: 460d mov r5, r1 80021b8: 4616 mov r6, r2 LWIP_ASSERT("Timeout time too long, max is LWIP_UINT32_MAX/4 msecs", msecs <= (LWIP_UINT32_MAX / 4)); 80021ba: /-- d30b bcc.n 80021d4 <sys_timeout+0x28> 80021bc: | b672 cpsid i 80021be: | 4b0b ldr r3, [pc, #44] @ (80021ec ) 80021c0: | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 80021c4: | 4a0a ldr r2, [pc, #40] @ (80021f0 ) 80021c6: | 9300 str r3, [sp, #0] 80021c8: | 480a ldr r0, [pc, #40] @ (80021f4 ) 80021ca: | f240 1329 movw r3, #297 @ 0x129 80021ce: | f7ff f893 bl 80012f8 <printf_> 80021d2: | be00 bkpt 0x0000 80021d4: \-> f8d7 02fc ldr.w r0, [r7, #764] @ 0x2fc next_timeout_time = (u32_t)(sys_now() + msecs); /* overflow handled by TIME_LESS_THAN macro */ #if LWIP_DEBUG_TIMERNAMES sys_timeout_abs(next_timeout_time, handler, arg, handler_name); #else sys_timeout_abs(next_timeout_time, handler, arg); 80021d8: 4632 mov r2, r6 80021da: 4629 mov r1, r5 80021dc: 4420 add r0, r4 #endif } 80021de: b003 add sp, #12 80021e0: e8bd 40f0 ldmia.w sp!, {r4, r5, r6, r7, lr} sys_timeout_abs(next_timeout_time, handler, arg); 80021e4: e78a b.n 80020fc <sys_timeout_abs> 80021e6: bf00 nop 80021e8: 20000060 .word 0x20000060 80021ec: 0800b6f9 .word 0x0800b6f9 80021f0: 0800b712 .word 0x0800b712 80021f4: 0800b232 .word 0x0800b232 080021f8 : static unsigned idle_arg; static void idle(void *ctx) { 80021f8: b583 push {r0, r1, r7, lr} LWIP_MEMPOOL_INIT(bgrt_sync); 80021fa: 4872 ldr r0, [pc, #456] @ (80023c4 ) 80021fc: 4d72 ldr r5, [pc, #456] @ (80023c8 ) 80021fe: f7fe fcef bl 8000be0 <memp_init_pool> LWIP_MEMPOOL_INIT(bgrt_queue); 8002202: 3814 subs r0, #20 8002204: f7fe fcec bl 8000be0 <memp_init_pool> LWIP_MEMPOOL_INIT(bgrt_proc); 8002208: 3068 adds r0, #104 @ 0x68 800220a: f7fe fce9 bl 8000be0 <memp_init_pool> for (i = 0; i < LWIP_ARRAYSIZE(memp_pools); i++) { 800220e: f1a0 0640 sub.w r6, r0, #64 @ 0x40 8002212: 2410 movs r4, #16 memp_init_pool(memp_pools[i]); 8002214: /-> f856 0b04 ldr.w r0, [r6], #4 for (i = 0; i < LWIP_ARRAYSIZE(memp_pools); i++) { 8002218: | 3c01 subs r4, #1 memp_init_pool(memp_pools[i]); 800221a: | f7fe fce1 bl 8000be0 <memp_init_pool> for (i = 0; i < LWIP_ARRAYSIZE(memp_pools); i++) { 800221e: | b2a4 uxth r4, r4 lwip_stats.memp[i] = memp_pools[i]->stats; 8002220: | 6843 ldr r3, [r0, #4] 8002222: | f845 3f04 str.w r3, [r5, #4]! for (i = 0; i < LWIP_ARRAYSIZE(memp_pools); i++) { 8002226: | 2c00 cmp r4, #0 8002228: \-- d1f4 bne.n 8002214 <idle.lto_priv.0+0x1c> 800222a: 4d68 ldr r5, [pc, #416] @ (80023cc ) sys_timeout(lwip_cyclic_timers[i].interval_ms, lwip_cyclic_timer, LWIP_CONST_CAST(void *, &lwip_cyclic_timers[i])); 800222c: 4e68 ldr r6, [pc, #416] @ (80023d0 ) for (i = (LWIP_TCP ? 1 : 0); i < LWIP_ARRAYSIZE(lwip_cyclic_timers); i++) { 800222e: 2401 movs r4, #1 sys_timeout(lwip_cyclic_timers[i].interval_ms, lwip_cyclic_timer, LWIP_CONST_CAST(void *, &lwip_cyclic_timers[i])); 8002230: /-> f855 0f08 ldr.w r0, [r5, #8]! 8002234: | 4631 mov r1, r6 8002236: | 462a mov r2, r5 for (i = (LWIP_TCP ? 1 : 0); i < LWIP_ARRAYSIZE(lwip_cyclic_timers); i++) { 8002238: | 3401 adds r4, #1 sys_timeout(lwip_cyclic_timers[i].interval_ms, lwip_cyclic_timer, LWIP_CONST_CAST(void *, &lwip_cyclic_timers[i])); 800223a: | f7ff ffb7 bl 80021ac <sys_timeout> for (i = (LWIP_TCP ? 1 : 0); i < LWIP_ARRAYSIZE(lwip_cyclic_timers); i++) { 800223e: | 2c06 cmp r4, #6 8002240: \-- d1f6 bne.n 8002230 <idle.lto_priv.0+0x38> void tcpip_init(tcpip_init_done_fn initfunc, void *arg) { lwip_init(); tcpip_init_done = initfunc; 8002242: 4d64 ldr r5, [pc, #400] @ (80023d4 ) 8002244: 4b64 ldr r3, [pc, #400] @ (80023d8 ) return do_memp_malloc_pool(desc); 8002246: 4865 ldr r0, [pc, #404] @ (80023dc ) 8002248: f8c5 30a8 str.w r3, [r5, #168] @ 0xa8 tcpip_init_done_arg = arg; 800224c: 2700 movs r7, #0 800224e: f8c5 70ac str.w r7, [r5, #172] @ 0xac 8002252: f7ff fe58 bl 8001f06 <do_memp_malloc_pool.lto_priv.0> 8002256: 4c62 ldr r4, [pc, #392] @ (80023e0 ) err_t sys_mbox_new(sys_mbox_t *mbox, int size) { LWIP_ASSERT("mbox != NULL", mbox != NULL); LWIP_ASSERT("size <= BGRT_QUEUE_LEN", !size || size <= BGRT_QUEUE_LEN); mbox->queue = LWIP_MEMPOOL_ALLOC(bgrt_queue); 8002258: f8c5 00b0 str.w r0, [r5, #176] @ 0xb0 800225c: 4606 mov r6, r0 LWIP_ERROR("mbox->queue", (mbox->queue != NULL), goto errmem); 800225e: /-- b988 cbnz r0, 8002284 <idle.lto_priv.0+0x8c> return bgrt_kernel.timer.val; 8002260: | f8d4 12fc ldr.w r1, [r4, #764] @ 0x2fc LWIP_ERROR("mbox->queue", (mbox->queue != NULL), goto errmem); 8002264: | 485f ldr r0, [pc, #380] @ (80023e4 ) 8002266: | f7ff f847 bl 80012f8 <printf_> if (sys_mbox_new(&tcpip_mbox, TCPIP_MBOX_SIZE) != ERR_OK) { LWIP_ASSERT("failed to create tcpip_thread mbox", 0); 800226a: /-----|-> b672 cpsid i 800226c: | | 4b5e ldr r3, [pc, #376] @ (80023e8 ) return bgrt_kernel.timer.val; 800226e: | | f8d4 12fc ldr.w r1, [r4, #764] @ 0x2fc 8002272: | | 4a5e ldr r2, [pc, #376] @ (80023ec ) 8002274: | | 9300 str r3, [sp, #0] 8002276: | | 485e ldr r0, [pc, #376] @ (80023f0 ) 8002278: | | f240 2391 movw r3, #657 @ 0x291 800227c: | | f7ff f83c bl 80012f8 <printf_> 8002280: | | be00 bkpt 0x0000 8002282: /--|-----|-- e036 b.n 80022f2 <idle.lto_priv.0+0xfa> 8002284: | | \-> 484f ldr r0, [pc, #316] @ (80023c4 ) 8002286: | | f7ff fe3e bl 8001f06 <do_memp_malloc_pool.lto_priv.0> mbox->queue->enq.sem = LWIP_MEMPOOL_ALLOC(bgrt_sync); 800228a: | | 60b0 str r0, [r6, #8] LWIP_ERROR("mbox->queue->sem", (mbox->queue->enq.sem != NULL), goto free1); 800228c: | | f8d5 60b0 ldr.w r6, [r5, #176] @ 0xb0 8002290: | | 68b3 ldr r3, [r6, #8] 8002292: | | /-- b963 cbnz r3, 80022ae <idle.lto_priv.0+0xb6> return bgrt_kernel.timer.val; 8002294: | | | f8d4 12fc ldr.w r1, [r4, #764] @ 0x2fc LWIP_ERROR("mbox->queue->sem", (mbox->queue->enq.sem != NULL), goto free1); 8002298: | | | 4856 ldr r0, [pc, #344] @ (80023f4 ) 800229a: | | | f7ff f82d bl 80012f8 <printf_> LWIP_DEBUGF(SYS_ARCH_DEBUG, ("mbox=%p size=%d\n", mbox->queue, size)); return ERR_OK; free0: LWIP_MEMPOOL_FREE(bgrt_sync, mbox->queue->enq.sem); free1: LWIP_MEMPOOL_FREE(bgrt_queue, mbox->queue); 800229e: | | /--|-> f8d5 10b0 ldr.w r1, [r5, #176] @ 0xb0 */ void memp_free_pool(const struct memp_desc *desc, void *mem) { LWIP_ASSERT("invalid pool desc", desc != NULL); if ((desc == NULL) || (mem == NULL)) { 80022a2: | | | | 2900 cmp r1, #0 80022a4: | +--|--|-- d0e1 beq.n 800226a <idle.lto_priv.0+0x72> return; } do_memp_free_pool(desc, mem); 80022a6: | | | | 484d ldr r0, [pc, #308] @ (80023dc ) 80022a8: | | | | f7ff fb16 bl 80018d8 <do_memp_free_pool> 80022ac: | \--|--|-- e7dd b.n 800226a <idle.lto_priv.0+0x72> return do_memp_malloc_pool(desc); 80022ae: | | \-> 4845 ldr r0, [pc, #276] @ (80023c4 ) 80022b0: | | f7ff fe29 bl 8001f06 <do_memp_malloc_pool.lto_priv.0> mbox->queue->deq = LWIP_MEMPOOL_ALLOC(bgrt_sync); 80022b4: | | 60f0 str r0, [r6, #12] LWIP_ERROR("mbox->queue->sem", (mbox->queue->deq != NULL), goto free0); 80022b6: | | f8d5 00b0 ldr.w r0, [r5, #176] @ 0xb0 80022ba: | | 68c3 ldr r3, [r0, #12] 80022bc: | | /-- b96b cbnz r3, 80022da <idle.lto_priv.0+0xe2> return bgrt_kernel.timer.val; 80022be: | | | f8d4 12fc ldr.w r1, [r4, #764] @ 0x2fc LWIP_ERROR("mbox->queue->sem", (mbox->queue->deq != NULL), goto free0); 80022c2: | | | 484c ldr r0, [pc, #304] @ (80023f4 ) 80022c4: | | | f7ff f818 bl 80012f8 <printf_> free0: LWIP_MEMPOOL_FREE(bgrt_sync, mbox->queue->enq.sem); 80022c8: | | | f8d5 30b0 ldr.w r3, [r5, #176] @ 0xb0 80022cc: | | | 6899 ldr r1, [r3, #8] if ((desc == NULL) || (mem == NULL)) { 80022ce: | | | 2900 cmp r1, #0 80022d0: | +--|-- d0e5 beq.n 800229e <idle.lto_priv.0+0xa6> do_memp_free_pool(desc, mem); 80022d2: | | | 483c ldr r0, [pc, #240] @ (80023c4 ) 80022d4: | | | f7ff fb00 bl 80018d8 <do_memp_free_pool> 80022d8: | \--|-- e7e1 b.n 800229e <idle.lto_priv.0+0xa6> bgrt_queue_init(mbox->queue, size ? size : BGRT_QUEUE_LEN, 0); 80022da: | \-> 463a mov r2, r7 80022dc: | 2120 movs r1, #32 80022de: | f007 fa63 bl 80097a8 <bgrt_queue_init.isra.0> return bgrt_kernel.timer.val; 80022e2: | f8d4 12fc ldr.w r1, [r4, #764] @ 0x2fc LWIP_DEBUGF(SYS_ARCH_DEBUG, ("mbox=%p size=%d\n", mbox->queue, size)); 80022e6: | f8d5 20b0 ldr.w r2, [r5, #176] @ 0xb0 80022ea: | 4843 ldr r0, [pc, #268] @ (80023f8 ) 80022ec: | 463b mov r3, r7 80022ee: | f7ff f803 bl 80012f8 <printf_> return do_memp_malloc_pool(desc); 80022f2: \----------> 4834 ldr r0, [pc, #208] @ (80023c4 ) 80022f4: f7ff fe07 bl 8001f06 <do_memp_malloc_pool.lto_priv.0> 80022f8: 4606 mov r6, r0 mutex->mtx = LWIP_MEMPOOL_ALLOC(bgrt_sync); 80022fa: f8c5 00b4 str.w r0, [r5, #180] @ 0xb4 LWIP_ERROR("mutex->mtx", (mutex->mtx != NULL), return ERR_MEM); 80022fe: 2800 cmp r0, #0 8002300: /-------- d13c bne.n 800237c <idle.lto_priv.0+0x184> return bgrt_kernel.timer.val; 8002302: | f8d4 12fc ldr.w r1, [r4, #764] @ 0x2fc LWIP_ERROR("mutex->mtx", (mutex->mtx != NULL), return ERR_MEM); 8002306: | 483d ldr r0, [pc, #244] @ (80023fc ) 8002308: | f7fe fff6 bl 80012f8 <printf_> } #if LWIP_TCPIP_CORE_LOCKING if (sys_mutex_new(&lock_tcpip_core) != ERR_OK) { LWIP_ASSERT("failed to create lock_tcpip_core", 0); 800230c: | b672 cpsid i 800230e: | 4b36 ldr r3, [pc, #216] @ (80023e8 ) return bgrt_kernel.timer.val; 8002310: | f8d4 12fc ldr.w r1, [r4, #764] @ 0x2fc 8002314: | 4a3a ldr r2, [pc, #232] @ (8002400 ) 8002316: | 9300 str r3, [sp, #0] 8002318: | 4835 ldr r0, [pc, #212] @ (80023f0 ) 800231a: | f240 2395 movw r3, #661 @ 0x295 800231e: | f7fe ffeb bl 80012f8 <printf_> 8002322: | be00 bkpt 0x0000 } #endif /* LWIP_TCPIP_CORE_LOCKING */ sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO); 8002324: /--|-------> 4937 ldr r1, [pc, #220] @ (8002404 ) 8002326: | | 4838 ldr r0, [pc, #224] @ (8002408 ) 8002328: | | f44f 7380 mov.w r3, #256 @ 0x100 800232c: | | 2200 movs r2, #0 800232e: | | f007 f963 bl 80095f8 <sys_thread_new.constprop.0.isra.0> unsigned wake; (void)ctx; tcpip_init(ecm_init, NULL); debugf("init done\n"); 8002332: | | f8d4 12fc ldr.w r1, [r4, #764] @ 0x2fc 8002336: | | 4a35 ldr r2, [pc, #212] @ (800240c ) 8002338: | | 4835 ldr r0, [pc, #212] @ (8002410 ) 800233a: | | f7fe ffdd bl 80012f8 <printf_> If multiple pins are to be changed, use bitwise OR '|' to separate them. */ void gpio_toggle(uint32_t gpioport, uint16_t gpios) { uint32_t port = GPIO_ODR(gpioport); 800233e: | | 4935 ldr r1, [pc, #212] @ (8002414 ) loop: wake = systicks + 500ul; 8002340: | | /----> f8d4 32fc ldr.w r3, [r4, #764] @ 0x2fc 8002344: | | | f503 73fa add.w r3, r3, #500 @ 0x1f4 sleep: __asm__ __volatile__ ("wfe":::"memory"); 8002348: | | | /-> bf20 wfe if (wake > systicks) goto sleep; 800234a: | | | | f8d4 22fc ldr.w r2, [r4, #764] @ 0x2fc 800234e: | | | | 429a cmp r2, r3 8002350: | | | \-- d3fa bcc.n 8002348 <idle.lto_priv.0+0x150> 8002352: | | | 694b ldr r3, [r1, #20] GPIO_BSRR(gpioport) = ((port & gpios) << 16) | (~port & gpios); 8002354: | | | 041a lsls r2, r3, #16 8002356: | | | 43db mvns r3, r3 8002358: | | | f402 3200 and.w r2, r2, #131072 @ 0x20000 800235c: | | | f003 0302 and.w r3, r3, #2 8002360: | | | 4313 orrs r3, r2 8002362: | | | 618b str r3, [r1, #24] uint32_t port = GPIO_ODR(gpioport); 8002364: | | | f8d1 3c14 ldr.w r3, [r1, #3092] @ 0xc14 GPIO_BSRR(gpioport) = ((port & gpios) << 16) | (~port & gpios); 8002368: | | | 041a lsls r2, r3, #16 800236a: | | | 43db mvns r3, r3 800236c: | | | f002 4200 and.w r2, r2, #2147483648 @ 0x80000000 8002370: | | | f403 4300 and.w r3, r3, #32768 @ 0x8000 8002374: | | | 4313 orrs r3, r2 8002376: | | | f8c1 3c18 str.w r3, [r1, #3096] @ 0xc18 gpio_toggle(GPIOA, GPIO1); gpio_toggle(GPIOD, GPIO15); goto loop; 800237a: | | \----- e7e1 b.n 8002340 <idle.lto_priv.0+0x148> } bgrt_st_t bgrt_mtx_init(bgrt_mtx_t * mutex, bgrt_prio_t prio) { bgrt_st_t ret; BGRT_INT_LOCK(); 800237c: | \-------> f04f 00f0 mov.w r0, #240 @ 0xf0 8002380: | f380 8811 msr BASEPRI, r0 8002384: | f3bf 8f4f dsb sy 8002388: | f3bf 8f6f isb sy return BGRT_ST_ENULL; } BGRT_SPIN_INIT(sync); BGRT_SPIN_LOCK(sync); bgrt_xlist_init((bgrt_xlist_t *)sync); 800238c: | 4630 mov r0, r6 800238e: | f005 ff69 bl 8008264 <bgrt_xlist_init> sync->owner = (bgrt_proc_t *)0; /* ADLINT:SL:[W0567] int to pinter*/ 8002392: | 2300 movs r3, #0 sync->dirty = (bgrt_cnt_t)0; 8002394: | e9c6 3321 strd r3, r3, [r6, #132] @ 0x84 sync->snum = (bgrt_cnt_t)0; sync->pwake = (bgrt_cnt_t)0; 8002398: | e9c6 3323 strd r3, r3, [r6, #140] @ 0x8c sync->prio = prio; 800239c: | 231e movs r3, #30 800239e: | f886 3094 strb.w r3, [r6, #148] @ 0x94 ret = bgrt_mtx_init_cs(mutex, prio); BGRT_INT_FREE(); 80023a2: | f04f 0000 mov.w r0, #0 80023a6: | f380 8811 msr BASEPRI, r0 80023aa: | f3bf 8f4f dsb sy 80023ae: | f3bf 8f6f isb sy LWIP_DEBUGF(SYS_ARCH_DEBUG, ("mutex=%p\n", mutex->mtx)); 80023b2: | 4819 ldr r0, [pc, #100] @ (8002418 ) return bgrt_kernel.timer.val; 80023b4: | f8d4 12fc ldr.w r1, [r4, #764] @ 0x2fc LWIP_DEBUGF(SYS_ARCH_DEBUG, ("mutex=%p\n", mutex->mtx)); 80023b8: | f8d5 20b4 ldr.w r2, [r5, #180] @ 0xb4 80023bc: | f7fe ff9c bl 80012f8 <printf_> 80023c0: \----------- e7b0 b.n 8002324 <idle.lto_priv.0+0x12c> 80023c2: bf00 nop 80023c4: 0800d28c .word 0x0800d28c 80023c8: 200011a8 .word 0x200011a8 80023cc: 0800d2f4 .word 0x0800d2f4 80023d0: 08002175 .word 0x08002175 80023d4: 20001158 .word 0x20001158 80023d8: 08003d0f .word 0x08003d0f 80023dc: 0800d278 .word 0x0800d278 80023e0: 20000060 .word 0x20000060 80023e4: 0800b748 .word 0x0800b748 80023e8: 0800b7b1 .word 0x0800b7b1 80023ec: 0800b78e .word 0x0800b78e 80023f0: 0800b232 .word 0x0800b232 80023f4: 0800b75c .word 0x0800b75c 80023f8: 0800b775 .word 0x0800b775 80023fc: 0800b7c6 .word 0x0800b7c6 8002400: 0800b7d9 .word 0x0800b7d9 8002404: 08009119 .word 0x08009119 8002408: 0800b80c .word 0x0800b80c 800240c: 0800d324 .word 0x0800d324 8002410: 0800b819 .word 0x0800b819 8002414: 40020000 .word 0x40020000 8002418: 0800b7fa .word 0x0800b7fa 0800241c : if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) { 800241c: 4b08 ldr r3, [pc, #32] @ (8002440 ) 800241e: f8d3 20b8 ldr.w r2, [r3, #184] @ 0xb8 8002422: /----- b962 cbnz r2, 800243e <tcp_timer_needed+0x22> 8002424: | f8d3 20bc ldr.w r2, [r3, #188] @ 0xbc 8002428: | /-- b912 cbnz r2, 8002430 <tcp_timer_needed+0x14> 800242a: | | f8d3 20c0 ldr.w r2, [r3, #192] @ 0xc0 800242e: +--|-- b132 cbz r2, 800243e <tcp_timer_needed+0x22> tcpip_tcp_timer_active = 1; 8002430: | \-> 2201 movs r2, #1 8002432: | f8c3 20b8 str.w r2, [r3, #184] @ 0xb8 sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL); 8002436: | 4903 ldr r1, [pc, #12] @ (8002444 ) 8002438: | 2200 movs r2, #0 800243a: | 20fa movs r0, #250 @ 0xfa 800243c: | e6b6 b.n 80021ac <sys_timeout> } 800243e: \----> 4770 bx lr 8002440: 20001158 .word 0x20001158 8002444: 08004805 .word 0x08004805 08002448 : { #ifdef LWIP_HOOK_MEMP_AVAILABLE struct memp *old_first; #endif LWIP_ERROR("memp_free: type < MEMP_MAX", (type < MEMP_MAX), return;); 8002448: 280f cmp r0, #15 800244a: /-- d905 bls.n 8002458 <memp_free+0x10> return bgrt_kernel.timer.val; 800244c: | 4b06 ldr r3, [pc, #24] @ (8002468 ) 800244e: | 4807 ldr r0, [pc, #28] @ (800246c ) 8002450: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002454: | f7fe bf50 b.w 80012f8 <printf_> if (mem == NULL) { 8002458: /--\-X b129 cbz r1, 8002466 <memp_free+0x1e> #ifdef LWIP_HOOK_MEMP_AVAILABLE old_first = *memp_pools[type]->tab; #endif do_memp_free_pool(memp_pools[type], mem); 800245a: | 4b05 ldr r3, [pc, #20] @ (8002470 ) 800245c: | eb03 0380 add.w r3, r3, r0, lsl #2 8002460: | 6bd8 ldr r0, [r3, #60] @ 0x3c 8002462: | f7ff ba39 b.w 80018d8 <do_memp_free_pool> #ifdef LWIP_HOOK_MEMP_AVAILABLE if (old_first == NULL) { LWIP_HOOK_MEMP_AVAILABLE(type); } #endif } 8002466: \----> 4770 bx lr 8002468: 20000060 .word 0x20000060 800246c: 0800b832 .word 0x0800b832 8002470: 0800d264 .word 0x0800d264 08002474 : { 8002474: b513 push {r0, r1, r4, lr} LWIP_ASSERT("tcp_free: LISTEN", pcb->state != LISTEN); 8002476: 7d03 ldrb r3, [r0, #20] 8002478: 2b01 cmp r3, #1 { 800247a: 4604 mov r4, r0 LWIP_ASSERT("tcp_free: LISTEN", pcb->state != LISTEN); 800247c: /-- d10b bne.n 8002496 <tcp_free+0x22> 800247e: | b672 cpsid i 8002480: | 4b08 ldr r3, [pc, #32] @ (80024a4 ) 8002482: | 4a09 ldr r2, [pc, #36] @ (80024a8 ) 8002484: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002488: | 4b08 ldr r3, [pc, #32] @ (80024ac ) 800248a: | 9300 str r3, [sp, #0] 800248c: | 4808 ldr r0, [pc, #32] @ (80024b0 ) 800248e: | 23d4 movs r3, #212 @ 0xd4 8002490: | f7fe ff32 bl 80012f8 <printf_> 8002494: | be00 bkpt 0x0000 memp_free(MEMP_TCP_PCB, pcb); 8002496: \-> 4621 mov r1, r4 8002498: 2001 movs r0, #1 } 800249a: b002 add sp, #8 800249c: e8bd 4010 ldmia.w sp!, {r4, lr} memp_free(MEMP_TCP_PCB, pcb); 80024a0: e7d2 b.n 8002448 <memp_free> 80024a2: bf00 nop 80024a4: 20000060 .word 0x20000060 80024a8: 0800b855 .word 0x0800b855 80024ac: 0800b549 .word 0x0800b549 80024b0: 0800b232 .word 0x0800b232 080024b4 : */ static void ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev) { /* dequeue the reass struct */ if (reassdatagrams == ipr) { 80024b4: 4b10 ldr r3, [pc, #64] @ (80024f8 ) { 80024b6: b537 push {r0, r1, r2, r4, r5, lr} if (reassdatagrams == ipr) { 80024b8: f8d3 20c4 ldr.w r2, [r3, #196] @ 0xc4 80024bc: 4282 cmp r2, r0 { 80024be: 4604 mov r4, r0 80024c0: 460d mov r5, r1 if (reassdatagrams == ipr) { 80024c2: /-- d108 bne.n 80024d6 <ip_reass_dequeue_datagram+0x22> /* it was the first in the list */ reassdatagrams = ipr->next; 80024c4: | 6802 ldr r2, [r0, #0] 80024c6: | f8c3 20c4 str.w r2, [r3, #196] @ 0xc4 LWIP_ASSERT("sanity check linked list", prev != NULL); prev->next = ipr->next; } /* now we can free the ip_reassdata struct */ memp_free(MEMP_REASSDATA, ipr); 80024ca: /-----|-> 4621 mov r1, r4 80024cc: | | 2004 movs r0, #4 } 80024ce: | | b003 add sp, #12 80024d0: | | e8bd 4030 ldmia.w sp!, {r4, r5, lr} memp_free(MEMP_REASSDATA, ipr); 80024d4: | | e7b8 b.n 8002448 <memp_free> LWIP_ASSERT("sanity check linked list", prev != NULL); 80024d6: | /--\-X b961 cbnz r1, 80024f2 <ip_reass_dequeue_datagram+0x3e> 80024d8: | | b672 cpsid i 80024da: | | 4b08 ldr r3, [pc, #32] @ (80024fc ) 80024dc: | | 4a08 ldr r2, [pc, #32] @ (8002500 ) 80024de: | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80024e2: | | 4b08 ldr r3, [pc, #32] @ (8002504 ) 80024e4: | | 9300 str r3, [sp, #0] 80024e6: | | 4808 ldr r0, [pc, #32] @ (8002508 ) 80024e8: | | f240 1345 movw r3, #325 @ 0x145 80024ec: | | f7fe ff04 bl 80012f8 <printf_> 80024f0: | | be00 bkpt 0x0000 prev->next = ipr->next; 80024f2: | \----> 6823 ldr r3, [r4, #0] 80024f4: | 602b str r3, [r5, #0] 80024f6: \-------- e7e8 b.n 80024ca <ip_reass_dequeue_datagram+0x16> 80024f8: 20001158 .word 0x20001158 80024fc: 20000060 .word 0x20000060 8002500: 0800b866 .word 0x0800b866 8002504: 0800b87f .word 0x0800b87f 8002508: 0800b232 .word 0x0800b232 0800250c : /** Free-callback function to free a 'struct pbuf_custom_ref', called by * pbuf_free. */ static void ipfrag_free_pbuf_custom(struct pbuf *p) { 800250c: b513 push {r0, r1, r4, lr} struct pbuf_custom_ref *pcr = (struct pbuf_custom_ref *)p; LWIP_ASSERT("pcr != NULL", pcr != NULL); 800250e: 4604 mov r4, r0 8002510: /-- b960 cbnz r0, 800252c <ipfrag_free_pbuf_custom.lto_priv.0+0x20> 8002512: | b672 cpsid i 8002514: | 4b0a ldr r3, [pc, #40] @ (8002540 ) 8002516: | 4a0b ldr r2, [pc, #44] @ (8002544 ) 8002518: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 800251c: | 4b0a ldr r3, [pc, #40] @ (8002548 ) 800251e: | 9300 str r3, [sp, #0] 8002520: | 480a ldr r0, [pc, #40] @ (800254c ) 8002522: | f240 23ce movw r3, #718 @ 0x2ce 8002526: | f7fe fee7 bl 80012f8 <printf_> 800252a: | be00 bkpt 0x0000 LWIP_ASSERT("pcr == p", (void *)pcr == (void *)p); if (pcr->original != NULL) { 800252c: \-> 6960 ldr r0, [r4, #20] 800252e: /-- b108 cbz r0, 8002534 <ipfrag_free_pbuf_custom.lto_priv.0+0x28> pbuf_free(pcr->original); 8002530: | f007 fc44 bl 8009dbc <pbuf_free.isra.0> memp_free(MEMP_FRAG_PBUF, p); 8002534: \-> 4621 mov r1, r4 8002536: 2005 movs r0, #5 } ip_frag_free_pbuf_custom_ref(pcr); } 8002538: b002 add sp, #8 800253a: e8bd 4010 ldmia.w sp!, {r4, lr} memp_free(MEMP_FRAG_PBUF, p); 800253e: e783 b.n 8002448 <memp_free> 8002540: 20000060 .word 0x20000060 8002544: 0800b89d .word 0x0800b89d 8002548: 0800b87f .word 0x0800b87f 800254c: 0800b232 .word 0x0800b232 08002550 : { 8002550: b537 push {r0, r1, r2, r4, r5, lr} LWIP_ASSERT("p != NULL", p != NULL); 8002552: /-- b978 cbnz r0, 8002574 <pbuf_add_header_impl.lto_priv.0+0x24> 8002554: | b672 cpsid i 8002556: | 4b16 ldr r3, [pc, #88] @ (80025b0 ) 8002558: | 4a16 ldr r2, [pc, #88] @ (80025b4 ) 800255a: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 800255e: | 4b16 ldr r3, [pc, #88] @ (80025b8 ) 8002560: | 9300 str r3, [sp, #0] 8002562: | 4816 ldr r0, [pc, #88] @ (80025bc ) 8002564: | f44f 73f1 mov.w r3, #482 @ 0x1e2 8002568: | f7fe fec6 bl 80012f8 <printf_> 800256c: | be00 bkpt 0x0000 return 1; 800256e: /-----------|-> 2001 movs r0, #1 } 8002570: | /--------|-> b003 add sp, #12 8002572: | | | bd30 pop {r4, r5, pc} if (header_size_increment == 0) { 8002574: | | /-----\-X b1a9 cbz r1, 80025a2 <pbuf_add_header_impl.lto_priv.0+0x52> if ((u16_t)(increment_magnitude + p->tot_len) < increment_magnitude) { 8002576: | | | 8903 ldrh r3, [r0, #8] 8002578: | | | fa13 f381 uxtah r3, r3, r1 increment_magnitude = (u16_t)header_size_increment; 800257c: | | | b28c uxth r4, r1 if ((u16_t)(increment_magnitude + p->tot_len) < increment_magnitude) { 800257e: | | | b29b uxth r3, r3 8002580: | | | 42a3 cmp r3, r4 8002582: +--|--|-------- d3f4 bcc.n 800256e <pbuf_add_header_impl.lto_priv.0+0x1e> if (type_internal & PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS) { 8002584: | | | f990 500c ldrsb.w r5, [r0, #12] 8002588: | | | 2d00 cmp r5, #0 800258a: | | | /----- da0c bge.n 80025a6 <pbuf_add_header_impl.lto_priv.0+0x56> payload = (u8_t *)p->payload - header_size_increment; 800258c: | | | | 6842 ldr r2, [r0, #4] 800258e: | | | | 1a51 subs r1, r2, r1 if ((u8_t *)payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) { 8002590: | | | | f100 0210 add.w r2, r0, #16 8002594: | | | | 4291 cmp r1, r2 8002596: +--|--|--|----- d3ea bcc.n 800256e <pbuf_add_header_impl.lto_priv.0+0x1e> p->len = (u16_t)(p->len + increment_magnitude); 8002598: | | | | /-> 8942 ldrh r2, [r0, #10] p->payload = payload; 800259a: | | | | | 6041 str r1, [r0, #4] p->len = (u16_t)(p->len + increment_magnitude); 800259c: | | | | | 4414 add r4, r2 800259e: | | | | | 8144 strh r4, [r0, #10] p->tot_len = (u16_t)(p->tot_len + increment_magnitude); 80025a0: | | | | | 8103 strh r3, [r0, #8] return 0; 80025a2: | | \--|--|-> 2000 movs r0, #0 80025a4: | \-----|--|-- e7e4 b.n 8002570 <pbuf_add_header_impl.lto_priv.0+0x20> if (force) { 80025a6: | \--|-> 2a00 cmp r2, #0 80025a8: \-----------|-- d0e1 beq.n 800256e <pbuf_add_header_impl.lto_priv.0+0x1e> payload = (u8_t *)p->payload - header_size_increment; 80025aa: | 6842 ldr r2, [r0, #4] 80025ac: | 1a51 subs r1, r2, r1 80025ae: \-- e7f3 b.n 8002598 <pbuf_add_header_impl.lto_priv.0+0x48> 80025b0: 20000060 .word 0x20000060 80025b4: 0800b37d .word 0x0800b37d 80025b8: 0800b387 .word 0x0800b387 80025bc: 0800b232 .word 0x0800b232 080025c0 : { 80025c0: b513 push {r0, r1, r4, lr} LWIP_ASSERT("p != NULL", p != NULL); 80025c2: /-- b978 cbnz r0, 80025e4 <pbuf_remove_header+0x24> 80025c4: | b672 cpsid i 80025c6: | 4b12 ldr r3, [pc, #72] @ (8002610 ) 80025c8: | 4a12 ldr r2, [pc, #72] @ (8002614 ) 80025ca: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80025ce: | 4b12 ldr r3, [pc, #72] @ (8002618 ) 80025d0: | 9300 str r3, [sp, #0] 80025d2: | 4812 ldr r0, [pc, #72] @ (800261c ) 80025d4: | f240 234e movw r3, #590 @ 0x24e 80025d8: | f7fe fe8e bl 80012f8 <printf_> 80025dc: | be00 bkpt 0x0000 return 1; 80025de: /--|-> 2001 movs r0, #1 } 80025e0: /-----|--|-> b002 add sp, #8 80025e2: | | | bd10 pop {r4, pc} if (header_size_decrement == 0) { 80025e4: | /--|--\-X b191 cbz r1, 800260c <pbuf_remove_header+0x4c> LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;); 80025e6: | | | 8943 ldrh r3, [r0, #10] increment_magnitude = (u16_t)header_size_decrement; 80025e8: | | | b28a uxth r2, r1 LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;); 80025ea: | | | 4293 cmp r3, r2 80025ec: | | | /-- d206 bcs.n 80025fc <pbuf_remove_header+0x3c> 80025ee: | | | | 4b08 ldr r3, [pc, #32] @ (8002610 ) 80025f0: | | | | 480b ldr r0, [pc, #44] @ (8002620 ) 80025f2: | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80025f6: | | | | f7fe fe7f bl 80012f8 <printf_> 80025fa: | | \--|-- e7f0 b.n 80025de <pbuf_remove_header+0x1e> p->len = (u16_t)(p->len - increment_magnitude); 80025fc: | | \-> 1a9b subs r3, r3, r2 p->payload = (u8_t *)p->payload + header_size_decrement; 80025fe: | | 6844 ldr r4, [r0, #4] p->len = (u16_t)(p->len - increment_magnitude); 8002600: | | 8143 strh r3, [r0, #10] p->tot_len = (u16_t)(p->tot_len - increment_magnitude); 8002602: | | 8903 ldrh r3, [r0, #8] p->payload = (u8_t *)p->payload + header_size_decrement; 8002604: | | 440c add r4, r1 p->tot_len = (u16_t)(p->tot_len - increment_magnitude); 8002606: | | 1a9b subs r3, r3, r2 p->payload = (u8_t *)p->payload + header_size_decrement; 8002608: | | 6044 str r4, [r0, #4] p->tot_len = (u16_t)(p->tot_len - increment_magnitude); 800260a: | | 8103 strh r3, [r0, #8] return 0; 800260c: | \-------> 2000 movs r0, #0 800260e: \----------- e7e7 b.n 80025e0 <pbuf_remove_header+0x20> 8002610: 20000060 .word 0x20000060 8002614: 0800b37d .word 0x0800b37d 8002618: 0800b387 .word 0x0800b387 800261c: 0800b232 .word 0x0800b232 8002620: 0800b8a9 .word 0x0800b8a9 08002624 : while (p != NULL) { 8002624: 2300 movs r3, #0 8002626: /----> 1c5a adds r2, r3, #1 8002628: | /-- b908 cbnz r0, 800262e <pbuf_clen+0xa> } 800262a: | | b298 uxth r0, r3 800262c: | | 4770 bx lr p = p->next; 800262e: | \-> 6800 ldr r0, [r0, #0] 8002630: | 4613 mov r3, r2 8002632: \----- e7f8 b.n 8002626 <pbuf_clen+0x2> 08002634 : { 8002634: b513 push {r0, r1, r4, lr} if (p != NULL) { 8002636: 4604 mov r4, r0 8002638: /-- b1a8 cbz r0, 8002666 <pbuf_ref+0x32> SYS_ARCH_SET(p->ref, (LWIP_PBUF_REF_T)(p->ref + 1)); 800263a: | f005 fdad bl 8008198 <bgrt_crit_sec_enter> 800263e: | 7ba3 ldrb r3, [r4, #14] 8002640: | 3301 adds r3, #1 8002642: | 73a3 strb r3, [r4, #14] 8002644: | f005 fdbc bl 80081c0 <bgrt_crit_sec_exit> LWIP_ASSERT("pbuf ref overflow", p->ref > 0); 8002648: | 7ba3 ldrb r3, [r4, #14] 800264a: +-- b963 cbnz r3, 8002666 <pbuf_ref+0x32> 800264c: | b672 cpsid i 800264e: | 4b07 ldr r3, [pc, #28] @ (800266c ) 8002650: | 4a07 ldr r2, [pc, #28] @ (8002670 ) 8002652: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002656: | 4b07 ldr r3, [pc, #28] @ (8002674 ) 8002658: | 9300 str r3, [sp, #0] 800265a: | 4807 ldr r0, [pc, #28] @ (8002678 ) 800265c: | f44f 7351 mov.w r3, #836 @ 0x344 8002660: | f7fe fe4a bl 80012f8 <printf_> 8002664: | be00 bkpt 0x0000 } 8002666: \-> b002 add sp, #8 8002668: bd10 pop {r4, pc} 800266a: bf00 nop 800266c: 20000060 .word 0x20000060 8002670: 0800b8cf .word 0x0800b8cf 8002674: 0800b387 .word 0x0800b387 8002678: 0800b232 .word 0x0800b232 0800267c : { 800267c: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} 800267e: 460d mov r5, r1 LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)", 8002680: 4604 mov r4, r0 8002682: /-- b100 cbz r0, 8002686 <pbuf_cat+0xa> 8002684: /--|-- b961 cbnz r1, 80026a0 <pbuf_cat+0x24> 8002686: | \-> 4b1a ldr r3, [pc, #104] @ (80026f0 ) 8002688: | 481a ldr r0, [pc, #104] @ (80026f4 ) 800268a: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc } 800268e: | b003 add sp, #12 8002690: | e8bd 40f0 ldmia.w sp!, {r4, r5, r6, r7, lr} LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)", 8002694: | f7fe be30 b.w 80012f8 <printf_> p->tot_len = (u16_t)(p->tot_len + t->tot_len); 8002698: | /-> 8929 ldrh r1, [r5, #8] 800269a: | | 440b add r3, r1 800269c: | | 8123 strh r3, [r4, #8] for (p = h; p->next != NULL; p = p->next) { 800269e: | | 4614 mov r4, r2 80026a0: \--|-> 6822 ldr r2, [r4, #0] p->tot_len = (u16_t)(p->tot_len + t->tot_len); 80026a2: | 8923 ldrh r3, [r4, #8] for (p = h; p->next != NULL; p = p->next) { 80026a4: | 2a00 cmp r2, #0 80026a6: \-- d1f7 bne.n 8002698 <pbuf_cat+0x1c> LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len); 80026a8: 8962 ldrh r2, [r4, #10] 80026aa: 429a cmp r2, r3 80026ac: /-- d019 beq.n 80026e2 <pbuf_cat+0x66> 80026ae: | b672 cpsid i 80026b0: | 4f0f ldr r7, [pc, #60] @ (80026f0 ) 80026b2: | 4e11 ldr r6, [pc, #68] @ (80026f8 ) 80026b4: | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 80026b8: | 4a10 ldr r2, [pc, #64] @ (80026fc ) 80026ba: | 9600 str r6, [sp, #0] 80026bc: | f44f 7359 mov.w r3, #868 @ 0x364 80026c0: | 480f ldr r0, [pc, #60] @ (8002700 ) 80026c2: | f7fe fe19 bl 80012f8 <printf_> 80026c6: | be00 bkpt 0x0000 LWIP_ASSERT("p->next == NULL", p->next == NULL); 80026c8: | 6823 ldr r3, [r4, #0] 80026ca: +-- b153 cbz r3, 80026e2 <pbuf_cat+0x66> 80026cc: | b672 cpsid i 80026ce: | 4a0d ldr r2, [pc, #52] @ (8002704 ) 80026d0: | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 80026d4: | 480a ldr r0, [pc, #40] @ (8002700 ) 80026d6: | 9600 str r6, [sp, #0] 80026d8: | f240 3365 movw r3, #869 @ 0x365 80026dc: | f7fe fe0c bl 80012f8 <printf_> 80026e0: | be00 bkpt 0x0000 p->tot_len = (u16_t)(p->tot_len + t->tot_len); 80026e2: \-> 892a ldrh r2, [r5, #8] 80026e4: 8923 ldrh r3, [r4, #8] p->next = t; 80026e6: 6025 str r5, [r4, #0] p->tot_len = (u16_t)(p->tot_len + t->tot_len); 80026e8: 4413 add r3, r2 80026ea: 8123 strh r3, [r4, #8] } 80026ec: b003 add sp, #12 80026ee: bdf0 pop {r4, r5, r6, r7, pc} 80026f0: 20000060 .word 0x20000060 80026f4: 0800b8e1 .word 0x0800b8e1 80026f8: 0800b387 .word 0x0800b387 80026fc: 0800b91e .word 0x0800b91e 8002700: 0800b232 .word 0x0800b232 8002704: 0800b94b .word 0x0800b94b 08002708 : { 8002708: b58f push {r0, r1, r2, r3, r7, lr} bgrt_queue_t *q = ((struct ifstate *)iface->state)->rxqueue; 800270a: 6a03 ldr r3, [r0, #32] st = bgrt_queue_swap(q, (void **)&p); 800270c: f8df 90bc ldr.w r9, [pc, #188] @ 80027cc bgrt_queue_t *q = ((struct ifstate *)iface->state)->rxqueue; 8002710: f8d3 8000 ldr.w r8, [r3] { 8002714: 4606 mov r6, r0 8002716: /----------------> 4f27 ldr r7, [pc, #156] @ (80027b4 ) 8002718: | /-------------> 2500 movs r5, #0 loop: p = pbuf_alloc(PBUF_RAW, ECM_PACKET_SIZE, PBUF_RAM); 800271a: | | /----> 2140 movs r1, #64 @ 0x40 800271c: | | | 2000 movs r0, #0 800271e: | | | f006 fdab bl 8009278 <pbuf_alloc.constprop.0> 8002722: | | | 9003 str r0, [sp, #12] LWIP_ASSERT("p != NULL", p); 8002724: | | | /-- b958 cbnz r0, 800273e <ecm_input+0x36> 8002726: | | | | b672 cpsid i 8002728: | | | | 4b23 ldr r3, [pc, #140] @ (80027b8 ) 800272a: | | | | 9300 str r3, [sp, #0] 800272c: | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 8002730: | | | | 4a22 ldr r2, [pc, #136] @ (80027bc ) 8002732: | | | | 4823 ldr r0, [pc, #140] @ (80027c0 ) 8002734: | | | | f240 1385 movw r3, #389 @ 0x185 8002738: | | | | f7fe fdde bl 80012f8 <printf_> 800273c: | | | | be00 bkpt 0x0000 st = bgrt_queue_swap(q, (void **)&p); 800273e: | | | \-> 464a mov r2, r9 8002740: | | | a903 add r1, sp, #12 8002742: | | | 4640 mov r0, r8 8002744: | | | f005 fdb0 bl 80082a8 <bgrt_queue_fetch_fn> LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 8002748: | | | /-- b158 cbz r0, 8002762 <ecm_input+0x5a> 800274a: | | | | b672 cpsid i 800274c: | | | | 4b1a ldr r3, [pc, #104] @ (80027b8 ) 800274e: | | | | 9300 str r3, [sp, #0] 8002750: | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 8002754: | | | | 4a1b ldr r2, [pc, #108] @ (80027c4 ) 8002756: | | | | 481a ldr r0, [pc, #104] @ (80027c0 ) 8002758: | | | | f44f 73c4 mov.w r3, #392 @ 0x188 800275c: | | | | f7fe fdcc bl 80012f8 <printf_> 8002760: | | | | be00 bkpt 0x0000 pbuf_cat(pp, p); 8002762: | | | \-> 9c03 ldr r4, [sp, #12] if (pp) 8002764: | | /-----|----- b305 cbz r5, 80027a8 <ecm_input+0xa0> pbuf_cat(pp, p); 8002766: | | | | 4621 mov r1, r4 8002768: | | | | 4628 mov r0, r5 800276a: | | | | f7ff ff87 bl 800267c <pbuf_cat> if (p->len == ECM_PACKET_SIZE) 800276e: | | | /--|----> 8963 ldrh r3, [r4, #10] 8002770: | | | | | 2b40 cmp r3, #64 @ 0x40 8002772: | | | | \----- d0d2 beq.n 800271a <ecm_input+0x12> */ struct pbuf * pbuf_coalesce(struct pbuf *p, pbuf_layer layer) { struct pbuf *q; if (p->next == NULL) { 8002774: | | | | 682b ldr r3, [r5, #0] 8002776: | | | | /-- b12b cbz r3, 8002784 <ecm_input+0x7c> return p; } q = pbuf_clone(layer, PBUF_RAM, p); 8002778: | | | | | 4629 mov r1, r5 800277a: | | | | | 2000 movs r0, #0 800277c: | | | | | f006 fe36 bl 80093ec <pbuf_clone.constprop.0> if (q == NULL) { 8002780: | | | | | 4604 mov r4, r0 8002782: | | | | /--|-- b998 cbnz r0, 80027ac <ecm_input+0xa4> return p; 8002784: | | | | | \-> 462c mov r4, r5 if (iface->input(p, iface) != ERR_OK) { 8002786: | | | | | /-> 68f3 ldr r3, [r6, #12] p = pbuf_coalesce(pp, PBUF_RAW); 8002788: | | | | | | 9403 str r4, [sp, #12] if (iface->input(p, iface) != ERR_OK) { 800278a: | | | | | | 4631 mov r1, r6 800278c: | | | | | | 4620 mov r0, r4 800278e: | | | | | | 4798 blx r3 8002790: | | | | | | 2800 cmp r0, #0 8002792: | \--|--|--|--|-- d0c1 beq.n 8002718 <ecm_input+0x10> 8002794: | | | | | 4b07 ldr r3, [pc, #28] @ (80027b4 ) LWIP_DEBUGF(ECM_DEBUG, ("ecmif.input\n")); 8002796: | | | | | 480c ldr r0, [pc, #48] @ (80027c8 ) 8002798: | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 800279c: | | | | | f7fe fdac bl 80012f8 <printf_> pbuf_free(p); 80027a0: | | | | | 4620 mov r0, r4 80027a2: | | | | | f007 fb0b bl 8009dbc <pbuf_free.isra.0> 80027a6: \-----|--|--|--|-- e7b6 b.n 8002716 <ecm_input+0xe> pp = p; 80027a8: \--|--|--|-> 4625 mov r5, r4 80027aa: \--|--|-- e7e0 b.n 800276e <ecm_input+0x66> /* @todo: what do we do now? */ return p; } pbuf_free(p); 80027ac: \--|-> 4628 mov r0, r5 80027ae: | f007 fb05 bl 8009dbc <pbuf_free.isra.0> return q; 80027b2: \-- e7e8 b.n 8002786 <ecm_input+0x7e> 80027b4: 20000060 .word 0x20000060 80027b8: 0800b262 .word 0x0800b262 80027bc: 0800b37d .word 0x0800b37d 80027c0: 0800b232 .word 0x0800b232 80027c4: 0800b221 .word 0x0800b221 80027c8: 0800b95b .word 0x0800b95b 80027cc: 08007dab .word 0x08007dab 080027d0 : { 80027d0: b510 push {r4, lr} LWIP_ERROR("pbuf_copy: invalid source", p_from != NULL, return ERR_ARG;); 80027d2: /-- b129 cbz r1, 80027e0 <pbuf_copy+0x10> } 80027d4: | e8bd 4010 ldmia.w sp!, {r4, lr} return pbuf_copy_partial_pbuf(p_to, p_from, p_from->tot_len, 0); 80027d8: | 890a ldrh r2, [r1, #8] 80027da: | 2300 movs r3, #0 80027dc: | f7ff b90e b.w 80019fc <pbuf_copy_partial_pbuf> 80027e0: \-> 4b04 ldr r3, [pc, #16] @ (80027f4 ) LWIP_ERROR("pbuf_copy: invalid source", p_from != NULL, return ERR_ARG;); 80027e2: 4805 ldr r0, [pc, #20] @ (80027f8 ) 80027e4: f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80027e8: f7fe fd86 bl 80012f8 <printf_> } 80027ec: f06f 000f mvn.w r0, #15 80027f0: bd10 pop {r4, pc} 80027f2: bf00 nop 80027f4: 20000060 .word 0x20000060 80027f8: 0800b970 .word 0x0800b970 080027fc : * * @param seg single tcp_seg to free */ void tcp_seg_free(struct tcp_seg *seg) { 80027fc: b510 push {r4, lr} if (seg != NULL) { 80027fe: 4604 mov r4, r0 8002800: /----- b140 cbz r0, 8002814 <tcp_seg_free+0x18> if (seg->p != NULL) { 8002802: | 6840 ldr r0, [r0, #4] 8002804: | /-- b108 cbz r0, 800280a <tcp_seg_free+0xe> pbuf_free(seg->p); 8002806: | | f007 fad9 bl 8009dbc <pbuf_free.isra.0> #if TCP_DEBUG seg->p = NULL; #endif /* TCP_DEBUG */ } memp_free(MEMP_TCP_SEG, seg); 800280a: | \-> 4621 mov r1, r4 800280c: | 2003 movs r0, #3 } } 800280e: | e8bd 4010 ldmia.w sp!, {r4, lr} memp_free(MEMP_TCP_SEG, seg); 8002812: | e619 b.n 8002448 <memp_free> } 8002814: \----> bd10 pop {r4, pc} 08002816 : { 8002816: b510 push {r4, lr} while (seg != NULL) { 8002818: /--/-X b900 cbnz r0, 800281c <tcp_segs_free+0x6> } 800281a: | | bd10 pop {r4, pc} struct tcp_seg *next = seg->next; 800281c: | \-> 6804 ldr r4, [r0, #0] tcp_seg_free(seg); 800281e: | f7ff ffed bl 80027fc <tcp_seg_free> seg = next; 8002822: | 4620 mov r0, r4 8002824: \----- e7f8 b.n 8002818 <tcp_segs_free+0x2> 08002826 : * * @param pcb tcp_pcb to purge. The pcb itself is not deallocated! */ void tcp_pcb_purge(struct tcp_pcb *pcb) { 8002826: b510 push {r4, lr} LWIP_ERROR("tcp_pcb_purge: invalid pcb", pcb != NULL, return); 8002828: 4604 mov r4, r0 800282a: /-- b938 cbnz r0, 800283c <tcp_pcb_purge+0x16> 800282c: | 4b13 ldr r3, [pc, #76] @ (800287c ) 800282e: | 4814 ldr r0, [pc, #80] @ (8002880 ) 8002830: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc pcb->unacked = pcb->unsent = NULL; #if TCP_OVERSIZE pcb->unsent_oversize = 0; #endif /* TCP_OVERSIZE */ } } 8002834: | e8bd 4010 ldmia.w sp!, {r4, lr} LWIP_ERROR("tcp_pcb_purge: invalid pcb", pcb != NULL, return); 8002838: | f7fe bd5e b.w 80012f8 <printf_> if (pcb->state != CLOSED && 800283c: \-> 7d03 ldrb r3, [r0, #20] 800283e: 2b01 cmp r3, #1 8002840: /----- d91b bls.n 800287a <tcp_pcb_purge+0x54> 8002842: | 2b0a cmp r3, #10 8002844: +----- d019 beq.n 800287a <tcp_pcb_purge+0x54> if (pcb->refused_data != NULL) { 8002846: | 6f80 ldr r0, [r0, #120] @ 0x78 8002848: | /-- b118 cbz r0, 8002852 <tcp_pcb_purge+0x2c> pbuf_free(pcb->refused_data); 800284a: | | f007 fab7 bl 8009dbc <pbuf_free.isra.0> pcb->refused_data = NULL; 800284e: | | 2300 movs r3, #0 8002850: | | 67a3 str r3, [r4, #120] @ 0x78 if (pcb->ooseq != NULL) { 8002852: | \-> 6f60 ldr r0, [r4, #116] @ 0x74 8002854: | /-- b118 cbz r0, 800285e <tcp_pcb_purge+0x38> /* Free all ooseq pbufs (and possibly reset SACK state) */ void tcp_free_ooseq(struct tcp_pcb *pcb) { if (pcb->ooseq) { tcp_segs_free(pcb->ooseq); 8002856: | | f7ff ffde bl 8002816 <tcp_segs_free> pcb->ooseq = NULL; 800285a: | | 2300 movs r3, #0 800285c: | | 6763 str r3, [r4, #116] @ 0x74 pcb->rtime = -1; 800285e: | \-> f64f 73ff movw r3, #65535 @ 0xffff 8002862: | 8623 strh r3, [r4, #48] @ 0x30 tcp_segs_free(pcb->unsent); 8002864: | 6ee0 ldr r0, [r4, #108] @ 0x6c 8002866: | f7ff ffd6 bl 8002816 <tcp_segs_free> tcp_segs_free(pcb->unacked); 800286a: | 6f20 ldr r0, [r4, #112] @ 0x70 800286c: | f7ff ffd3 bl 8002816 <tcp_segs_free> pcb->unacked = pcb->unsent = NULL; 8002870: | 2300 movs r3, #0 8002872: | e9c4 331b strd r3, r3, [r4, #108] @ 0x6c pcb->unsent_oversize = 0; 8002876: | f8a4 3068 strh.w r3, [r4, #104] @ 0x68 } 800287a: \----> bd10 pop {r4, pc} 800287c: 20000060 .word 0x20000060 8002880: 0800b992 .word 0x0800b992 08002884 : { 8002884: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} 8002886: 460c mov r4, r1 LWIP_ASSERT("tcp_oos_insert_segment: invalid cseg", cseg != NULL); 8002888: 4605 mov r5, r0 800288a: /-- b960 cbnz r0, 80028a6 <tcp_oos_insert_segment+0x22> 800288c: | b672 cpsid i 800288e: | 4b20 ldr r3, [pc, #128] @ (8002910 ) 8002890: | 4a20 ldr r2, [pc, #128] @ (8002914 ) 8002892: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002896: | 4b20 ldr r3, [pc, #128] @ (8002918 ) 8002898: | 9300 str r3, [sp, #0] 800289a: | 4820 ldr r0, [pc, #128] @ (800291c ) 800289c: | f240 432c movw r3, #1068 @ 0x42c 80028a0: | f7fe fd2a bl 80012f8 <printf_> 80028a4: | be00 bkpt 0x0000 if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) { 80028a6: \-> 692b ldr r3, [r5, #16] 80028a8: 899b ldrh r3, [r3, #12] 80028aa: ba5b rev16 r3, r3 80028ac: 07da lsls r2, r3, #31 80028ae: /-------- d417 bmi.n 80028e0 <tcp_oos_insert_segment+0x5c> TCP_SEQ_GEQ((seqno + cseg->len), 80028b0: | 4e1b ldr r6, [pc, #108] @ (8002920 ) 80028b2: /--|-------> 6927 ldr r7, [r4, #16] 80028b4: | | 892b ldrh r3, [r5, #8] 80028b6: | | f8d6 00c8 ldr.w r0, [r6, #200] @ 0xc8 80028ba: | | 6879 ldr r1, [r7, #4] 80028bc: | | f8b4 c008 ldrh.w ip, [r4, #8] 80028c0: | | 4403 add r3, r0 80028c2: | | 1a5a subs r2, r3, r1 80028c4: | | eba2 020c sub.w r2, r2, ip while (next && 80028c8: | | 2a00 cmp r2, #0 80028ca: | | /----- da10 bge.n 80028ee <tcp_oos_insert_segment+0x6a> TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) { 80028cc: | | | 1acb subs r3, r1, r3 if (next && 80028ce: | | | 2b00 cmp r3, #0 80028d0: | | | /-- da0a bge.n 80028e8 <tcp_oos_insert_segment+0x64> cseg->len = (u16_t)(next->tcphdr->seqno - seqno); 80028d2: | | | | 1a09 subs r1, r1, r0 80028d4: | | | | b289 uxth r1, r1 pbuf_realloc(cseg->p, cseg->len); 80028d6: | | | | 6868 ldr r0, [r5, #4] cseg->len = (u16_t)(next->tcphdr->seqno - seqno); 80028d8: | | | | 8129 strh r1, [r5, #8] pbuf_realloc(cseg->p, cseg->len); 80028da: | | | | f7ff f843 bl 8001964 <pbuf_realloc> 80028de: | | | +-- e003 b.n 80028e8 <tcp_oos_insert_segment+0x64> tcp_segs_free(next); 80028e0: | \--|--|-> 4620 mov r0, r4 80028e2: | | | f7ff ff98 bl 8002816 <tcp_segs_free> next = NULL; 80028e6: | /--|--|-> 2400 movs r4, #0 cseg->next = next; 80028e8: | | | \-> 602c str r4, [r5, #0] } 80028ea: | | | b003 add sp, #12 80028ec: | | | bdf0 pop {r4, r5, r6, r7, pc} if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) { 80028ee: | | \----> 89bb ldrh r3, [r7, #12] next = next->next; 80028f0: | | 6827 ldr r7, [r4, #0] 80028f2: | | ba5b rev16 r3, r3 if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) { 80028f4: | | 07db lsls r3, r3, #31 TCPH_SET_FLAG(cseg->tcphdr, TCP_FIN); 80028f6: | | bf41 itttt mi 80028f8: | | 692a ldrmi r2, [r5, #16] 80028fa: | | 8993 ldrhmi r3, [r2, #12] 80028fc: | | f443 7380 orrmi.w r3, r3, #256 @ 0x100 8002900: | | 8193 strhmi r3, [r2, #12] tcp_seg_free(old_seg); 8002902: | | 4620 mov r0, r4 8002904: | | f7ff ff7a bl 80027fc <tcp_seg_free> while (next && 8002908: | | 2f00 cmp r7, #0 800290a: | \-------- d0ec beq.n 80028e6 <tcp_oos_insert_segment+0x62> 800290c: | 463c mov r4, r7 800290e: \----------- e7d0 b.n 80028b2 <tcp_oos_insert_segment+0x2e> 8002910: 20000060 .word 0x20000060 8002914: 0800b9b5 .word 0x0800b9b5 8002918: 0800b591 .word 0x0800b591 800291c: 0800b232 .word 0x0800b232 8002920: 20001158 .word 0x20001158 08002924 : { 8002924: e92d 47f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, r9, sl, lr} 8002928: 460e mov r6, r1 800292a: f89d 8028 ldrb.w r8, [sp, #40] @ 0x28 800292e: 4617 mov r7, r2 8002930: 469a mov sl, r3 LWIP_ASSERT("tcp_create_segment: invalid pcb", pcb != NULL); 8002932: 4681 mov r9, r0 8002934: /-- b958 cbnz r0, 800294e <tcp_create_segment+0x2a> 8002936: | b672 cpsid i 8002938: | 4b35 ldr r3, [pc, #212] @ (8002a10 ) 800293a: | 4a36 ldr r2, [pc, #216] @ (8002a14 ) 800293c: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002940: | 4b35 ldr r3, [pc, #212] @ (8002a18 ) 8002942: | 9300 str r3, [sp, #0] 8002944: | 4835 ldr r0, [pc, #212] @ (8002a1c ) 8002946: | 23a6 movs r3, #166 @ 0xa6 8002948: | f7fe fcd6 bl 80012f8 <printf_> 800294c: | be00 bkpt 0x0000 LWIP_ASSERT("tcp_create_segment: invalid pbuf", p != NULL); 800294e: /--\-X b95e cbnz r6, 8002968 <tcp_create_segment+0x44> 8002950: | b672 cpsid i 8002952: | 4b2f ldr r3, [pc, #188] @ (8002a10 ) 8002954: | 4a32 ldr r2, [pc, #200] @ (8002a20 ) 8002956: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 800295a: | 4b2f ldr r3, [pc, #188] @ (8002a18 ) 800295c: | 9300 str r3, [sp, #0] 800295e: | 482f ldr r0, [pc, #188] @ (8002a1c ) 8002960: | 23a7 movs r3, #167 @ 0xa7 8002962: | f7fe fcc9 bl 80012f8 <printf_> 8002966: | be00 bkpt 0x0000 if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) { 8002968: \----> 2003 movs r0, #3 800296a: f7ff fbbf bl 80020ec <memp_malloc> optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb); 800296e: ea4f 0588 mov.w r5, r8, lsl #2 8002972: f005 0504 and.w r5, r5, #4 if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) { 8002976: 4604 mov r4, r0 8002978: /-- b938 cbnz r0, 800298a <tcp_create_segment+0x66> pbuf_free(p); 800297a: | 4630 mov r0, r6 800297c: | f007 fa1e bl 8009dbc <pbuf_free.isra.0> return NULL; 8002980: /--|-> 2400 movs r4, #0 } 8002982: /--|--|-> 4620 mov r0, r4 8002984: | | | b002 add sp, #8 8002986: | | | e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} seg->next = NULL; 800298a: | | \-> 2300 movs r3, #0 seg->flags = optflags; 800298c: | | f880 800c strb.w r8, [r0, #12] seg->p = p; 8002990: | | e9c0 3600 strd r3, r6, [r0] LWIP_ASSERT("p->tot_len >= optlen", p->tot_len >= optlen); 8002994: | | 8933 ldrh r3, [r6, #8] 8002996: | | 42ab cmp r3, r5 8002998: | | /-- d20b bcs.n 80029b2 <tcp_create_segment+0x8e> 800299a: | | | b672 cpsid i 800299c: | | | 4b1c ldr r3, [pc, #112] @ (8002a10 ) 800299e: | | | 4a21 ldr r2, [pc, #132] @ (8002a24 ) 80029a0: | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80029a4: | | | 4b1c ldr r3, [pc, #112] @ (8002a18 ) 80029a6: | | | 9300 str r3, [sp, #0] 80029a8: | | | 481c ldr r0, [pc, #112] @ (8002a1c ) 80029aa: | | | 23b3 movs r3, #179 @ 0xb3 80029ac: | | | f7fe fca4 bl 80012f8 <printf_> 80029b0: | | | be00 bkpt 0x0000 seg->len = p->tot_len - optlen; 80029b2: | | \-> 8933 ldrh r3, [r6, #8] seg->oversize_left = 0; 80029b4: | | 2200 movs r2, #0 seg->len = p->tot_len - optlen; 80029b6: | | 1b5b subs r3, r3, r5 80029b8: | | 8123 strh r3, [r4, #8] seg->oversize_left = 0; 80029ba: | | 8162 strh r2, [r4, #10] return pbuf_add_header_impl(p, header_size_increment, 0); 80029bc: | | 2114 movs r1, #20 80029be: | | 4630 mov r0, r6 80029c0: | | f7ff fdc6 bl 8002550 <pbuf_add_header_impl.lto_priv.0> if (pbuf_add_header(p, TCP_HLEN)) { 80029c4: | | 4680 mov r8, r0 80029c6: | | /-- b148 cbz r0, 80029dc <tcp_create_segment+0xb8> TCP_STATS_INC(tcp.err); 80029c8: | | | 4a17 ldr r2, [pc, #92] @ (8002a28 ) 80029ca: | | | f8b2 3050 ldrh.w r3, [r2, #80] @ 0x50 tcp_seg_free(seg); 80029ce: | | | 4620 mov r0, r4 TCP_STATS_INC(tcp.err); 80029d0: | | | 3301 adds r3, #1 80029d2: | | | f8a2 3050 strh.w r3, [r2, #80] @ 0x50 tcp_seg_free(seg); 80029d6: | | | f7ff ff11 bl 80027fc <tcp_seg_free> return NULL; 80029da: | \--|-- e7d1 b.n 8002980 <tcp_create_segment+0x5c> seg->tcphdr = (struct tcp_hdr *)seg->p->payload; 80029dc: | \-> 6863 ldr r3, [r4, #4] 80029de: | 685e ldr r6, [r3, #4] 80029e0: | f8b9 3016 ldrh.w r3, [r9, #22] 80029e4: | 6126 str r6, [r4, #16] 80029e6: | ba5b rev16 r3, r3 seg->tcphdr->src = lwip_htons(pcb->local_port); 80029e8: | 8033 strh r3, [r6, #0] 80029ea: | f8b9 3018 ldrh.w r3, [r9, #24] 80029ee: | ba5b rev16 r3, r3 seg->tcphdr->dest = lwip_htons(pcb->remote_port); 80029f0: | 8073 strh r3, [r6, #2] seg->tcphdr->seqno = lwip_htonl(seqno); 80029f2: | 4650 mov r0, sl TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), hdrflags); 80029f4: | 02ad lsls r5, r5, #10 seg->tcphdr->seqno = lwip_htonl(seqno); 80029f6: | f005 fb9d bl 8008134 <lwip_htonl> TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), hdrflags); 80029fa: | f505 45a0 add.w r5, r5, #20480 @ 0x5000 80029fe: | 432f orrs r7, r5 8002a00: | ba7f rev16 r7, r7 seg->tcphdr->seqno = lwip_htonl(seqno); 8002a02: | 6070 str r0, [r6, #4] TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), hdrflags); 8002a04: | 81b7 strh r7, [r6, #12] seg->tcphdr->urgp = 0; 8002a06: | f886 8012 strb.w r8, [r6, #18] 8002a0a: | f886 8013 strb.w r8, [r6, #19] return seg; 8002a0e: \-------- e7b8 b.n 8002982 <tcp_create_segment+0x5e> 8002a10: 20000060 .word 0x20000060 8002a14: 0800b9da .word 0x0800b9da 8002a18: 0800b5cd .word 0x0800b5cd 8002a1c: 0800b232 .word 0x0800b232 8002a20: 0800b9fa .word 0x0800b9fa 8002a24: 0800ba1b .word 0x0800ba1b 8002a28: 20001158 .word 0x20001158 08002a2c : { 8002a2c: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr} LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)", 8002a30: f011 0903 ands.w r9, r1, #3 { 8002a34: 4604 mov r4, r0 8002a36: 460e mov r6, r1 LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)", 8002a38: /-- d10c bne.n 8002a54 <tcp_enqueue_flags+0x28> 8002a3a: | b672 cpsid i 8002a3c: | 4b51 ldr r3, [pc, #324] @ (8002b84 ) 8002a3e: | 4a52 ldr r2, [pc, #328] @ (8002b88 ) 8002a40: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002a44: | 4b51 ldr r3, [pc, #324] @ (8002b8c ) 8002a46: | 9300 str r3, [sp, #0] 8002a48: | 4851 ldr r0, [pc, #324] @ (8002b90 ) 8002a4a: | f240 4313 movw r3, #1043 @ 0x413 8002a4e: | f7fe fc53 bl 80012f8 <printf_> 8002a52: | be00 bkpt 0x0000 LWIP_ASSERT("tcp_enqueue_flags: invalid pcb", pcb != NULL); 8002a54: /--\-X b964 cbnz r4, 8002a70 <tcp_enqueue_flags+0x44> 8002a56: | b672 cpsid i 8002a58: | 4b4a ldr r3, [pc, #296] @ (8002b84 ) 8002a5a: | 4a4e ldr r2, [pc, #312] @ (8002b94 ) 8002a5c: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002a60: | 4b4a ldr r3, [pc, #296] @ (8002b8c ) 8002a62: | 9300 str r3, [sp, #0] 8002a64: | 484a ldr r0, [pc, #296] @ (8002b90 ) 8002a66: | f240 4315 movw r3, #1045 @ 0x415 8002a6a: | f7fe fc45 bl 80012f8 <printf_> 8002a6e: | be00 bkpt 0x0000 if (flags & TCP_SYN) { 8002a70: \----> f3c6 0740 ubfx r7, r6, #1, #1 if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) { 8002a74: ea4f 0887 mov.w r8, r7, lsl #2 8002a78: 4641 mov r1, r8 8002a7a: 2036 movs r0, #54 @ 0x36 8002a7c: f006 fbfc bl 8009278 <pbuf_alloc.constprop.0> 8002a80: 4605 mov r5, r0 8002a82: /-- b980 cbnz r0, 8002aa6 <tcp_enqueue_flags+0x7a> tcp_set_flags(pcb, TF_NAGLEMEMERR); 8002a84: /--|-> 8b63 ldrh r3, [r4, #26] TCP_STATS_INC(tcp.memerr); 8002a86: | | 4a44 ldr r2, [pc, #272] @ (8002b98 ) tcp_set_flags(pcb, TF_NAGLEMEMERR); 8002a88: | | f043 0380 orr.w r3, r3, #128 @ 0x80 8002a8c: | | 8363 strh r3, [r4, #26] TCP_STATS_INC(tcp.memerr); 8002a8e: | | 4b42 ldr r3, [pc, #264] @ (8002b98 ) 8002a90: | | f8b3 3048 ldrh.w r3, [r3, #72] @ 0x48 8002a94: | | 3301 adds r3, #1 8002a96: | | b29b uxth r3, r3 8002a98: | | f8a2 3048 strh.w r3, [r2, #72] @ 0x48 return ERR_MEM; 8002a9c: | | f04f 30ff mov.w r0, #4294967295 @ 0xffffffff } 8002aa0: /-----|--|-> b003 add sp, #12 8002aa2: | | | e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} LWIP_ASSERT("tcp_enqueue_flags: check that first pbuf can hold optlen", 8002aa6: | | \-> 8943 ldrh r3, [r0, #10] 8002aa8: | | 4543 cmp r3, r8 8002aaa: | | /-- d20c bcs.n 8002ac6 <tcp_enqueue_flags+0x9a> 8002aac: | | | b672 cpsid i 8002aae: | | | 4b35 ldr r3, [pc, #212] @ (8002b84 ) 8002ab0: | | | 4a3a ldr r2, [pc, #232] @ (8002b9c ) 8002ab2: | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002ab6: | | | 4b35 ldr r3, [pc, #212] @ (8002b8c ) 8002ab8: | | | 9300 str r3, [sp, #0] 8002aba: | | | 4835 ldr r0, [pc, #212] @ (8002b90 ) 8002abc: | | | f240 433d movw r3, #1085 @ 0x43d 8002ac0: | | | f7fe fc1a bl 80012f8 <printf_> 8002ac4: | | | be00 bkpt 0x0000 if ((seg = tcp_create_segment(pcb, p, flags, pcb->snd_lbb, optflags)) == NULL) { 8002ac6: | | \-> 9700 str r7, [sp, #0] 8002ac8: | | 4629 mov r1, r5 8002aca: | | 6de3 ldr r3, [r4, #92] @ 0x5c 8002acc: | | 4632 mov r2, r6 8002ace: | | 4620 mov r0, r4 8002ad0: | | f7ff ff28 bl 8002924 <tcp_create_segment> 8002ad4: | | 4605 mov r5, r0 8002ad6: | | 2800 cmp r0, #0 8002ad8: | \----- d0d4 beq.n 8002a84 <tcp_enqueue_flags+0x58> LWIP_ASSERT("seg->tcphdr not aligned", ((mem_ptr_t)seg->tcphdr % LWIP_MIN(MEM_ALIGNMENT, 4)) == 0); 8002ada: | 6903 ldr r3, [r0, #16] 8002adc: | 079a lsls r2, r3, #30 8002ade: | /-- d00c beq.n 8002afa <tcp_enqueue_flags+0xce> 8002ae0: | | b672 cpsid i 8002ae2: | | 4b28 ldr r3, [pc, #160] @ (8002b84 ) 8002ae4: | | 4a2e ldr r2, [pc, #184] @ (8002ba0 ) 8002ae6: | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002aea: | | 4b28 ldr r3, [pc, #160] @ (8002b8c ) 8002aec: | | 9300 str r3, [sp, #0] 8002aee: | | 4828 ldr r0, [pc, #160] @ (8002b90 ) 8002af0: | | f240 4346 movw r3, #1094 @ 0x446 8002af4: | | f7fe fc00 bl 80012f8 <printf_> 8002af8: | | be00 bkpt 0x0000 LWIP_ASSERT("tcp_enqueue_flags: invalid segment length", seg->len == 0); 8002afa: | \-> 892b ldrh r3, [r5, #8] 8002afc: | /-- b163 cbz r3, 8002b18 <tcp_enqueue_flags+0xec> 8002afe: | | b672 cpsid i 8002b00: | | 4b20 ldr r3, [pc, #128] @ (8002b84 ) 8002b02: | | 4a28 ldr r2, [pc, #160] @ (8002ba4 ) 8002b04: | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002b08: | | 4b20 ldr r3, [pc, #128] @ (8002b8c ) 8002b0a: | | 9300 str r3, [sp, #0] 8002b0c: | | 4820 ldr r0, [pc, #128] @ (8002b90 ) 8002b0e: | | f240 4347 movw r3, #1095 @ 0x447 8002b12: | | f7fe fbf1 bl 80012f8 <printf_> 8002b16: | | be00 bkpt 0x0000 if (pcb->unsent == NULL) { 8002b18: | \-> 6ee3 ldr r3, [r4, #108] @ 0x6c 8002b1a: | 2b00 cmp r3, #0 8002b1c: | /----- d12c bne.n 8002b78 <tcp_enqueue_flags+0x14c> pcb->unsent = seg; 8002b1e: | | 66e5 str r5, [r4, #108] @ 0x6c pcb->unsent_oversize = 0; 8002b20: | /--|----> 2300 movs r3, #0 8002b22: | | | f8a4 3068 strh.w r3, [r4, #104] @ 0x68 if ((flags & TCP_SYN) || (flags & TCP_FIN)) { 8002b26: | | | f1b9 0f00 cmp.w r9, #0 8002b2a: | | | /-- d008 beq.n 8002b3e <tcp_enqueue_flags+0x112> pcb->snd_lbb++; 8002b2c: | | | | 6de3 ldr r3, [r4, #92] @ 0x5c 8002b2e: | | | | 3301 adds r3, #1 8002b30: | | | | 65e3 str r3, [r4, #92] @ 0x5c if (flags & TCP_FIN) { 8002b32: | | | | 07f3 lsls r3, r6, #31 tcp_set_flags(pcb, TF_FIN); 8002b34: | | | | bf42 ittt mi 8002b36: | | | | 8b63 ldrhmi r3, [r4, #26] 8002b38: | | | | f043 0320 orrmi.w r3, r3, #32 8002b3c: | | | | 8363 strhmi r3, [r4, #26] pcb->snd_queuelen += pbuf_clen(seg->p); 8002b3e: | | | \-> 6868 ldr r0, [r5, #4] 8002b40: | | | f7ff fd70 bl 8002624 <pbuf_clen> 8002b44: | | | f8b4 3066 ldrh.w r3, [r4, #102] @ 0x66 8002b48: | | | 4418 add r0, r3 8002b4a: | | | b280 uxth r0, r0 8002b4c: | | | f8a4 0066 strh.w r0, [r4, #102] @ 0x66 if (pcb->snd_queuelen != 0) { 8002b50: | | | /-- b180 cbz r0, 8002b74 <tcp_enqueue_flags+0x148> LWIP_ASSERT("tcp_enqueue_flags: invalid queue length", 8002b52: | | | | 6f23 ldr r3, [r4, #112] @ 0x70 8002b54: | | | +-- b973 cbnz r3, 8002b74 <tcp_enqueue_flags+0x148> 8002b56: | | | | 6ee3 ldr r3, [r4, #108] @ 0x6c 8002b58: | | | +-- b963 cbnz r3, 8002b74 <tcp_enqueue_flags+0x148> 8002b5a: | | | | b672 cpsid i 8002b5c: | | | | 4b09 ldr r3, [pc, #36] @ (8002b84 ) 8002b5e: | | | | 4a12 ldr r2, [pc, #72] @ (8002ba8 ) 8002b60: | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002b64: | | | | 4b09 ldr r3, [pc, #36] @ (8002b8c ) 8002b66: | | | | 9300 str r3, [sp, #0] 8002b68: | | | | 4809 ldr r0, [pc, #36] @ (8002b90 ) 8002b6a: | | | | f240 4369 movw r3, #1129 @ 0x469 8002b6e: | | | | f7fe fbc3 bl 80012f8 <printf_> 8002b72: | | | | be00 bkpt 0x0000 return ERR_OK; 8002b74: | | | \-> 2000 movs r0, #0 8002b76: \--|--|----- e793 b.n 8002aa0 <tcp_enqueue_flags+0x74> for (useg = pcb->unsent; useg->next != NULL; useg = useg->next); 8002b78: | >----> 461a mov r2, r3 8002b7a: | | 681b ldr r3, [r3, #0] 8002b7c: | | 2b00 cmp r3, #0 8002b7e: | \----- d1fb bne.n 8002b78 <tcp_enqueue_flags+0x14c> useg->next = seg; 8002b80: | 6015 str r5, [r2, #0] 8002b82: \-------- e7cd b.n 8002b20 <tcp_enqueue_flags+0xf4> 8002b84: 20000060 .word 0x20000060 8002b88: 0800ba30 .word 0x0800ba30 8002b8c: 0800b5cd .word 0x0800b5cd 8002b90: 0800b232 .word 0x0800b232 8002b94: 0800ba85 .word 0x0800ba85 8002b98: 20001158 .word 0x20001158 8002b9c: 0800baa4 .word 0x0800baa4 8002ba0: 0800badd .word 0x0800badd 8002ba4: 0800baf5 .word 0x0800baf5 8002ba8: 0800bb1f .word 0x0800bb1f 08002bac : { 8002bac: b513 push {r0, r1, r4, lr} LWIP_ASSERT("tcp_send_fin: invalid pcb", pcb != NULL); 8002bae: 4604 mov r4, r0 8002bb0: /-- b960 cbnz r0, 8002bcc <tcp_send_fin+0x20> 8002bb2: | b672 cpsid i 8002bb4: | 4b13 ldr r3, [pc, #76] @ (8002c04 ) 8002bb6: | 4a14 ldr r2, [pc, #80] @ (8002c08 ) 8002bb8: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002bbc: | 4b13 ldr r3, [pc, #76] @ (8002c0c ) 8002bbe: | 9300 str r3, [sp, #0] 8002bc0: | 4813 ldr r0, [pc, #76] @ (8002c10 ) 8002bc2: | f240 33ef movw r3, #1007 @ 0x3ef 8002bc6: | f7fe fb97 bl 80012f8 <printf_> 8002bca: | be00 bkpt 0x0000 if (pcb->unsent != NULL) { 8002bcc: \-> 6ee0 ldr r0, [r4, #108] @ 0x6c 8002bce: /----- b148 cbz r0, 8002be4 <tcp_send_fin+0x38> for (last_unsent = pcb->unsent; last_unsent->next != NULL; 8002bd0: | /-> 4603 mov r3, r0 8002bd2: | | 6800 ldr r0, [r0, #0] 8002bd4: | | 2800 cmp r0, #0 8002bd6: | \-- d1fb bne.n 8002bd0 <tcp_send_fin+0x24> if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) { 8002bd8: | 6919 ldr r1, [r3, #16] 8002bda: | 898b ldrh r3, [r1, #12] 8002bdc: | b29a uxth r2, r3 8002bde: | ba5b rev16 r3, r3 8002be0: | 075b lsls r3, r3, #29 8002be2: | /-- d005 beq.n 8002bf0 <tcp_send_fin+0x44> return tcp_enqueue_flags(pcb, TCP_FIN); 8002be4: \--|-> 2101 movs r1, #1 8002be6: | 4620 mov r0, r4 } 8002be8: | b002 add sp, #8 8002bea: | e8bd 4010 ldmia.w sp!, {r4, lr} return tcp_enqueue_flags(pcb, TCP_FIN); 8002bee: | e71d b.n 8002a2c <tcp_enqueue_flags> TCPH_SET_FLAG(last_unsent->tcphdr, TCP_FIN); 8002bf0: \-> f442 7380 orr.w r3, r2, #256 @ 0x100 8002bf4: 818b strh r3, [r1, #12] tcp_set_flags(pcb, TF_FIN); 8002bf6: 8b63 ldrh r3, [r4, #26] 8002bf8: f043 0320 orr.w r3, r3, #32 8002bfc: 8363 strh r3, [r4, #26] } 8002bfe: b002 add sp, #8 8002c00: bd10 pop {r4, pc} 8002c02: bf00 nop 8002c04: 20000060 .word 0x20000060 8002c08: 0800bb47 .word 0x0800bb47 8002c0c: 0800b5cd .word 0x0800b5cd 8002c10: 0800b232 .word 0x0800b232 08002c14 : */ static err_t tcp_output_control_segment_netif(const struct tcp_pcb *pcb, struct pbuf *p, const ip_addr_t *src, const ip_addr_t *dst, struct netif *netif) { 8002c14: e92d 47ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, lr} 8002c18: f8dd 8030 ldr.w r8, [sp, #48] @ 0x30 8002c1c: 4604 mov r4, r0 8002c1e: 460d mov r5, r1 8002c20: 4616 mov r6, r2 8002c22: 461f mov r7, r3 err_t err; u8_t ttl, tos; LWIP_ASSERT("tcp_output_control_segment_netif: no netif given", netif != NULL); 8002c24: f1b8 0f00 cmp.w r8, #0 8002c28: /-- d10c bne.n 8002c44 <tcp_output_control_segment_netif.lto_priv.0+0x30> 8002c2a: | b672 cpsid i 8002c2c: | 4b1c ldr r3, [pc, #112] @ (8002ca0 ) 8002c2e: | 4a1d ldr r2, [pc, #116] @ (8002ca4 ) 8002c30: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002c34: | 4b1c ldr r3, [pc, #112] @ (8002ca8 ) 8002c36: | 9300 str r3, [sp, #0] 8002c38: | 481c ldr r0, [pc, #112] @ (8002cac ) 8002c3a: | f240 73a1 movw r3, #1953 @ 0x7a1 8002c3e: | f7fe fb5b bl 80012f8 <printf_> 8002c42: | be00 bkpt 0x0000 #if CHECKSUM_GEN_TCP IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) { struct tcp_hdr *tcphdr = (struct tcp_hdr *)p->payload; 8002c44: \-> f8d6 9000 ldr.w r9, [r6] #if LWIP_IPV4 && LWIP_IPV6 else #endif /* LWIP_IPV4 && LWIP_IPV6 */ #if LWIP_IPV4 { return inet_chksum_pseudo(p, proto, proto_len, ip_2_ip4(src), ip_2_ip4(dest)); 8002c48: 683b ldr r3, [r7, #0] 8002c4a: f8d5 a004 ldr.w sl, [r5, #4] 8002c4e: 9300 str r3, [sp, #0] 8002c50: 892a ldrh r2, [r5, #8] 8002c52: 464b mov r3, r9 8002c54: 2106 movs r1, #6 8002c56: 4628 mov r0, r5 8002c58: f006 fe36 bl 80098c8 <inet_chksum_pseudo.isra.0> tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len, 8002c5c: f8aa 0010 strh.w r0, [sl, #16] src, dst); } #endif if (pcb != NULL) { 8002c60: /----- b1dc cbz r4, 8002c9a <tcp_output_control_segment_netif.lto_priv.0+0x86> NETIF_SET_HINTS(netif, LWIP_CONST_CAST(struct netif_hint*, &(pcb->netif_hints))); ttl = pcb->ttl; 8002c62: | 7ae3 ldrb r3, [r4, #11] tos = pcb->tos; 8002c64: | 7aa4 ldrb r4, [r4, #10] } else { /* Send output with hardcoded TTL/HL since we have no access to the pcb */ ttl = TCP_TTL; tos = 0; } TCP_STATS_INC(tcp.xmit); 8002c66: | /-> 4912 ldr r1, [pc, #72] @ (8002cb0 ) 8002c68: | | 8f8a ldrh r2, [r1, #60] @ 0x3c 8002c6a: | | 3201 adds r2, #1 8002c6c: | | 878a strh r2, [r1, #60] @ 0x3c #if IP_OPTIONS_SEND return ip4_output_if_opt_src(p, src_used, dest, ttl, tos, proto, netif, ip_options, optlen); #else /* IP_OPTIONS_SEND */ return ip4_output_if_src(p, src_used, dest, ttl, tos, proto, netif); 8002c6e: | | 2206 movs r2, #6 8002c70: | | e9cd 4200 strd r4, r2, [sp] 8002c74: | | f1b9 0f00 cmp.w r9, #0 8002c78: | | bf14 ite ne 8002c7a: | | 4631 movne r1, r6 8002c7c: | | 4641 moveq r1, r8 8002c7e: | | 463a mov r2, r7 8002c80: | | f8cd 8008 str.w r8, [sp, #8] 8002c84: | | 4628 mov r0, r5 8002c86: | | f007 f957 bl 8009f38 <ip4_output_if_src> 8002c8a: | | 4604 mov r4, r0 err = ip_output_if(p, src, dst, ttl, tos, IP_PROTO_TCP, netif); NETIF_RESET_HINTS(netif); pbuf_free(p); 8002c8c: | | 4628 mov r0, r5 8002c8e: | | f007 f895 bl 8009dbc <pbuf_free.isra.0> return err; } 8002c92: | | 4620 mov r0, r4 8002c94: | | b004 add sp, #16 8002c96: | | e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} ttl = TCP_TTL; 8002c9a: \--|-> 23ff movs r3, #255 @ 0xff 8002c9c: \-- e7e3 b.n 8002c66 <tcp_output_control_segment_netif.lto_priv.0+0x52> 8002c9e: bf00 nop 8002ca0: 20000060 .word 0x20000060 8002ca4: 0800bb61 .word 0x0800bb61 8002ca8: 0800b5cd .word 0x0800b5cd 8002cac: 0800b232 .word 0x0800b232 8002cb0: 20001158 .word 0x20001158 08002cb4 : { 8002cb4: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} 8002cb6: 4605 mov r5, r0 8002cb8: 4617 mov r7, r2 8002cba: 461e mov r6, r3 LWIP_ASSERT("tcp_output_control_segment: invalid pbuf", p != NULL); 8002cbc: 460c mov r4, r1 8002cbe: /-- b961 cbnz r1, 8002cda <tcp_output_control_segment+0x26> 8002cc0: | b672 cpsid i 8002cc2: | 4b10 ldr r3, [pc, #64] @ (8002d04 ) 8002cc4: | 4a10 ldr r2, [pc, #64] @ (8002d08 ) 8002cc6: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002cca: | 4b10 ldr r3, [pc, #64] @ (8002d0c ) 8002ccc: | 9300 str r3, [sp, #0] 8002cce: | 4810 ldr r0, [pc, #64] @ (8002d10 ) 8002cd0: | f240 738a movw r3, #1930 @ 0x78a 8002cd4: | f7fe fb10 bl 80012f8 <printf_> 8002cd8: | be00 bkpt 0x0000 netif = tcp_route(pcb, src, dst); 8002cda: \-> 4631 mov r1, r6 8002cdc: 4628 mov r0, r5 8002cde: f006 ffed bl 8009cbc <tcp_route.isra.0> if (netif == NULL) { 8002ce2: /-- b930 cbnz r0, 8002cf2 <tcp_output_control_segment+0x3e> pbuf_free(p); 8002ce4: | 4620 mov r0, r4 8002ce6: | f007 f869 bl 8009dbc <pbuf_free.isra.0> return ERR_RTE; 8002cea: | f06f 0003 mvn.w r0, #3 } 8002cee: /--|-> b003 add sp, #12 8002cf0: | | bdf0 pop {r4, r5, r6, r7, pc} return tcp_output_control_segment_netif(pcb, p, src, dst, netif); 8002cf2: | \-> 9000 str r0, [sp, #0] 8002cf4: | 4633 mov r3, r6 8002cf6: | 463a mov r2, r7 8002cf8: | 4621 mov r1, r4 8002cfa: | 4628 mov r0, r5 8002cfc: | f7ff ff8a bl 8002c14 <tcp_output_control_segment_netif.lto_priv.0> 8002d00: \----- e7f5 b.n 8002cee <tcp_output_control_segment+0x3a> 8002d02: bf00 nop 8002d04: 20000060 .word 0x20000060 8002d08: 0800bb92 .word 0x0800bb92 8002d0c: 0800b5cd .word 0x0800b5cd 8002d10: 0800b232 .word 0x0800b232 08002d14 : */ void tcp_rst(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno, const ip_addr_t *local_ip, const ip_addr_t *remote_ip, u16_t local_port, u16_t remote_port) { 8002d14: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} 8002d18: 4605 mov r5, r0 8002d1a: b085 sub sp, #20 p = tcp_output_alloc_header_common(ackno, optlen, 0, lwip_htonl(seqno), local_port, 8002d1c: 4608 mov r0, r1 { 8002d1e: 4614 mov r4, r2 8002d20: 461e mov r6, r3 p = tcp_output_alloc_header_common(ackno, optlen, 0, lwip_htonl(seqno), local_port, 8002d22: f005 fa07 bl 8008134 <lwip_htonl> { 8002d26: f8bd 8034 ldrh.w r8, [sp, #52] @ 0x34 8002d2a: f8bd 9038 ldrh.w r9, [sp, #56] @ 0x38 p = tcp_output_alloc_header_common(ackno, optlen, 0, lwip_htonl(seqno), local_port, 8002d2e: f8cd 9000 str.w r9, [sp] 8002d32: 2314 movs r3, #20 8002d34: f246 0108 movw r1, #24584 @ 0x6008 8002d38: e9cd 3101 strd r3, r1, [sp, #4] 8002d3c: 4602 mov r2, r0 8002d3e: 4643 mov r3, r8 8002d40: 4620 mov r0, r4 8002d42: 2100 movs r1, #0 { 8002d44: 9f0c ldr r7, [sp, #48] @ 0x30 p = tcp_output_alloc_header_common(ackno, optlen, 0, lwip_htonl(seqno), local_port, 8002d46: f006 fabb bl 80092c0 <tcp_output_alloc_header_common.constprop.0> 8002d4a: 4604 mov r4, r0 if (p == NULL) { 8002d4c: /-- b148 cbz r0, 8002d62 <tcp_rst+0x4e> tcp_output_fill_options(pcb, p, 0, 0); 8002d4e: | f006 f949 bl 8008fe4 <tcp_output_fill_options.constprop.0> struct pbuf *p; p = tcp_rst_common(pcb, seqno, ackno, local_ip, remote_ip, local_port, remote_port); if (p != NULL) { tcp_output_control_segment(pcb, p, local_ip, remote_ip); 8002d52: | 463b mov r3, r7 8002d54: | 4632 mov r2, r6 8002d56: | 4621 mov r1, r4 8002d58: | 4628 mov r0, r5 } } 8002d5a: | b005 add sp, #20 8002d5c: | e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr} tcp_output_control_segment(pcb, p, local_ip, remote_ip); 8002d60: | e7a8 b.n 8002cb4 <tcp_output_control_segment> } 8002d62: \-> b005 add sp, #20 8002d64: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} 08002d68 : * * @param pcb Protocol control block for the TCP connection to send the ACK */ err_t tcp_send_empty_ack(struct tcp_pcb *pcb) { 8002d68: b537 push {r0, r1, r2, r4, r5, lr} err_t err; struct pbuf *p; u8_t optlen, optflags = 0; u8_t num_sacks = 0; LWIP_ASSERT("tcp_send_empty_ack: invalid pcb", pcb != NULL); 8002d6a: 4604 mov r4, r0 8002d6c: /-- b960 cbnz r0, 8002d88 <tcp_send_empty_ack+0x20> 8002d6e: | b672 cpsid i 8002d70: | 4b17 ldr r3, [pc, #92] @ (8002dd0 ) 8002d72: | 4a18 ldr r2, [pc, #96] @ (8002dd4 ) 8002d74: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002d78: | 4b17 ldr r3, [pc, #92] @ (8002dd8 ) 8002d7a: | 9300 str r3, [sp, #0] 8002d7c: | 4817 ldr r0, [pc, #92] @ (8002ddc ) 8002d7e: | f640 032d movw r3, #2093 @ 0x82d 8002d82: | f7fe fab9 bl 80012f8 <printf_> 8002d86: | be00 bkpt 0x0000 if ((num_sacks = tcp_get_num_sacks(pcb, optlen)) > 0) { optlen += 4 + num_sacks * 8; /* 4 bytes for header (including 2*NOP), plus 8B for each SACK */ } #endif p = tcp_output_alloc_header(pcb, optlen, 0, lwip_htonl(pcb->snd_nxt)); 8002d88: \-> 6d20 ldr r0, [r4, #80] @ 0x50 8002d8a: f005 f9d3 bl 8008134 <lwip_htonl> 8002d8e: 2100 movs r1, #0 8002d90: 4602 mov r2, r0 8002d92: 4620 mov r0, r4 8002d94: f006 fafc bl 8009390 <tcp_output_alloc_header.constprop.0> if (p == NULL) { 8002d98: 4605 mov r5, r0 8002d9a: /-- b938 cbnz r0, 8002dac <tcp_send_empty_ack+0x44> /* let tcp_fasttmr retry sending this ACK */ tcp_set_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW); 8002d9c: | 8b63 ldrh r3, [r4, #26] LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n")); return ERR_BUF; 8002d9e: | f06f 0001 mvn.w r0, #1 tcp_set_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW); 8002da2: | f043 0303 orr.w r3, r3, #3 8002da6: /-----|-> 8363 strh r3, [r4, #26] /* remove ACK flags from the PCB, as we sent an empty ACK now */ tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW); } return err; } 8002da8: | | b003 add sp, #12 8002daa: | | bd30 pop {r4, r5, pc} tcp_output_fill_options(pcb, p, optflags, num_sacks); 8002dac: | \-> f006 f91a bl 8008fe4 <tcp_output_fill_options.constprop.0> err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip); 8002db0: | 1d23 adds r3, r4, #4 8002db2: | 4622 mov r2, r4 8002db4: | 4629 mov r1, r5 8002db6: | 4620 mov r0, r4 8002db8: | f7ff ff7c bl 8002cb4 <tcp_output_control_segment> if (err != ERR_OK) { 8002dbc: | 8b63 ldrh r3, [r4, #26] 8002dbe: | /----- b118 cbz r0, 8002dc8 <tcp_send_empty_ack+0x60> tcp_set_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW); 8002dc0: | | f043 0303 orr.w r3, r3, #3 tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW); 8002dc4: | | /-> b29b uxth r3, r3 8002dc6: \--|--|-- e7ee b.n 8002da6 <tcp_send_empty_ack+0x3e> 8002dc8: \--|-> f023 0303 bic.w r3, r3, #3 8002dcc: \-- e7fa b.n 8002dc4 <tcp_send_empty_ack+0x5c> 8002dce: bf00 nop 8002dd0: 20000060 .word 0x20000060 8002dd4: 0800bbbb .word 0x0800bbbb 8002dd8: 0800b5cd .word 0x0800b5cd 8002ddc: 0800b232 .word 0x0800b232 08002de0 : { 8002de0: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr} LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED); 8002de4: 7d03 ldrb r3, [r0, #20] 8002de6: 2b03 cmp r3, #3 { 8002de8: 4604 mov r4, r0 LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED); 8002dea: /-- d80c bhi.n 8002e06 <tcp_receive+0x26> 8002dec: | b672 cpsid i 8002dee: | 4b44 ldr r3, [pc, #272] @ (8002f00 ) 8002df0: | 4a44 ldr r2, [pc, #272] @ (8002f04 ) 8002df2: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002df6: | 4b44 ldr r3, [pc, #272] @ (8002f08 ) 8002df8: | 9300 str r3, [sp, #0] 8002dfa: | 4844 ldr r0, [pc, #272] @ (8002f0c ) 8002dfc: | f44f 6391 mov.w r3, #1160 @ 0x488 8002e00: | f7fe fa7a bl 80012f8 <printf_> 8002e04: | be00 bkpt 0x0000 if (TCP_SEQ_LT(pcb->snd_wl1, seqno) || 8002e06: \-> 4d42 ldr r5, [pc, #264] @ (8002f10 ) if (flags & TCP_ACK) { 8002e08: f895 30cc ldrb.w r3, [r5, #204] @ 0xcc if (TCP_SEQ_LT(pcb->snd_wl1, seqno) || 8002e0c: f8d5 20c8 ldr.w r2, [r5, #200] @ 0xc8 if (flags & TCP_ACK) { 8002e10: 06df lsls r7, r3, #27 8002e12: /-------- f140 80a9 bpl.w 8002f68 <tcp_receive+0x188> if (TCP_SEQ_LT(pcb->snd_wl1, seqno) || 8002e16: | e9d4 6015 ldrd r6, r0, [r4, #84] @ 0x54 8002e1a: | 1ab7 subs r7, r6, r2 8002e1c: | 2f00 cmp r7, #0 right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2; 8002e1e: | f8b4 1060 ldrh.w r1, [r4, #96] @ 0x60 (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) || 8002e22: | f8d5 30d0 ldr.w r3, [r5, #208] @ 0xd0 if (TCP_SEQ_LT(pcb->snd_wl1, seqno) || 8002e26: | /----- db0c blt.n 8002e42 <tcp_receive+0x62> 8002e28: | | 4296 cmp r6, r2 8002e2a: | | /-- d102 bne.n 8002e32 <tcp_receive+0x52> (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) || 8002e2c: | | | 1ac6 subs r6, r0, r3 8002e2e: | | | 2e00 cmp r6, #0 8002e30: | +--|-- db07 blt.n 8002e42 <tcp_receive+0x62> 8002e32: | | \-> 4298 cmp r0, r3 8002e34: | | /-- d114 bne.n 8002e60 <tcp_receive+0x80> (pcb->snd_wl2 == ackno && (u32_t)SND_WND_SCALE(pcb, tcphdr->wnd) > pcb->snd_wnd)) { 8002e36: | | | 4e32 ldr r6, [pc, #200] @ (8002f00 ) 8002e38: | | | f8d6 6134 ldr.w r6, [r6, #308] @ 0x134 8002e3c: | | | 89f6 ldrh r6, [r6, #14] 8002e3e: | | | 428e cmp r6, r1 8002e40: | | +-- d90e bls.n 8002e60 <tcp_receive+0x80> pcb->snd_wnd = SND_WND_SCALE(pcb, tcphdr->wnd); 8002e42: | \--|-> 4e2f ldr r6, [pc, #188] @ (8002f00 ) if (pcb->snd_wnd_max < pcb->snd_wnd) { 8002e44: | | f8b4 c062 ldrh.w ip, [r4, #98] @ 0x62 pcb->snd_wnd = SND_WND_SCALE(pcb, tcphdr->wnd); 8002e48: | | f8d6 6134 ldr.w r6, [r6, #308] @ 0x134 8002e4c: | | 89f6 ldrh r6, [r6, #14] 8002e4e: | | f8a4 6060 strh.w r6, [r4, #96] @ 0x60 8002e52: | | b2b7 uxth r7, r6 pcb->snd_wl2 = ackno; 8002e54: | | e9c4 2315 strd r2, r3, [r4, #84] @ 0x54 if (pcb->snd_wnd_max < pcb->snd_wnd) { 8002e58: | | 45bc cmp ip, r7 pcb->snd_wnd_max = pcb->snd_wnd; 8002e5a: | | bf38 it cc 8002e5c: | | f8a4 6062 strhcc.w r6, [r4, #98] @ 0x62 if (TCP_SEQ_LEQ(ackno, pcb->lastack)) { 8002e60: | \-> 6c62 ldr r2, [r4, #68] @ 0x44 8002e62: | 1ad6 subs r6, r2, r3 8002e64: | 2e00 cmp r6, #0 8002e66: /--|-------- f2c0 8197 blt.w 8003198 <tcp_receive+0x3b8> if (tcplen == 0) { 8002e6a: | | f8b5 60d4 ldrh.w r6, [r5, #212] @ 0xd4 8002e6e: | | 2e00 cmp r6, #0 8002e70: /-----------------------------------------|--|-------- d151 bne.n 8002f16 <tcp_receive+0x136> right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2; 8002e72: | | | 4401 add r1, r0 if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge) { 8002e74: | | | 6da6 ldr r6, [r4, #88] @ 0x58 8002e76: | | | f8b4 0060 ldrh.w r0, [r4, #96] @ 0x60 8002e7a: | | | 4430 add r0, r6 8002e7c: | | | 4281 cmp r1, r0 8002e7e: +-----------------------------------------|--|-------- d14a bne.n 8002f16 <tcp_receive+0x136> if (pcb->rtime >= 0) { 8002e80: | | | f9b4 1030 ldrsh.w r1, [r4, #48] @ 0x30 8002e84: | | | 2900 cmp r1, #0 8002e86: +-----------------------------------------|--|-------- db46 blt.n 8002f16 <tcp_receive+0x136> if (pcb->lastack == ackno) { 8002e88: | | | 429a cmp r2, r3 8002e8a: +-----------------------------------------|--|-------- d144 bne.n 8002f16 <tcp_receive+0x136> if ((u8_t)(pcb->dupacks + 1) > pcb->dupacks) { 8002e8c: | | | f894 3043 ldrb.w r3, [r4, #67] @ 0x43 8002e90: | | | 2bff cmp r3, #255 @ 0xff ++pcb->dupacks; 8002e92: | | | bf1c itt ne 8002e94: | | | 3301 addne r3, #1 8002e96: | | | f884 3043 strbne.w r3, [r4, #67] @ 0x43 if (pcb->dupacks > 3) { 8002e9a: | | | f894 3043 ldrb.w r3, [r4, #67] @ 0x43 8002e9e: | | | 2b03 cmp r3, #3 8002ea0: | | | /----- d938 bls.n 8002f14 <tcp_receive+0x134> TCP_WND_INC(pcb->cwnd, pcb->mss); 8002ea2: | | | | f8b4 2048 ldrh.w r2, [r4, #72] @ 0x48 8002ea6: | | | | 8e63 ldrh r3, [r4, #50] @ 0x32 8002ea8: | | | | 4413 add r3, r2 8002eaa: | | | | b29b uxth r3, r3 8002eac: | | | | 429a cmp r2, r3 8002eae: | | | | bf88 it hi 8002eb0: | | | | f64f 73ff movwhi r3, #65535 @ 0xffff 8002eb4: | | | | f8a4 3048 strh.w r3, [r4, #72] @ 0x48 if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) { 8002eb8: | | | | /-> 6f23 ldr r3, [r4, #112] @ 0x70 8002eba: +-----------------------------------------|--|--|--|-- b363 cbz r3, 8002f16 <tcp_receive+0x136> 8002ebc: | | | | | 8b63 ldrh r3, [r4, #26] 8002ebe: | | | | | 075e lsls r6, r3, #29 8002ec0: +-----------------------------------------|--|--|--|-- d429 bmi.n 8002f16 <tcp_receive+0x136> if (tcp_rexmit(pcb) == ERR_OK) { 8002ec2: | | | | | 4620 mov r0, r4 8002ec4: | | | | | f7fe ffe4 bl 8001e90 <tcp_rexmit> 8002ec8: +-----------------------------------------|--|--|--|-- bb28 cbnz r0, 8002f16 <tcp_receive+0x136> pcb->ssthresh = LWIP_MIN(pcb->cwnd, pcb->snd_wnd) / 2; 8002eca: | | | | | f8b4 1060 ldrh.w r1, [r4, #96] @ 0x60 8002ece: | | | | | f8b4 3048 ldrh.w r3, [r4, #72] @ 0x48 pcb->rtime = 0; 8002ed2: | | | | | 8620 strh r0, [r4, #48] @ 0x30 pcb->ssthresh = LWIP_MIN(pcb->cwnd, pcb->snd_wnd) / 2; 8002ed4: | | | | | 4299 cmp r1, r3 8002ed6: | | | | | bf28 it cs 8002ed8: | | | | | 4619 movcs r1, r3 if (pcb->ssthresh < (2U * pcb->mss)) { 8002eda: | | | | | 8e63 ldrh r3, [r4, #50] @ 0x32 8002edc: | | | | | 005e lsls r6, r3, #1 pcb->ssthresh = 2 * pcb->mss; 8002ede: | | | | | ebb6 0f51 cmp.w r6, r1, lsr #1 pcb->ssthresh = LWIP_MIN(pcb->cwnd, pcb->snd_wnd) / 2; 8002ee2: | | | | | ea4f 0261 mov.w r2, r1, asr #1 pcb->cwnd = pcb->ssthresh + 3 * pcb->mss; 8002ee6: | | | | | 4433 add r3, r6 pcb->ssthresh = 2 * pcb->mss; 8002ee8: | | | | | bf88 it hi 8002eea: | | | | | 4632 movhi r2, r6 pcb->cwnd = pcb->ssthresh + 3 * pcb->mss; 8002eec: | | | | | 4413 add r3, r2 8002eee: | | | | | f8a4 3048 strh.w r3, [r4, #72] @ 0x48 tcp_set_flags(pcb, TF_INFR); 8002ef2: | | | | | 8b63 ldrh r3, [r4, #26] pcb->ssthresh = 2 * pcb->mss; 8002ef4: | | | | | f8a4 204a strh.w r2, [r4, #74] @ 0x4a tcp_set_flags(pcb, TF_INFR); 8002ef8: | | | | | f043 0304 orr.w r3, r3, #4 8002efc: | | | | | 8363 strh r3, [r4, #26] pcb->rtime = 0; 8002efe: +-----------------------------------------|--|--|--|-- e00a b.n 8002f16 <tcp_receive+0x136> 8002f00: | | | | | 20000060 .word 0x20000060 8002f04: | | | | | 0800bbdb .word 0x0800bbdb 8002f08: | | | | | 0800b591 .word 0x0800b591 8002f0c: | | | | | 0800b232 .word 0x0800b232 8002f10: | | | | | 20001158 .word 0x20001158 if (pcb->dupacks >= 3) { 8002f14: | | | \--\-X d0d0 beq.n 8002eb8 <tcp_receive+0xd8> if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) { 8002f16: >-----------------------------------------|--|-------> 6b63 ldr r3, [r4, #52] @ 0x34 8002f18: | | +-------- b333 cbz r3, 8002f68 <tcp_receive+0x188> 8002f1a: | | | 6ba2 ldr r2, [r4, #56] @ 0x38 8002f1c: | | | f8d5 10d0 ldr.w r1, [r5, #208] @ 0xd0 8002f20: | | | 1a52 subs r2, r2, r1 8002f22: | | | 2a00 cmp r2, #0 8002f24: | | +-------- da20 bge.n 8002f68 <tcp_receive+0x188> m = (s16_t)(m - (pcb->sa >> 3)); 8002f26: | | | f9b4 703c ldrsh.w r7, [r4, #60] @ 0x3c m = (s16_t)(tcp_ticks - pcb->rttest); 8002f2a: | | | f8b5 60d8 ldrh.w r6, [r5, #216] @ 0xd8 8002f2e: | | | b29b uxth r3, r3 m = (s16_t)(m - (pcb->sa >> 3)); 8002f30: | | | f3c7 01cf ubfx r1, r7, #3, #16 m = (s16_t)(tcp_ticks - pcb->rttest); 8002f34: | | | 1af2 subs r2, r6, r3 m = (s16_t)(m - (pcb->sa >> 3)); 8002f36: | | | 1a52 subs r2, r2, r1 8002f38: | | | b210 sxth r0, r2 if (m < 0) { 8002f3a: | | | 2800 cmp r0, #0 m = (s16_t) - m; 8002f3c: | | | bfbc itt lt 8002f3e: | | | 1b9b sublt r3, r3, r6 8002f40: | | | 18c9 addlt r1, r1, r3 m = (s16_t)(m - (pcb->sv >> 2)); 8002f42: | | | f9b4 303e ldrsh.w r3, [r4, #62] @ 0x3e m = (s16_t) - m; 8002f46: | | | bfb8 it lt 8002f48: | | | b208 sxthlt r0, r1 pcb->sv = (s16_t)(pcb->sv + m); 8002f4a: | | | eba3 03a3 sub.w r3, r3, r3, asr #2 pcb->sa = (s16_t)(pcb->sa + m); 8002f4e: | | | fa17 f282 uxtah r2, r7, r2 pcb->sv = (s16_t)(pcb->sv + m); 8002f52: | | | 4403 add r3, r0 pcb->sa = (s16_t)(pcb->sa + m); 8002f54: | | | b212 sxth r2, r2 pcb->sv = (s16_t)(pcb->sv + m); 8002f56: | | | b29b uxth r3, r3 8002f58: | | | 87e3 strh r3, [r4, #62] @ 0x3e pcb->rto = (s16_t)((pcb->sa >> 3) + pcb->sv); 8002f5a: | | | eb03 03e2 add.w r3, r3, r2, asr #3 8002f5e: | | | f8a4 3040 strh.w r3, [r4, #64] @ 0x40 pcb->rttest = 0; 8002f62: | | | 2300 movs r3, #0 pcb->sa = (s16_t)(pcb->sa + m); 8002f64: | | | 87a2 strh r2, [r4, #60] @ 0x3c pcb->rttest = 0; 8002f66: | | | 6363 str r3, [r4, #52] @ 0x34 if ((tcplen > 0) && (pcb->state < CLOSE_WAIT)) { 8002f68: | | \-------> f8b5 00d4 ldrh.w r0, [r5, #212] @ 0xd4 if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)) { 8002f6c: | | f8d5 20c8 ldr.w r2, [r5, #200] @ 0xc8 8002f70: | | 6a63 ldr r3, [r4, #36] @ 0x24 if ((tcplen > 0) && (pcb->state < CLOSE_WAIT)) { 8002f72: | | 2800 cmp r0, #0 8002f74: /-----|-----------------------------------------|----------- f000 833a beq.w 80035ec <tcp_receive+0x80c> 8002f78: | | | 7d21 ldrb r1, [r4, #20] 8002f7a: | | | 2906 cmp r1, #6 8002f7c: +-----|-----------------------------------------|----------- f200 8336 bhi.w 80035ec <tcp_receive+0x80c> if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)) { 8002f80: | | | 1a9f subs r7, r3, r2 8002f82: | | | 2f01 cmp r7, #1 8002f84: | | /-----------------------------------|----------- f100 81aa bmi.w 80032dc <tcp_receive+0x4fc> 8002f88: | | | | 1e51 subs r1, r2, #1 8002f8a: | | | | 4401 add r1, r0 8002f8c: | | | | 1ac9 subs r1, r1, r3 8002f8e: | | | | 2900 cmp r1, #0 8002f90: | | +-----------------------------------|----------- f2c0 81a4 blt.w 80032dc <tcp_receive+0x4fc> struct pbuf *p = inseg.p; 8002f94: | | | | f8d5 60e0 ldr.w r6, [r5, #224] @ 0xe0 LWIP_ASSERT("inseg.p != NULL", inseg.p); 8002f98: | | | | /-- b966 cbnz r6, 8002fb4 <tcp_receive+0x1d4> 8002f9a: | | | | | b672 cpsid i 8002f9c: | | | | | 4b9f ldr r3, [pc, #636] @ (800321c ) 8002f9e: | | | | | 4aa0 ldr r2, [pc, #640] @ (8003220 ) 8002fa0: | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002fa4: | | | | | 4b9f ldr r3, [pc, #636] @ (8003224 ) 8002fa6: | | | | | 9300 str r3, [sp, #0] 8002fa8: | | | | | 489f ldr r0, [pc, #636] @ (8003228 ) 8002faa: | | | | | f240 539a movw r3, #1434 @ 0x59a 8002fae: | | | | | f7fe f9a3 bl 80012f8 <printf_> 8002fb2: | | | | | be00 bkpt 0x0000 LWIP_ASSERT("insane offset!", (off32 < 0xffff)); 8002fb4: | | | | \-> f64f 73fe movw r3, #65534 @ 0xfffe 8002fb8: | | | | 429f cmp r7, r3 8002fba: | | | | /-- d90c bls.n 8002fd6 <tcp_receive+0x1f6> 8002fbc: | | | | | b672 cpsid i 8002fbe: | | | | | 4b97 ldr r3, [pc, #604] @ (800321c ) 8002fc0: | | | | | 4a9a ldr r2, [pc, #616] @ (800322c ) 8002fc2: | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002fc6: | | | | | 4b97 ldr r3, [pc, #604] @ (8003224 ) 8002fc8: | | | | | 9300 str r3, [sp, #0] 8002fca: | | | | | 4897 ldr r0, [pc, #604] @ (8003228 ) 8002fcc: | | | | | f240 539b movw r3, #1435 @ 0x59b 8002fd0: | | | | | f7fe f992 bl 80012f8 <printf_> 8002fd4: | | | | | be00 bkpt 0x0000 LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off)); 8002fd6: | | | | \-> f8d5 30e0 ldr.w r3, [r5, #224] @ 0xe0 8002fda: | | | | 891b ldrh r3, [r3, #8] off = (u16_t)off32; 8002fdc: | | | | b2bf uxth r7, r7 LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off)); 8002fde: | | | | 42bb cmp r3, r7 8002fe0: | | | | /-- d20c bcs.n 8002ffc <tcp_receive+0x21c> 8002fe2: | | | | | b672 cpsid i 8002fe4: | | | | | 4b8d ldr r3, [pc, #564] @ (800321c ) 8002fe6: | | | | | 4a92 ldr r2, [pc, #584] @ (8003230 ) 8002fe8: | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8002fec: | | | | | 4b8d ldr r3, [pc, #564] @ (8003224 ) 8002fee: | | | | | 9300 str r3, [sp, #0] 8002ff0: | | | | | 488d ldr r0, [pc, #564] @ (8003228 ) 8002ff2: | | | | | f240 539d movw r3, #1437 @ 0x59d 8002ff6: | | | | | f7fe f97f bl 80012f8 <printf_> 8002ffa: | | | | | be00 bkpt 0x0000 inseg.len -= off; 8002ffc: | | | | \-> f8b5 30e4 ldrh.w r3, [r5, #228] @ 0xe4 8003000: | | | | 1bdb subs r3, r3, r7 8003002: | | | | f8a5 30e4 strh.w r3, [r5, #228] @ 0xe4 new_tot_len = (u16_t)(inseg.p->tot_len - off); 8003006: | | | | f8d5 30e0 ldr.w r3, [r5, #224] @ 0xe0 800300a: | | | | 891b ldrh r3, [r3, #8] 800300c: | | | | 1bdb subs r3, r3, r7 800300e: | | | | b29b uxth r3, r3 p->len = 0; 8003010: | | | | 2100 movs r1, #0 while (p->len < off) { 8003012: | | | /--------------------------------|----------> 8972 ldrh r2, [r6, #10] 8003014: | | | | | 42ba cmp r2, r7 8003016: | | | | /--------------------------|----------- f0c0 815b bcc.w 80032d0 <tcp_receive+0x4f0> pbuf_remove_header(p, off); 800301a: | | | | | | 4639 mov r1, r7 800301c: | | | | | | 4630 mov r0, r6 800301e: | | | | | | f7ff facf bl 80025c0 <pbuf_remove_header> inseg.tcphdr->seqno = seqno = pcb->rcv_nxt; 8003022: | | | | | | f8d5 20ec ldr.w r2, [r5, #236] @ 0xec 8003026: | | | | | | 6a63 ldr r3, [r4, #36] @ 0x24 8003028: | | | | | | f8c5 30c8 str.w r3, [r5, #200] @ 0xc8 800302c: | | | | | | 6053 str r3, [r2, #4] if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, 800302e: | | | | /--|--------------------------|----------> f8d5 30c8 ldr.w r3, [r5, #200] @ 0xc8 8003032: | | | | | | | 6a62 ldr r2, [r4, #36] @ 0x24 8003034: | | | | | | | 1a99 subs r1, r3, r2 8003036: | | | | | | | 2900 cmp r1, #0 8003038: | /--|-----|--|--|--|--------------------------|----------- f2c0 821a blt.w 8003470 <tcp_receive+0x690> 800303c: | | | | | | | | 8d21 ldrh r1, [r4, #40] @ 0x28 800303e: | | | | | | | | 1ad0 subs r0, r2, r3 8003040: | | | | | | | | 3801 subs r0, #1 8003042: | | | | | | | | 42c8 cmn r0, r1 8003044: | +--|-----|--|--|--|--------------------------|----------- f100 8214 bmi.w 8003470 <tcp_receive+0x690> if (pcb->rcv_nxt == seqno) { 8003048: | | | | | | | | 4293 cmp r3, r2 800304a: | | | /--|--|--|--|--------------------------|----------- f040 820c bne.w 8003466 <tcp_receive+0x686> tcplen = TCP_TCPLEN(&inseg); 800304e: | | | | | | | | | f8d5 00ec ldr.w r0, [r5, #236] @ 0xec 8003052: | | | | | | | | | f8b5 c0e4 ldrh.w ip, [r5, #228] @ 0xe4 8003056: | | | | | | | | | 8983 ldrh r3, [r0, #12] 8003058: | | | | | | | | | b29e uxth r6, r3 800305a: | | | | | | | | | ba5b rev16 r3, r3 800305c: | | | | | | | | | b29a uxth r2, r3 800305e: | | | | | | | | | b2df uxtb r7, r3 8003060: | | | | | | | | | f013 0303 ands.w r3, r3, #3 8003064: | | | | | | | | | bf18 it ne 8003066: | | | | | | | | | 2301 movne r3, #1 8003068: | | | | | | | | | 4463 add r3, ip 800306a: | | | | | | | | | b29b uxth r3, r3 if (tcplen > pcb->rcv_wnd) { 800306c: | | | | | | | | | 4299 cmp r1, r3 tcplen = TCP_TCPLEN(&inseg); 800306e: | | | | | | | | | f8a5 30d4 strh.w r3, [r5, #212] @ 0xd4 if (tcplen > pcb->rcv_wnd) { 8003072: | | | | | | | | | /----- d23b bcs.n 80030ec <tcp_receive+0x30c> if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { 8003074: | | | | | | | | | | 07ff lsls r7, r7, #31 8003076: | | | | | | | | | | /-- d506 bpl.n 8003086 <tcp_receive+0x2a6> TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) & ~(unsigned int)TCP_FIN); 8003078: | | | | | | | | | | | 0213 lsls r3, r2, #8 800307a: | | | | | | | | | | | f403 5378 and.w r3, r3, #15872 @ 0x3e00 800307e: | | | | | | | | | | | f426 527c bic.w r2, r6, #16128 @ 0x3f00 8003082: | | | | | | | | | | | 4313 orrs r3, r2 8003084: | | | | | | | | | | | 8183 strh r3, [r0, #12] inseg.len = (u16_t)pcb->rcv_wnd; 8003086: | | | | | | | | | | \-> f8a5 10e4 strh.w r1, [r5, #228] @ 0xe4 if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) { 800308a: | | | | | | | | | | 8983 ldrh r3, [r0, #12] pbuf_realloc(inseg.p, inseg.len); 800308c: | | | | | | | | | | f8d5 00e0 ldr.w r0, [r5, #224] @ 0xe0 8003090: | | | | | | | | | | ba5b rev16 r3, r3 if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) { 8003092: | | | | | | | | | | 079a lsls r2, r3, #30 inseg.len -= 1; 8003094: | | | | | | | | | | bf44 itt mi 8003096: | | | | | | | | | | f101 33ff addmi.w r3, r1, #4294967295 @ 0xffffffff 800309a: | | | | | | | | | | f8a5 30e4 strhmi.w r3, [r5, #228] @ 0xe4 pbuf_realloc(inseg.p, inseg.len); 800309e: | | | | | | | | | | f8b5 10e4 ldrh.w r1, [r5, #228] @ 0xe4 80030a2: | | | | | | | | | | f7fe fc5f bl 8001964 <pbuf_realloc> tcplen = TCP_TCPLEN(&inseg); 80030a6: | | | | | | | | | | f8d5 30ec ldr.w r3, [r5, #236] @ 0xec 80030aa: | | | | | | | | | | f8b5 20e4 ldrh.w r2, [r5, #228] @ 0xe4 80030ae: | | | | | | | | | | 899b ldrh r3, [r3, #12] LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd", 80030b0: | | | | | | | | | | 6a61 ldr r1, [r4, #36] @ 0x24 80030b2: | | | | | | | | | | ba5b rev16 r3, r3 tcplen = TCP_TCPLEN(&inseg); 80030b4: | | | | | | | | | | f013 0303 ands.w r3, r3, #3 80030b8: | | | | | | | | | | bf18 it ne 80030ba: | | | | | | | | | | 2301 movne r3, #1 80030bc: | | | | | | | | | | 4413 add r3, r2 LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd", 80030be: | | | | | | | | | | f8d5 20c8 ldr.w r2, [r5, #200] @ 0xc8 tcplen = TCP_TCPLEN(&inseg); 80030c2: | | | | | | | | | | b29b uxth r3, r3 80030c4: | | | | | | | | | | f8a5 30d4 strh.w r3, [r5, #212] @ 0xd4 LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd", 80030c8: | | | | | | | | | | 4413 add r3, r2 80030ca: | | | | | | | | | | 8d22 ldrh r2, [r4, #40] @ 0x28 80030cc: | | | | | | | | | | 440a add r2, r1 80030ce: | | | | | | | | | | 4293 cmp r3, r2 80030d0: | | | | | | | | | +----- d00c beq.n 80030ec <tcp_receive+0x30c> 80030d2: | | | | | | | | | | b672 cpsid i 80030d4: | | | | | | | | | | 4b51 ldr r3, [pc, #324] @ (800321c ) 80030d6: | | | | | | | | | | 4a57 ldr r2, [pc, #348] @ (8003234 ) 80030d8: | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80030dc: | | | | | | | | | | 4b51 ldr r3, [pc, #324] @ (8003224 ) 80030de: | | | | | | | | | | 9300 str r3, [sp, #0] 80030e0: | | | | | | | | | | 4851 ldr r0, [pc, #324] @ (8003228 ) 80030e2: | | | | | | | | | | f240 53d1 movw r3, #1489 @ 0x5d1 80030e6: | | | | | | | | | | f7fe f907 bl 80012f8 <printf_> 80030ea: | | | | | | | | | | be00 bkpt 0x0000 if (pcb->ooseq != NULL) { 80030ec: | | | | | | | | | \----> 6f66 ldr r6, [r4, #116] @ 0x74 80030ee: | | | | | | | | | 2e00 cmp r6, #0 80030f0: | | | | | | | | /-----------------|----------- f000 8103 beq.w 80032fa <tcp_receive+0x51a> if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { 80030f4: | | | | | | | | | | f8d5 30ec ldr.w r3, [r5, #236] @ 0xec 80030f8: | | | | | | | | | | 899b ldrh r3, [r3, #12] 80030fa: | | | | | | | | | | ba5b rev16 r3, r3 80030fc: | | | | | | | | | | 07db lsls r3, r3, #31 80030fe: | | | | | | | | | /-----------|----------- f100 80f9 bmi.w 80032f4 <tcp_receive+0x514> TCP_SEQ_GEQ(seqno + tcplen, 8003102: | | | | | | | | /-----|-----|-----------|----------> 6937 ldr r7, [r6, #16] 8003104: | | | | | | | | | | | | f8b5 20d4 ldrh.w r2, [r5, #212] @ 0xd4 8003108: | | | | | | | | | | | | f8d5 00c8 ldr.w r0, [r5, #200] @ 0xc8 800310c: | | | | | | | | | | | | 687b ldr r3, [r7, #4] 800310e: | | | | | | | | | | | | f8b6 c008 ldrh.w ip, [r6, #8] 8003112: | | | | | | | | | | | | 4402 add r2, r0 8003114: | | | | | | | | | | | | 1ad1 subs r1, r2, r3 8003116: | | | | | | | | | | | | eba1 010c sub.w r1, r1, ip while (next && 800311a: | | | | | | | | | | | | 2900 cmp r1, #0 800311c: | | | | | | | | | /--|-----|-----------|----------- f280 8126 bge.w 800336c <tcp_receive+0x58c> TCP_SEQ_GT(seqno + tcplen, 8003120: | | | | | | | | | | | | | 1a9a subs r2, r3, r2 if (next && 8003122: | | | | | | | | | | | | | 2a00 cmp r2, #0 8003124: | | | | | | | | | | | | | /-- da35 bge.n 8003192 <tcp_receive+0x3b2> inseg.len = (u16_t)(next->tcphdr->seqno - seqno); 8003126: | | | | | | | | | | | | | | 1a1b subs r3, r3, r0 8003128: | | | | | | | | | | | | | | b29b uxth r3, r3 if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) { 800312a: | | | | | | | | | | | | | | f8d5 20ec ldr.w r2, [r5, #236] @ 0xec inseg.len = (u16_t)(next->tcphdr->seqno - seqno); 800312e: | | | | | | | | | | | | | | f8a5 30e4 strh.w r3, [r5, #228] @ 0xe4 if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) { 8003132: | | | | | | | | | | | | | | 8992 ldrh r2, [r2, #12] pbuf_realloc(inseg.p, inseg.len); 8003134: | | | | | | | | | | | | | | f8d5 00e0 ldr.w r0, [r5, #224] @ 0xe0 8003138: | | | | | | | | | | | | | | ba52 rev16 r2, r2 if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) { 800313a: | | | | | | | | | | | | | | 0791 lsls r1, r2, #30 inseg.len -= 1; 800313c: | | | | | | | | | | | | | | bf44 itt mi 800313e: | | | | | | | | | | | | | | f103 33ff addmi.w r3, r3, #4294967295 @ 0xffffffff 8003142: | | | | | | | | | | | | | | f8a5 30e4 strhmi.w r3, [r5, #228] @ 0xe4 pbuf_realloc(inseg.p, inseg.len); 8003146: | | | | | | | | | | | | | | f8b5 10e4 ldrh.w r1, [r5, #228] @ 0xe4 800314a: | | | | | | | | | | | | | | f7fe fc0b bl 8001964 <pbuf_realloc> tcplen = TCP_TCPLEN(&inseg); 800314e: | | | | | | | | | | | | | | f8d5 30ec ldr.w r3, [r5, #236] @ 0xec 8003152: | | | | | | | | | | | | | | f8b5 20e4 ldrh.w r2, [r5, #228] @ 0xe4 8003156: | | | | | | | | | | | | | | 899b ldrh r3, [r3, #12] 8003158: | | | | | | | | | | | | | | ba5b rev16 r3, r3 800315a: | | | | | | | | | | | | | | f013 0303 ands.w r3, r3, #3 800315e: | | | | | | | | | | | | | | bf18 it ne 8003160: | | | | | | | | | | | | | | 2301 movne r3, #1 8003162: | | | | | | | | | | | | | | 4413 add r3, r2 LWIP_ASSERT("tcp_receive: segment not trimmed correctly to ooseq queue", 8003164: | | | | | | | | | | | | | | f8d5 20c8 ldr.w r2, [r5, #200] @ 0xc8 tcplen = TCP_TCPLEN(&inseg); 8003168: | | | | | | | | | | | | | | b29b uxth r3, r3 800316a: | | | | | | | | | | | | | | f8a5 30d4 strh.w r3, [r5, #212] @ 0xd4 LWIP_ASSERT("tcp_receive: segment not trimmed correctly to ooseq queue", 800316e: | | | | | | | | | | | | | | 4413 add r3, r2 8003170: | | | | | | | | | | | | | | 6932 ldr r2, [r6, #16] 8003172: | | | | | | | | | | | | | | 6852 ldr r2, [r2, #4] 8003174: | | | | | | | | | | | | | | 4293 cmp r3, r2 8003176: | | | | | | | | | | | | | +-- d00c beq.n 8003192 <tcp_receive+0x3b2> 8003178: | | | | | | | | | | | | | | b672 cpsid i 800317a: | | | | | | | | | | | | | | 4b28 ldr r3, [pc, #160] @ (800321c ) 800317c: | | | | | | | | | | | | | | 4a2e ldr r2, [pc, #184] @ (8003238 ) 800317e: | | | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003182: | | | | | | | | | | | | | | 4b28 ldr r3, [pc, #160] @ (8003224 ) 8003184: | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 8003186: | | | | | | | | | | | | | | 4828 ldr r0, [pc, #160] @ (8003228 ) 8003188: | | | | | | | | | | | | | | f240 6302 movw r3, #1538 @ 0x602 800318c: | | | | | | | | | | | | | | f7fe f8b4 bl 80012f8 <printf_> 8003190: | | | | | | | | | | | | | | be00 bkpt 0x0000 8003192: | | | | | | | | | | | | | \-> 4637 mov r7, r6 pcb->ooseq = next; 8003194: | | | | | | | | | | | /--|-----------|----------> 6767 str r7, [r4, #116] @ 0x74 8003196: | | | | | | | | | | +--|--|-----------|----------- e0b0 b.n 80032fa <tcp_receive+0x51a> } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) { 8003198: | | | | | | | | | | | | | \----------> 43d1 mvns r1, r2 800319a: | | | | | | | | | | | | | 42d9 cmn r1, r3 800319c: | | | | | | | | | | | | | /-------------------- f100 8094 bmi.w 80032c8 <tcp_receive+0x4e8> 80031a0: | | | | | | | | | | | | | | 6d21 ldr r1, [r4, #80] @ 0x50 80031a2: | | | | | | | | | | | | | | 1ac9 subs r1, r1, r3 80031a4: | | | | | | | | | | | | | | 2900 cmp r1, #0 80031a6: | | | | | | | | | | | | | +-------------------- f2c0 808f blt.w 80032c8 <tcp_receive+0x4e8> if (pcb->flags & TF_INFR) { 80031aa: | | | | | | | | | | | | | | 8b61 ldrh r1, [r4, #26] 80031ac: | | | | | | | | | | | | | | 0748 lsls r0, r1, #29 80031ae: | | | | | | | | | | | | | | /-- d509 bpl.n 80031c4 <tcp_receive+0x3e4> tcp_clear_flags(pcb, TF_INFR); 80031b0: | | | | | | | | | | | | | | | f021 0104 bic.w r1, r1, #4 80031b4: | | | | | | | | | | | | | | | 8361 strh r1, [r4, #26] pcb->cwnd = pcb->ssthresh; 80031b6: | | | | | | | | | | | | | | | f8b4 104a ldrh.w r1, [r4, #74] @ 0x4a 80031ba: | | | | | | | | | | | | | | | f8a4 1048 strh.w r1, [r4, #72] @ 0x48 pcb->bytes_acked = 0; 80031be: | | | | | | | | | | | | | | | 2100 movs r1, #0 80031c0: | | | | | | | | | | | | | | | f8a4 106a strh.w r1, [r4, #106] @ 0x6a pcb->rto = (s16_t)((pcb->sa >> 3) + pcb->sv); 80031c4: | | | | | | | | | | | | | | \-> f9b4 003c ldrsh.w r0, [r4, #60] @ 0x3c 80031c8: | | | | | | | | | | | | | | 8fe1 ldrh r1, [r4, #62] @ 0x3e pcb->lastack = ackno; 80031ca: | | | | | | | | | | | | | | 6463 str r3, [r4, #68] @ 0x44 pcb->rto = (s16_t)((pcb->sa >> 3) + pcb->sv); 80031cc: | | | | | | | | | | | | | | eb01 01e0 add.w r1, r1, r0, asr #3 80031d0: | | | | | | | | | | | | | | f8a4 1040 strh.w r1, [r4, #64] @ 0x40 pcb->nrtx = 0; 80031d4: | | | | | | | | | | | | | | 2100 movs r1, #0 80031d6: | | | | | | | | | | | | | | f8a4 1042 strh.w r1, [r4, #66] @ 0x42 if (pcb->state >= ESTABLISHED) { 80031da: | | | | | | | | | | | | | | 7d21 ldrb r1, [r4, #20] 80031dc: | | | | | | | | | | | | | | 2903 cmp r1, #3 80031de: | | | | | | | | | | | | | | /-------- d937 bls.n 8003250 <tcp_receive+0x470> acked = (tcpwnd_size_t)(ackno - pcb->lastack); 80031e0: | | | | | | | | | | | | | | | 1a9b subs r3, r3, r2 if (pcb->cwnd < pcb->ssthresh) { 80031e2: | | | | | | | | | | | | | | | f8b4 104a ldrh.w r1, [r4, #74] @ 0x4a 80031e6: | | | | | | | | | | | | | | | f8b4 2048 ldrh.w r2, [r4, #72] @ 0x48 80031ea: | | | | | | | | | | | | | | | 4291 cmp r1, r2 acked = (tcpwnd_size_t)(ackno - pcb->lastack); 80031ec: | | | | | | | | | | | | | | | b29b uxth r3, r3 if (pcb->cwnd < pcb->ssthresh) { 80031ee: | | | | | | | | | | | | | | | /----- d925 bls.n 800323c <tcp_receive+0x45c> u8_t num_seg = (pcb->flags & TF_RTO) ? 1 : 2; 80031f0: | | | | | | | | | | | | | | | | 8b61 ldrh r1, [r4, #26] 80031f2: | | | | | | | | | | | | | | | | f411 6f00 tst.w r1, #2048 @ 0x800 increase = LWIP_MIN(acked, (tcpwnd_size_t)(num_seg * pcb->mss)); 80031f6: | | | | | | | | | | | | | | | | 8e61 ldrh r1, [r4, #50] @ 0x32 u8_t num_seg = (pcb->flags & TF_RTO) ? 1 : 2; 80031f8: | | | | | | | | | | | | | | | | bf0c ite eq 80031fa: | | | | | | | | | | | | | | | | 2002 moveq r0, #2 80031fc: | | | | | | | | | | | | | | | | 2001 movne r0, #1 increase = LWIP_MIN(acked, (tcpwnd_size_t)(num_seg * pcb->mss)); 80031fe: | | | | | | | | | | | | | | | | fb11 f100 smulbb r1, r1, r0 8003202: | | | | | | | | | | | | | | | | b289 uxth r1, r1 TCP_WND_INC(pcb->cwnd, increase); 8003204: | | | | | | | | | | | | | | | | 4299 cmp r1, r3 8003206: | | | | | | | | | | | | | | | | bf94 ite ls 8003208: | | | | | | | | | | | | | | | | 1850 addls r0, r2, r1 800320a: | | | | | | | | | | | | | | | | 18d0 addhi r0, r2, r3 800320c: | | | | | | | | | | | | | | | | b283 uxth r3, r0 TCP_WND_INC(pcb->cwnd, pcb->mss); 800320e: | | | | | | | | | | | | | | /--------|--|----> 429a cmp r2, r3 8003210: | | | | | | | | | | | | | | | | | /-- d901 bls.n 8003216 <tcp_receive+0x436> TCP_WND_INC(pcb->cwnd, increase); 8003212: | | | | | | | | | | | | | | | | | | f64f 73ff movw r3, #65535 @ 0xffff TCP_WND_INC(pcb->cwnd, pcb->mss); 8003216: | | | | | | | | | | | | | | | | | \-> f8a4 3048 strh.w r3, [r4, #72] @ 0x48 800321a: | | | | | | | | | | | | | | | +--|----- e019 b.n 8003250 <tcp_receive+0x470> 800321c: | | | | | | | | | | | | | | | | | 20000060 .word 0x20000060 8003220: | | | | | | | | | | | | | | | | | 0800bbf4 .word 0x0800bbf4 8003224: | | | | | | | | | | | | | | | | | 0800b591 .word 0x0800b591 8003228: | | | | | | | | | | | | | | | | | 0800b232 .word 0x0800b232 800322c: | | | | | | | | | | | | | | | | | 0800bc04 .word 0x0800bc04 8003230: | | | | | | | | | | | | | | | | | 0800bc13 .word 0x0800bc13 8003234: | | | | | | | | | | | | | | | | | 0800bc23 .word 0x0800bc23 8003238: | | | | | | | | | | | | | | | | | 0800bc59 .word 0x0800bc59 TCP_WND_INC(pcb->bytes_acked, acked); 800323c: | | | | | | | | | | | | | | | | \----> f8b4 106a ldrh.w r1, [r4, #106] @ 0x6a 8003240: | | | | | | | | | | | | | | | | 440b add r3, r1 8003242: | | | | | | | | | | | | | | | | b29b uxth r3, r3 8003244: | | | | | | | | | | | | | | | | 4299 cmp r1, r3 8003246: | | | | | | | | | | | | | | | /--|-------- d834 bhi.n 80032b2 <tcp_receive+0x4d2> if (pcb->bytes_acked >= pcb->cwnd) { 8003248: | | | | | | | | | | | | | | | | | 429a cmp r2, r3 800324a: | | | | | | | | | | | | | | | /--|--|-------- d934 bls.n 80032b6 <tcp_receive+0x4d6> 800324c: | | | | | | | | | | | | | | | | | | f8a4 306a strh.w r3, [r4, #106] @ 0x6a pcb->unacked = tcp_free_acked_segments(pcb, pcb->unacked, "unacked", pcb->unsent); 8003250: | | | | | | | | | | | | | | | | | \-------> e9d4 211b ldrd r2, r1, [r4, #108] @ 0x6c 8003254: | | | | | | | | | | | | | | | | | 4620 mov r0, r4 8003256: | | | | | | | | | | | | | | | | | f006 fd47 bl 8009ce8 <tcp_free_acked_segments.isra.0> pcb->unsent = tcp_free_acked_segments(pcb, pcb->unsent, "unsent", pcb->unacked); 800325a: | | | | | | | | | | | | | | | | | 6ee1 ldr r1, [r4, #108] @ 0x6c pcb->unacked = tcp_free_acked_segments(pcb, pcb->unacked, "unacked", pcb->unsent); 800325c: | | | | | | | | | | | | | | | | | 6720 str r0, [r4, #112] @ 0x70 800325e: | | | | | | | | | | | | | | | | | 4602 mov r2, r0 pcb->unsent = tcp_free_acked_segments(pcb, pcb->unsent, "unsent", pcb->unacked); 8003260: | | | | | | | | | | | | | | | | | 4620 mov r0, r4 8003262: | | | | | | | | | | | | | | | | | f006 fd41 bl 8009ce8 <tcp_free_acked_segments.isra.0> if (pcb->unacked == NULL) { 8003266: | | | | | | | | | | | | | | | | | 6f22 ldr r2, [r4, #112] @ 0x70 pcb->unsent = tcp_free_acked_segments(pcb, pcb->unsent, "unsent", pcb->unacked); 8003268: | | | | | | | | | | | | | | | | | 66e0 str r0, [r4, #108] @ 0x6c if (pcb->unacked == NULL) { 800326a: | | | | | | | | | | | | | | | | | fab2 f382 clz r3, r2 800326e: | | | | | | | | | | | | | | | | | 095b lsrs r3, r3, #5 8003270: | | | | | | | | | | | | | | | | | 425b negs r3, r3 8003272: | | | | | | | | | | | | | | | | | 8623 strh r3, [r4, #48] @ 0x30 pcb->polltmr = 0; 8003274: | | | | | | | | | | | | | | | | | 2300 movs r3, #0 8003276: | | | | | | | | | | | | | | | | | 7723 strb r3, [r4, #28] if (pcb->unsent == NULL) { 8003278: | | | | | | | | | | | | | | | | | /-- b908 cbnz r0, 800327e <tcp_receive+0x49e> pcb->unsent_oversize = 0; 800327a: | | | | | | | | | | | | | | | | | | f8a4 0068 strh.w r0, [r4, #104] @ 0x68 pcb->snd_buf = (tcpwnd_size_t)(pcb->snd_buf + recv_acked); 800327e: | | | | | | | | | | | | | | | | | \-> f8b4 3064 ldrh.w r3, [r4, #100] @ 0x64 8003282: | | | | | | | | | | | | | | | | | f8b5 10d6 ldrh.w r1, [r5, #214] @ 0xd6 if (pcb->flags & TF_RTO) { 8003286: | | | | | | | | | | | | | | | | | 8b66 ldrh r6, [r4, #26] pcb->snd_buf = (tcpwnd_size_t)(pcb->snd_buf + recv_acked); 8003288: | | | | | | | | | | | | | | | | | 440b add r3, r1 800328a: | | | | | | | | | | | | | | | | | f8a4 3064 strh.w r3, [r4, #100] @ 0x64 if (pcb->flags & TF_RTO) { 800328e: | | | | | | | | | | | | | | | | | 0533 lsls r3, r6, #20 8003290: | | +--|--|--|--|--|--|--|--|--|--|--|--|--|--|----------- f57f ae41 bpl.w 8002f16 <tcp_receive+0x136> if (pcb->unacked == NULL) { 8003294: | | | | | | | | | | | | | | | | | /-------- b9b2 cbnz r2, 80032c4 <tcp_receive+0x4e4> if ((pcb->unsent == NULL) || 8003296: | | | | | | | | | | | | | | | | | | /-- b140 cbz r0, 80032aa <tcp_receive+0x4ca> (TCP_SEQ_LEQ(pcb->rto_end, lwip_ntohl(pcb->unsent->tcphdr->seqno)))) { 8003298: | | | | | | | | | | | | | | | | | | | 6903 ldr r3, [r0, #16] } else if (TCP_SEQ_LEQ(pcb->rto_end, lwip_ntohl(pcb->unacked->tcphdr->seqno))) { 800329a: | | | | | | | | | | | | | | | | | | /--|-> 6858 ldr r0, [r3, #4] 800329c: | | | | | | | | | | | | | | | | | | | | f004 ff4a bl 8008134 <lwip_htonl> 80032a0: | | | | | | | | | | | | | | | | | | | | 6ce3 ldr r3, [r4, #76] @ 0x4c 80032a2: | | | | | | | | | | | | | | | | | | | | 1ac0 subs r0, r0, r3 80032a4: | | | | | | | | | | | | | | | | | | | | 2800 cmp r0, #0 80032a6: | | +--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|-- f6ff ae36 blt.w 8002f16 <tcp_receive+0x136> tcp_clear_flags(pcb, TF_RTO); 80032aa: | | | | | | | | | | | | | | | | | | | \-> f426 6600 bic.w r6, r6, #2048 @ 0x800 80032ae: | | | | | | | | | | | | | | | | | | | 8366 strh r6, [r4, #26] 80032b0: | | +--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|----- e631 b.n 8002f16 <tcp_receive+0x136> TCP_WND_INC(pcb->bytes_acked, acked); 80032b2: | | | | | | | | | | | | | | | | \--|--|----> f64f 73ff movw r3, #65535 @ 0xffff pcb->bytes_acked = (tcpwnd_size_t)(pcb->bytes_acked - pcb->cwnd); 80032b6: | | | | | | | | | | | | | | | \-----|--|----> 1a9b subs r3, r3, r2 80032b8: | | | | | | | | | | | | | | | | | f8a4 306a strh.w r3, [r4, #106] @ 0x6a TCP_WND_INC(pcb->cwnd, pcb->mss); 80032bc: | | | | | | | | | | | | | | | | | 8e63 ldrh r3, [r4, #50] @ 0x32 80032be: | | | | | | | | | | | | | | | | | 4413 add r3, r2 80032c0: | | | | | | | | | | | | | | | | | b29b uxth r3, r3 80032c2: | | | | | | | | | | | | | | \--------|--|----- e7a4 b.n 800320e <tcp_receive+0x42e> } else if (TCP_SEQ_LEQ(pcb->rto_end, lwip_ntohl(pcb->unacked->tcphdr->seqno))) { 80032c4: | | | | | | | | | | | | | | \--|----> 6913 ldr r3, [r2, #16] 80032c6: | | | | | | | | | | | | | | \----- e7e8 b.n 800329a <tcp_receive+0x4ba> tcp_send_empty_ack(pcb); 80032c8: | | | | | | | | | | | | | \-------------------> 4620 mov r0, r4 80032ca: | | | | | | | | | | | | | f7ff fd4d bl 8002d68 <tcp_send_empty_ack> 80032ce: | | \--|--|--|--|--|--|--|--|--|--|----------------------- e622 b.n 8002f16 <tcp_receive+0x136> off -= p->len; 80032d0: | | | | | | \--|--|--|--|--|----------------------> 1aba subs r2, r7, r2 p->tot_len = new_tot_len; 80032d2: | | | | | | | | | | | 8133 strh r3, [r6, #8] p->len = 0; 80032d4: | | | | | | | | | | | 8171 strh r1, [r6, #10] off -= p->len; 80032d6: | | | | | | | | | | | b297 uxth r7, r2 p = p->next; 80032d8: | | | | | | | | | | | 6836 ldr r6, [r6, #0] 80032da: | | | | \--|-----|--|--|--|--|----------------------- e69a b.n 8003012 <tcp_receive+0x232> if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)) { 80032dc: | | | \-----|-----|--|--|--|--|----------------------> 1ad2 subs r2, r2, r3 80032de: | | | | | | | | | 2a00 cmp r2, #0 tcp_ack_now(pcb); 80032e0: | | | | | | | | | bfbe ittt lt 80032e2: | | | | | | | | | 8b63 ldrhlt r3, [r4, #26] 80032e4: | | | | | | | | | f043 0302 orrlt.w r3, r3, #2 80032e8: | | | | | | | | | 8363 strhlt r3, [r4, #26] 80032ea: | | | \-----|--|--|--|--|----------------------- e6a0 b.n 800302e <tcp_receive+0x24e> pcb->ooseq = pcb->ooseq->next; 80032ec: | | | | | | | | /-> 6803 ldr r3, [r0, #0] 80032ee: | | | | | | | | | 6763 str r3, [r4, #116] @ 0x74 tcp_seg_free(old_ooseq); 80032f0: | | | | | | | | | f7ff fa84 bl 80027fc <tcp_seg_free> while (pcb->ooseq != NULL) { 80032f4: | | | | | | | \--------------------|-> 6f60 ldr r0, [r4, #116] @ 0x74 80032f6: | | | | | | | | 2800 cmp r0, #0 80032f8: | | | | | | | \-- d1f8 bne.n 80032ec <tcp_receive+0x50c> pcb->rcv_nxt = seqno + tcplen; 80032fa: | | | | | \--|-------------------------> f8b5 20d4 ldrh.w r2, [r5, #212] @ 0xd4 80032fe: | | | | | | f8d5 30c8 ldr.w r3, [r5, #200] @ 0xc8 8003302: | | | | | | 4413 add r3, r2 8003304: | | | | | | 6263 str r3, [r4, #36] @ 0x24 LWIP_ASSERT("tcp_receive: tcplen > rcv_wnd", pcb->rcv_wnd >= tcplen); 8003306: | | | | | | 8d23 ldrh r3, [r4, #40] @ 0x28 8003308: | | | | | | 4293 cmp r3, r2 800330a: | | | | | | /-- d20c bcs.n 8003326 <tcp_receive+0x546> 800330c: | | | | | | | b672 cpsid i 800330e: | | | | | | | 4b7e ldr r3, [pc, #504] @ (8003508 ) 8003310: | | | | | | | 4a7e ldr r2, [pc, #504] @ (800350c ) 8003312: | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003316: | | | | | | | 4b7e ldr r3, [pc, #504] @ (8003510 ) 8003318: | | | | | | | 9300 str r3, [sp, #0] 800331a: | | | | | | | 487e ldr r0, [pc, #504] @ (8003514 ) 800331c: | | | | | | | f240 630d movw r3, #1549 @ 0x60d 8003320: | | | | | | | f7fd ffea bl 80012f8 <printf_> 8003324: | | | | | | | be00 bkpt 0x0000 pcb->rcv_wnd -= tcplen; 8003326: | | | | | | \-> 8d23 ldrh r3, [r4, #40] @ 0x28 8003328: | | | | | | f8b5 20d4 ldrh.w r2, [r5, #212] @ 0xd4 800332c: | | | | | | 1a9b subs r3, r3, r2 800332e: | | | | | | 8523 strh r3, [r4, #40] @ 0x28 tcp_update_rcv_ann_wnd(pcb); 8003330: | | | | | | 4620 mov r0, r4 8003332: | | | | | | f7fe fcb3 bl 8001c9c <tcp_update_rcv_ann_wnd> if (inseg.p->tot_len > 0) { 8003336: | | | | | | f8d5 30e0 ldr.w r3, [r5, #224] @ 0xe0 800333a: | | | | | | 891a ldrh r2, [r3, #8] 800333c: | | | | | | /-- b122 cbz r2, 8003348 <tcp_receive+0x568> recv_data = inseg.p; 800333e: | | | | | | | f8c5 30f0 str.w r3, [r5, #240] @ 0xf0 inseg.p = NULL; 8003342: | | | | | | | 2300 movs r3, #0 8003344: | | | | | | | f8c5 30e0 str.w r3, [r5, #224] @ 0xe0 if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { 8003348: | | | | | | \-> f8d5 30ec ldr.w r3, [r5, #236] @ 0xec 800334c: | | | | | | 899b ldrh r3, [r3, #12] 800334e: | | | | | | ba5b rev16 r3, r3 8003350: | | | | | | 07da lsls r2, r3, #31 8003352: | | | | | | /-- d505 bpl.n 8003360 <tcp_receive+0x580> recv_flags |= TF_GOT_FIN; 8003354: | | | | | | | f895 30f4 ldrb.w r3, [r5, #244] @ 0xf4 8003358: | | | | | | | f043 0320 orr.w r3, r3, #32 800335c: | | | | | | | f885 30f4 strb.w r3, [r5, #244] @ 0xf4 8003360: | | | | | | \-> 4f69 ldr r7, [pc, #420] @ (8003508 ) LWIP_ASSERT("tcp_receive: ooseq tcplen > rcv_wnd", 8003362: | | | | | | f8df 81ac ldr.w r8, [pc, #428] @ 8003510 8003366: | | | | | | f8df 91b0 ldr.w r9, [pc, #432] @ 8003518 800336a: | | | | | | /-------------- e064 b.n 8003436 <tcp_receive+0x656> if ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0 && 800336c: | | | | \-----|-----------|-------------> 89bb ldrh r3, [r7, #12] 800336e: | | | | | | ba5b rev16 r3, r3 8003370: | | | | | | 07df lsls r7, r3, #31 8003372: | | | | | | /-- d50e bpl.n 8003392 <tcp_receive+0x5b2> (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) == 0) { 8003374: | | | | | | | f8d5 10ec ldr.w r1, [r5, #236] @ 0xec 8003378: | | | | | | | 898b ldrh r3, [r1, #12] 800337a: | | | | | | | b29a uxth r2, r3 800337c: | | | | | | | ba5b rev16 r3, r3 if ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0 && 800337e: | | | | | | | 0798 lsls r0, r3, #30 8003380: | | | | | | +-- d407 bmi.n 8003392 <tcp_receive+0x5b2> TCPH_SET_FLAG(inseg.tcphdr, TCP_FIN); 8003382: | | | | | | | f442 7380 orr.w r3, r2, #256 @ 0x100 8003386: | | | | | | | 818b strh r3, [r1, #12] tcplen = TCP_TCPLEN(&inseg); 8003388: | | | | | | | f8b5 30e4 ldrh.w r3, [r5, #228] @ 0xe4 800338c: | | | | | | | 3301 adds r3, #1 800338e: | | | | | | | f8a5 30d4 strh.w r3, [r5, #212] @ 0xd4 next = next->next; 8003392: | | | | | | \-> 6837 ldr r7, [r6, #0] tcp_seg_free(tmp); 8003394: | | | | | | 4630 mov r0, r6 8003396: | | | | | | f7ff fa31 bl 80027fc <tcp_seg_free> while (next && 800339a: | | | | | | 2f00 cmp r7, #0 800339c: | | | | \-----------|-------------- f43f aefa beq.w 8003194 <tcp_receive+0x3b4> 80033a0: | | | | | 463e mov r6, r7 80033a2: | | | \--------------------|-------------- e6ae b.n 8003102 <tcp_receive+0x322> seqno = pcb->ooseq->tcphdr->seqno; 80033a4: | | | | /----> f8c5 20c8 str.w r2, [r5, #200] @ 0xc8 pcb->rcv_nxt += TCP_TCPLEN(cseg); 80033a8: | | | | | 899b ldrh r3, [r3, #12] 80033aa: | | | | | 8931 ldrh r1, [r6, #8] 80033ac: | | | | | ba5b rev16 r3, r3 80033ae: | | | | | f013 0303 ands.w r3, r3, #3 80033b2: | | | | | bf18 it ne 80033b4: | | | | | 2301 movne r3, #1 80033b6: | | | | | 440b add r3, r1 80033b8: | | | | | 441a add r2, r3 80033ba: | | | | | 6262 str r2, [r4, #36] @ 0x24 LWIP_ASSERT("tcp_receive: ooseq tcplen > rcv_wnd", 80033bc: | | | | | 8d22 ldrh r2, [r4, #40] @ 0x28 80033be: | | | | | 429a cmp r2, r3 80033c0: | | | | | /-- d20b bcs.n 80033da <tcp_receive+0x5fa> 80033c2: | | | | | | b672 cpsid i 80033c4: | | | | | | f240 6331 movw r3, #1585 @ 0x631 80033c8: | | | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 80033cc: | | | | | | 4851 ldr r0, [pc, #324] @ (8003514 ) 80033ce: | | | | | | f8cd 8000 str.w r8, [sp] 80033d2: | | | | | | 464a mov r2, r9 80033d4: | | | | | | f7fd ff90 bl 80012f8 <printf_> 80033d8: | | | | | | be00 bkpt 0x0000 pcb->rcv_wnd -= TCP_TCPLEN(cseg); 80033da: | | | | | \-> 6933 ldr r3, [r6, #16] 80033dc: | | | | | 8932 ldrh r2, [r6, #8] 80033de: | | | | | 899b ldrh r3, [r3, #12] 80033e0: | | | | | ba5b rev16 r3, r3 80033e2: | | | | | f013 0303 ands.w r3, r3, #3 80033e6: | | | | | bf18 it ne 80033e8: | | | | | 2301 movne r3, #1 80033ea: | | | | | 4413 add r3, r2 80033ec: | | | | | 8d22 ldrh r2, [r4, #40] @ 0x28 80033ee: | | | | | 1ad3 subs r3, r2, r3 80033f0: | | | | | 8523 strh r3, [r4, #40] @ 0x28 tcp_update_rcv_ann_wnd(pcb); 80033f2: | | | | | 4620 mov r0, r4 80033f4: | | | | | f7fe fc52 bl 8001c9c <tcp_update_rcv_ann_wnd> if (cseg->p->tot_len > 0) { 80033f8: | | | | | 6871 ldr r1, [r6, #4] 80033fa: | | | | | 890b ldrh r3, [r1, #8] 80033fc: | | | | | /-- b133 cbz r3, 800340c <tcp_receive+0x62c> if (recv_data) { 80033fe: | | | | | | f8d5 00f0 ldr.w r0, [r5, #240] @ 0xf0 8003402: | | | | /-----|--|-- b338 cbz r0, 8003454 <tcp_receive+0x674> pbuf_cat(recv_data, cseg->p); 8003404: | | | | | | | f7ff f93a bl 800267c <pbuf_cat> cseg->p = NULL; 8003408: | | | | | /--|--|-> 2300 movs r3, #0 800340a: | | | | | | | | 6073 str r3, [r6, #4] if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) { 800340c: | | | | | | | \-> 6933 ldr r3, [r6, #16] 800340e: | | | | | | | 899b ldrh r3, [r3, #12] 8003410: | | | | | | | ba5b rev16 r3, r3 8003412: | | | | | | | 07db lsls r3, r3, #31 8003414: | | | | | | | /-- d50a bpl.n 800342c <tcp_receive+0x64c> recv_flags |= TF_GOT_FIN; 8003416: | | | | | | | | f895 30f4 ldrb.w r3, [r5, #244] @ 0xf4 800341a: | | | | | | | | f043 0320 orr.w r3, r3, #32 800341e: | | | | | | | | f885 30f4 strb.w r3, [r5, #244] @ 0xf4 if (pcb->state == ESTABLISHED) { /* force passive close or we can move to active close */ 8003422: | | | | | | | | 7d23 ldrb r3, [r4, #20] 8003424: | | | | | | | | 2b04 cmp r3, #4 pcb->state = CLOSE_WAIT; 8003426: | | | | | | | | bf04 itt eq 8003428: | | | | | | | | 2307 moveq r3, #7 800342a: | | | | | | | | 7523 strbeq r3, [r4, #20] pcb->ooseq = cseg->next; 800342c: | | | | | | | \-> 6833 ldr r3, [r6, #0] 800342e: | | | | | | | 6763 str r3, [r4, #116] @ 0x74 tcp_seg_free(cseg); 8003430: | | | | | | | 4630 mov r0, r6 8003432: | | | | | | | f7ff f9e3 bl 80027fc <tcp_seg_free> while (pcb->ooseq != NULL && 8003436: | | | \--|--|--|----> 6f66 ldr r6, [r4, #116] @ 0x74 8003438: | | | | | | /-- b126 cbz r6, 8003444 <tcp_receive+0x664> pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) { 800343a: | | | | | | | 6933 ldr r3, [r6, #16] 800343c: | | | | | | | 6a61 ldr r1, [r4, #36] @ 0x24 800343e: | | | | | | | 685a ldr r2, [r3, #4] while (pcb->ooseq != NULL && 8003440: | | | | | | | 428a cmp r2, r1 8003442: | | | | | \--|-- d0af beq.n 80033a4 <tcp_receive+0x5c4> tcp_ack(pcb); 8003444: | | | | | \-> 8b63 ldrh r3, [r4, #26] 8003446: | | | | | 07d8 lsls r0, r3, #31 8003448: | | | | | /----- d507 bpl.n 800345a <tcp_receive+0x67a> 800344a: | | | | | | f023 0301 bic.w r3, r3, #1 tcp_ack_now(pcb); 800344e: | | | /-----------|--|--|----> f043 0302 orr.w r3, r3, #2 8003452: | | | | | | | /-- e004 b.n 800345e <tcp_receive+0x67e> recv_data = cseg->p; 8003454: | | | | \--|--|--|-> f8c5 10f0 str.w r1, [r5, #240] @ 0xf0 8003458: | | | | \--|--|-- e7d6 b.n 8003408 <tcp_receive+0x628> tcp_ack(pcb); 800345a: | | | | \--|-> f043 0301 orr.w r3, r3, #1 tcp_ack_now(pcb); 800345e: | | | | \-> 8363 strh r3, [r4, #26] } 8003460: | | | | /-------------------> b003 add sp, #12 8003462: | | | | | e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} if (pcb->ooseq == NULL) { 8003466: | | \--------------------------|--|-------------------> 6f66 ldr r6, [r4, #116] @ 0x74 8003468: | | | | /-- b93e cbnz r6, 800347a <tcp_receive+0x69a> pcb->ooseq = tcp_seg_copy(&inseg); 800346a: | | | | | f005 fd9f bl 8008fac <tcp_seg_copy.constprop.0> 800346e: | | | | | 6760 str r0, [r4, #116] @ 0x74 tcp_send_empty_ack(pcb); 8003470: | >--------------------------------|--|-----------------|-> 4620 mov r0, r4 } 8003472: | | | | | b003 add sp, #12 8003474: | | | | | e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr} tcp_send_empty_ack(pcb); 8003478: | | | | | e476 b.n 8002d68 <tcp_send_empty_ack> struct tcp_seg *next, *prev = NULL; 800347a: | | | | \-> 2700 movs r7, #0 if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno + 1, next->tcphdr->seqno - 1)) { 800347c: | | | | f103 3cff add.w ip, r3, #4294967295 @ 0xffffffff if (seqno == next->tcphdr->seqno) { 8003480: | | | | /-------> 6930 ldr r0, [r6, #16] 8003482: | | | | | 6842 ldr r2, [r0, #4] 8003484: | | | | | 4293 cmp r3, r2 8003486: | | | | /--|-------- d112 bne.n 80034ae <tcp_receive+0x6ce> if (inseg.len > next->len) { 8003488: | | | | | | f8b5 20e4 ldrh.w r2, [r5, #228] @ 0xe4 800348c: | | | | | | 8933 ldrh r3, [r6, #8] 800348e: | | | | | | 429a cmp r2, r3 8003490: | +--------------------------------|--|--------|--|-------- d9ee bls.n 8003470 <tcp_receive+0x690> struct tcp_seg *cseg = tcp_seg_copy(&inseg); 8003492: | | | | | | f005 fd8b bl 8008fac <tcp_seg_copy.constprop.0> if (cseg != NULL) { 8003496: | | | | | | 2800 cmp r0, #0 8003498: | +--------------------------------|--|--------|--|-------- d0ea beq.n 8003470 <tcp_receive+0x690> if (prev != NULL) { 800349a: | | | | | | /-- b137 cbz r7, 80034aa <tcp_receive+0x6ca> prev->next = cseg; 800349c: | | | | | | | 6038 str r0, [r7, #0] tcp_oos_insert_segment(cseg, next); 800349e: | | | | | | /--|-> 4631 mov r1, r6 tcp_oos_insert_segment(cseg, next); 80034a0: | | | | /--|--|--|--|-> f7ff f9f0 bl 8002884 <tcp_oos_insert_segment> 80034a4: | +--------------------------------|--|-----|--|--|--|--|-- e7e4 b.n 8003470 <tcp_receive+0x690> 80034a6: | | | | /--|--|--|--|--|-> 460e mov r6, r1 80034a8: | | | | | | | \--|--|-- e7ea b.n 8003480 <tcp_receive+0x6a0> pcb->ooseq = cseg; 80034aa: | | | | | | | | \-> 6760 str r0, [r4, #116] @ 0x74 tcp_oos_insert_segment(cseg, next); 80034ac: | | | | | | | +----- e7f7 b.n 800349e <tcp_receive+0x6be> if (prev == NULL) { 80034ae: | | | | | | \-----|--/-X b947 cbnz r7, 80034c2 <tcp_receive+0x6e2> if (TCP_SEQ_LT(seqno, next->tcphdr->seqno)) { 80034b0: | | | | | | | | 1a99 subs r1, r3, r2 80034b2: | | | | | | | | 2900 cmp r1, #0 80034b4: | | | | | | /--|--|-- da32 bge.n 800351c <tcp_receive+0x73c> struct tcp_seg *cseg = tcp_seg_copy(&inseg); 80034b6: | | | | | | | | | f005 fd79 bl 8008fac <tcp_seg_copy.constprop.0> if (cseg != NULL) { 80034ba: | | | | | | | | | 2800 cmp r0, #0 80034bc: | +--------------------------------|--|--|--|-----|--|--|-- d0d8 beq.n 8003470 <tcp_receive+0x690> pcb->ooseq = cseg; 80034be: | | | | | | | | | 6760 str r0, [r4, #116] @ 0x74 80034c0: | | | | | | | \--|-- e7ed b.n 800349e <tcp_receive+0x6be> if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno + 1, next->tcphdr->seqno - 1)) { 80034c2: | | | | | | | \-> 6939 ldr r1, [r7, #16] 80034c4: | | | | | | | 6849 ldr r1, [r1, #4] 80034c6: | | | | | | | ebac 0101 sub.w r1, ip, r1 80034ca: | | | | | | | 2900 cmp r1, #0 80034cc: | | | | | | +-------- db26 blt.n 800351c <tcp_receive+0x73c> 80034ce: | | | | | | | 1ad1 subs r1, r2, r3 80034d0: | | | | | | | 2901 cmp r1, #1 80034d2: | | | | | | +-------- d423 bmi.n 800351c <tcp_receive+0x73c> struct tcp_seg *cseg = tcp_seg_copy(&inseg); 80034d4: | | | | | | | f005 fd6a bl 8008fac <tcp_seg_copy.constprop.0> if (cseg != NULL) { 80034d8: | | | | | | | 4680 mov r8, r0 80034da: | | | | | | | 2800 cmp r0, #0 80034dc: | +--------------------------------|--|--|--|-----|-------- d0c8 beq.n 8003470 <tcp_receive+0x690> if (TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) { 80034de: | | | | | | | 693b ldr r3, [r7, #16] 80034e0: | | | | | | | f8d5 10c8 ldr.w r1, [r5, #200] @ 0xc8 80034e4: | | | | | | | 685a ldr r2, [r3, #4] 80034e6: | | | | | | | 893b ldrh r3, [r7, #8] 80034e8: | | | | | | | 4413 add r3, r2 80034ea: | | | | | | | 1acb subs r3, r1, r3 80034ec: | | | | | | | 2b00 cmp r3, #0 80034ee: | | | | | | | /-- da05 bge.n 80034fc <tcp_receive+0x71c> prev->len = (u16_t)(seqno - prev->tcphdr->seqno); 80034f0: | | | | | | | | 1a89 subs r1, r1, r2 80034f2: | | | | | | | | b289 uxth r1, r1 pbuf_realloc(prev->p, prev->len); 80034f4: | | | | | | | | 6878 ldr r0, [r7, #4] prev->len = (u16_t)(seqno - prev->tcphdr->seqno); 80034f6: | | | | | | | | 8139 strh r1, [r7, #8] pbuf_realloc(prev->p, prev->len); 80034f8: | | | | | | | | f7fe fa34 bl 8001964 <pbuf_realloc> prev->next = cseg; 80034fc: | | | | | | | \-> f8c7 8000 str.w r8, [r7] tcp_oos_insert_segment(cseg, next); 8003500: | | | | | | | 4631 mov r1, r6 8003502: | | | | | | | 4640 mov r0, r8 8003504: | | | | | \-----|-------- e7cc b.n 80034a0 <tcp_receive+0x6c0> 8003506: | | | | | | bf00 nop 8003508: | | | | | | 20000060 .word 0x20000060 800350c: | | | | | | 0800bc93 .word 0x0800bc93 8003510: | | | | | | 0800b591 .word 0x0800b591 8003514: | | | | | | 0800b232 .word 0x0800b232 8003518: | | | | | | 0800bcb1 .word 0x0800bcb1 if (next->next == NULL && 800351c: | | | | | \-------> 6831 ldr r1, [r6, #0] 800351e: | | | | | 4637 mov r7, r6 8003520: | | | | | 2900 cmp r1, #0 8003522: | | | | \----------------- d1c0 bne.n 80034a6 <tcp_receive+0x6c6> TCP_SEQ_GT(seqno, next->tcphdr->seqno)) { 8003524: | | | | 1ad2 subs r2, r2, r3 if (next->next == NULL && 8003526: | | | | 2a00 cmp r2, #0 8003528: | +--------------------------------|--|-------------------- daa2 bge.n 8003470 <tcp_receive+0x690> if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) { 800352a: | | | | 8983 ldrh r3, [r0, #12] 800352c: | | | | ba5b rev16 r3, r3 800352e: | | | | 07d9 lsls r1, r3, #31 8003530: | +--------------------------------|--|-------------------- d49e bmi.n 8003470 <tcp_receive+0x690> next->next = tcp_seg_copy(&inseg); 8003532: | | | | f005 fd3b bl 8008fac <tcp_seg_copy.constprop.0> 8003536: | | | | 6030 str r0, [r6, #0] if (next->next != NULL) { 8003538: | | | | 2800 cmp r0, #0 800353a: | +--------------------------------|--|-------------------- d099 beq.n 8003470 <tcp_receive+0x690> if (TCP_SEQ_GT(next->tcphdr->seqno + next->len, seqno)) { 800353c: | | | | 6933 ldr r3, [r6, #16] 800353e: | | | | f8d5 10c8 ldr.w r1, [r5, #200] @ 0xc8 8003542: | | | | 685a ldr r2, [r3, #4] 8003544: | | | | 8933 ldrh r3, [r6, #8] 8003546: | | | | 4413 add r3, r2 8003548: | | | | 1acb subs r3, r1, r3 800354a: | | | | 2b00 cmp r3, #0 800354c: | | | | /-- da05 bge.n 800355a <tcp_receive+0x77a> next->len = (u16_t)(seqno - next->tcphdr->seqno); 800354e: | | | | | 1a89 subs r1, r1, r2 8003550: | | | | | b289 uxth r1, r1 pbuf_realloc(next->p, next->len); 8003552: | | | | | 6870 ldr r0, [r6, #4] next->len = (u16_t)(seqno - next->tcphdr->seqno); 8003554: | | | | | 8131 strh r1, [r6, #8] pbuf_realloc(next->p, next->len); 8003556: | | | | | f7fe fa05 bl 8001964 <pbuf_realloc> if (TCP_SEQ_GT((u32_t)tcplen + seqno, pcb->rcv_nxt + (u32_t)pcb->rcv_wnd)) { 800355a: | | | | \-> f8d5 c0c8 ldr.w ip, [r5, #200] @ 0xc8 800355e: | | | | f8b5 30d4 ldrh.w r3, [r5, #212] @ 0xd4 8003562: | | | | 6a67 ldr r7, [r4, #36] @ 0x24 8003564: | | | | 8d21 ldrh r1, [r4, #40] @ 0x28 8003566: | | | | 4463 add r3, ip 8003568: | | | | 1afb subs r3, r7, r3 800356a: | | | | 42cb cmn r3, r1 800356c: | +--------------------------------|--|-------------------- d580 bpl.n 8003470 <tcp_receive+0x690> if (TCPH_FLAGS(next->next->tcphdr) & TCP_FIN) { 800356e: | | | | 6830 ldr r0, [r6, #0] 8003570: | | | | f8d0 e010 ldr.w lr, [r0, #16] 8003574: | | | | f8be 200c ldrh.w r2, [lr, #12] 8003578: | | | | fa1f f882 uxth.w r8, r2 800357c: | | | | ba52 rev16 r2, r2 800357e: | | | | b293 uxth r3, r2 8003580: | | | | 07d2 lsls r2, r2, #31 8003582: | | | | /-- d507 bpl.n 8003594 <tcp_receive+0x7b4> TCPH_FLAGS_SET(next->next->tcphdr, TCPH_FLAGS(next->next->tcphdr) & ~TCP_FIN); 8003584: | | | | | 021b lsls r3, r3, #8 8003586: | | | | | f403 5378 and.w r3, r3, #15872 @ 0x3e00 800358a: | | | | | f428 527c bic.w r2, r8, #16128 @ 0x3f00 800358e: | | | | | 4313 orrs r3, r2 8003590: | | | | | f8ae 300c strh.w r3, [lr, #12] next->next->len = (u16_t)(pcb->rcv_nxt + pcb->rcv_wnd - seqno); 8003594: | | | | \-> eba1 010c sub.w r1, r1, ip 8003598: | | | | 4439 add r1, r7 800359a: | | | | b289 uxth r1, r1 800359c: | | | | 8101 strh r1, [r0, #8] pbuf_realloc(next->next->p, next->next->len); 800359e: | | | | 6840 ldr r0, [r0, #4] 80035a0: | | | | f7fe f9e0 bl 8001964 <pbuf_realloc> tcplen = TCP_TCPLEN(next->next); 80035a4: | | | | 6832 ldr r2, [r6, #0] LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd", 80035a6: | | | | 6a61 ldr r1, [r4, #36] @ 0x24 tcplen = TCP_TCPLEN(next->next); 80035a8: | | | | 6913 ldr r3, [r2, #16] 80035aa: | | | | 8912 ldrh r2, [r2, #8] 80035ac: | | | | 899b ldrh r3, [r3, #12] 80035ae: | | | | ba5b rev16 r3, r3 80035b0: | | | | f013 0303 ands.w r3, r3, #3 80035b4: | | | | bf18 it ne 80035b6: | | | | 2301 movne r3, #1 80035b8: | | | | 4413 add r3, r2 LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd", 80035ba: | | | | f8d5 20c8 ldr.w r2, [r5, #200] @ 0xc8 tcplen = TCP_TCPLEN(next->next); 80035be: | | | | b29b uxth r3, r3 80035c0: | | | | f8a5 30d4 strh.w r3, [r5, #212] @ 0xd4 LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd", 80035c4: | | | | 4413 add r3, r2 80035c6: | | | | 8d22 ldrh r2, [r4, #40] @ 0x28 80035c8: | | | | 440a add r2, r1 80035ca: | | | | 4293 cmp r3, r2 80035cc: | +--------------------------------|--|-------------------- f43f af50 beq.w 8003470 <tcp_receive+0x690> 80035d0: | | | | b672 cpsid i 80035d2: | | | | 4b0c ldr r3, [pc, #48] @ (8003604 ) 80035d4: | | | | 4a0c ldr r2, [pc, #48] @ (8003608 ) 80035d6: | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80035da: | | | | 4b0c ldr r3, [pc, #48] @ (800360c ) 80035dc: | | | | 9300 str r3, [sp, #0] 80035de: | | | | 480c ldr r0, [pc, #48] @ (8003610 ) 80035e0: | | | | f240 63fe movw r3, #1790 @ 0x6fe 80035e4: | | | | f7fd fe88 bl 80012f8 <printf_> 80035e8: | | | | be00 bkpt 0x0000 80035ea: | \--------------------------------|--|-------------------- e741 b.n 8003470 <tcp_receive+0x690> if (!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd - 1)) { 80035ec: \-----------------------------------|--|-------------------> 1ad1 subs r1, r2, r3 80035ee: | | 2900 cmp r1, #0 80035f0: | | /-- db05 blt.n 80035fe <tcp_receive+0x81e> 80035f2: | | | 1a9b subs r3, r3, r2 80035f4: | | | 8d22 ldrh r2, [r4, #40] @ 0x28 80035f6: | | | 3b01 subs r3, #1 80035f8: | | | 42d3 cmn r3, r2 80035fa: | \-----------------|-- f57f af31 bpl.w 8003460 <tcp_receive+0x680> tcp_ack_now(pcb); 80035fe: | \-> 8b63 ldrh r3, [r4, #26] 8003600: \----------------------- e725 b.n 800344e <tcp_receive+0x66e> 8003602: bf00 nop 8003604: 20000060 .word 0x20000060 8003608: 0800bc23 .word 0x0800bc23 800360c: 0800b591 .word 0x0800b591 8003610: 0800b232 .word 0x0800b232 08003614 : { 8003614: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} LWIP_ASSERT("tcp_output: invalid pcb", pcb != NULL); 8003618: 4604 mov r4, r0 { 800361a: b087 sub sp, #28 LWIP_ASSERT("tcp_output: invalid pcb", pcb != NULL); 800361c: /-- b960 cbnz r0, 8003638 <tcp_output+0x24> 800361e: | b672 cpsid i 8003620: | 4ba5 ldr r3, [pc, #660] @ (80038b8 ) 8003622: | 4aa6 ldr r2, [pc, #664] @ (80038bc ) 8003624: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003628: | 4ba5 ldr r3, [pc, #660] @ (80038c0 ) 800362a: | 9300 str r3, [sp, #0] 800362c: | 48a5 ldr r0, [pc, #660] @ (80038c4 ) 800362e: | f240 43e5 movw r3, #1253 @ 0x4e5 8003632: | f7fd fe61 bl 80012f8 <printf_> 8003636: | be00 bkpt 0x0000 LWIP_ASSERT("don't call tcp_output for listen-pcbs", 8003638: \-> 7d23 ldrb r3, [r4, #20] 800363a: 2b01 cmp r3, #1 800363c: /-- d10c bne.n 8003658 <tcp_output+0x44> 800363e: | b672 cpsid i 8003640: | 4b9d ldr r3, [pc, #628] @ (80038b8 ) 8003642: | 4aa1 ldr r2, [pc, #644] @ (80038c8 ) 8003644: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003648: | 4b9d ldr r3, [pc, #628] @ (80038c0 ) 800364a: | 9300 str r3, [sp, #0] 800364c: | 489d ldr r0, [pc, #628] @ (80038c4 ) 800364e: | f240 43e7 movw r3, #1255 @ 0x4e7 8003652: | f7fd fe51 bl 80012f8 <printf_> 8003656: | be00 bkpt 0x0000 if (tcp_input_pcb == pcb) { 8003658: \-> f8df 8278 ldr.w r8, [pc, #632] @ 80038d4 800365c: f8d8 30f8 ldr.w r3, [r8, #248] @ 0xf8 8003660: 42a3 cmp r3, r4 8003662: /-------------- f000 8087 beq.w 8003774 <tcp_output+0x160> seg = pcb->unsent; 8003666: | 6ee5 ldr r5, [r4, #108] @ 0x6c wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd); 8003668: | f8b4 9048 ldrh.w r9, [r4, #72] @ 0x48 800366c: | f8b4 6060 ldrh.w r6, [r4, #96] @ 0x60 if (seg == NULL) { 8003670: | /-- b945 cbnz r5, 8003684 <tcp_output+0x70> if (pcb->flags & TF_ACK_NOW) { 8003672: | /--|-> 8b63 ldrh r3, [r4, #26] 8003674: | | | 079a lsls r2, r3, #30 8003676: | /-----|--|-- d579 bpl.n 800376c <tcp_output+0x158> return tcp_send_empty_ack(pcb); 8003678: | | | | 4620 mov r0, r4 } 800367a: | | | | b007 add sp, #28 800367c: | | | | e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} return tcp_send_empty_ack(pcb); 8003680: | | | | f7ff bb72 b.w 8002d68 <tcp_send_empty_ack> netif = tcp_route(pcb, &pcb->local_ip, &pcb->remote_ip); 8003684: | | | \-> 1d23 adds r3, r4, #4 8003686: | | | 4619 mov r1, r3 8003688: | | | 4620 mov r0, r4 800368a: | | | 9305 str r3, [sp, #20] 800368c: | | | f006 fb16 bl 8009cbc <tcp_route.isra.0> if (netif == NULL) { 8003690: | | | 4607 mov r7, r0 8003692: | | | 2800 cmp r0, #0 8003694: /--------------|--|-----|----- f000 8177 beq.w 8003986 <tcp_output+0x372> if (ip_addr_isany(&pcb->local_ip)) { 8003698: | | | | 6823 ldr r3, [r4, #0] 800369a: | | | | /-- b90b cbnz r3, 80036a0 <tcp_output+0x8c> ip_addr_copy(pcb->local_ip, *local_ip); 800369c: | | | | | 6803 ldr r3, [r0, #0] 800369e: | | | | | 6023 str r3, [r4, #0] wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd); 80036a0: | | | | \-> 45b1 cmp r9, r6 80036a2: | | | | 464b mov r3, r9 80036a4: | | | | bf28 it cs 80036a6: | | | | 4633 movcs r3, r6 80036a8: | | | | 9304 str r3, [sp, #16] if (lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd) { 80036aa: | | | | 692b ldr r3, [r5, #16] 80036ac: | | | | 6858 ldr r0, [r3, #4] 80036ae: | | | | f004 fd41 bl 8008134 <lwip_htonl> 80036b2: | | | | 6c62 ldr r2, [r4, #68] @ 0x44 80036b4: | | | | 892b ldrh r3, [r5, #8] 80036b6: | | | | 1a9b subs r3, r3, r2 80036b8: | | | | 9a04 ldr r2, [sp, #16] 80036ba: | | | | 4403 add r3, r0 80036bc: | | | | 4293 cmp r3, r2 80036be: | | | | /-- d90f bls.n 80036e0 <tcp_output+0xcc> if (wnd == pcb->snd_wnd && pcb->unacked == NULL && pcb->persist_backoff == 0) { 80036c0: | | | | | 45b1 cmp r9, r6 80036c2: | | | +--|-- d3d6 bcc.n 8003672 <tcp_output+0x5e> 80036c4: | | | | | 6f23 ldr r3, [r4, #112] @ 0x70 80036c6: | | | | | 2b00 cmp r3, #0 80036c8: | | | +--|-- d1d3 bne.n 8003672 <tcp_output+0x5e> 80036ca: | | | | | f894 3099 ldrb.w r3, [r4, #153] @ 0x99 80036ce: | | | | | 2b00 cmp r3, #0 80036d0: | | | +--|-- d1cf bne.n 8003672 <tcp_output+0x5e> pcb->persist_cnt = 0; 80036d2: | | | | | f44f 7280 mov.w r2, #256 @ 0x100 80036d6: | | | | | f8a4 2098 strh.w r2, [r4, #152] @ 0x98 pcb->persist_probe = 0; 80036da: | | | | | f884 309a strb.w r3, [r4, #154] @ 0x9a 80036de: | | | \--|-- e7c8 b.n 8003672 <tcp_output+0x5e> useg = pcb->unacked; 80036e0: | | | \-> 6f26 ldr r6, [r4, #112] @ 0x70 pcb->persist_backoff = 0; 80036e2: | | | 2300 movs r3, #0 80036e4: | | | f884 3099 strb.w r3, [r4, #153] @ 0x99 if (useg != NULL) { 80036e8: | /-----------|--|----------- b126 cbz r6, 80036f4 <tcp_output+0xe0> for (; useg->next != NULL; useg = useg->next); 80036ea: | | | | /-> 4633 mov r3, r6 80036ec: | | | | | 6836 ldr r6, [r6, #0] 80036ee: | | | | | 2e00 cmp r6, #0 80036f0: | | | | \-- d1fb bne.n 80036ea <tcp_output+0xd6> 80036f2: | | | | 461e mov r6, r3 lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) { 80036f4: | >-----------|--|----------> f8d5 9010 ldr.w r9, [r5, #16] 80036f8: | | | | f8d9 0004 ldr.w r0, [r9, #4] 80036fc: | | | | f004 fd1a bl 8008134 <lwip_htonl> 8003700: | | | | 6c63 ldr r3, [r4, #68] @ 0x44 8003702: | | | | 1ac0 subs r0, r0, r3 8003704: | | | | 892b ldrh r3, [r5, #8] 8003706: | | | | 4418 add r0, r3 while (seg != NULL && 8003708: | | | | 9b04 ldr r3, [sp, #16] 800370a: | | | | 4298 cmp r0, r3 800370c: | | | | /-------- d829 bhi.n 8003762 <tcp_output+0x14e> LWIP_ASSERT("RST not expected here!", 800370e: | | | | | f8b9 300c ldrh.w r3, [r9, #12] 8003712: | | | | | ba5b rev16 r3, r3 8003714: | | | | | 075b lsls r3, r3, #29 8003716: | | | | | /-- d50c bpl.n 8003732 <tcp_output+0x11e> 8003718: | | | | | | b672 cpsid i 800371a: | | | | | | 4b67 ldr r3, [pc, #412] @ (80038b8 ) 800371c: | | | | | | 4a6b ldr r2, [pc, #428] @ (80038cc ) 800371e: | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003722: | | | | | | 4b67 ldr r3, [pc, #412] @ (80038c0 ) 8003724: | | | | | | 9300 str r3, [sp, #0] 8003726: | | | | | | 4867 ldr r0, [pc, #412] @ (80038c4 ) 8003728: | | | | | | f240 533a movw r3, #1338 @ 0x53a 800372c: | | | | | | f7fd fde4 bl 80012f8 <printf_> 8003730: | | | | | | be00 bkpt 0x0000 if ((tcp_do_output_nagle(pcb) == 0) && 8003732: | | | | | \-> 6f23 ldr r3, [r4, #112] @ 0x70 8003734: | | | | | /----- b303 cbz r3, 8003778 <tcp_output+0x164> 8003736: | | | | | | 8b62 ldrh r2, [r4, #26] 8003738: | | | | | | f012 0f44 tst.w r2, #68 @ 0x44 800373c: | | | | | +----- d11c bne.n 8003778 <tcp_output+0x164> 800373e: | | | | | | 6ee3 ldr r3, [r4, #108] @ 0x6c 8003740: | | | | | | /-- b12b cbz r3, 800374e <tcp_output+0x13a> 8003742: | | | | | | | 6819 ldr r1, [r3, #0] 8003744: | | | | | +--|-- b9c1 cbnz r1, 8003778 <tcp_output+0x164> 8003746: | | | | | | | 8919 ldrh r1, [r3, #8] 8003748: | | | | | | | 8e63 ldrh r3, [r4, #50] @ 0x32 800374a: | | | | | | | 4299 cmp r1, r3 800374c: | | | | | +--|-- d214 bcs.n 8003778 <tcp_output+0x164> 800374e: | | | | | | \-> f8b4 3064 ldrh.w r3, [r4, #100] @ 0x64 8003752: | | | | | +----- b18b cbz r3, 8003778 <tcp_output+0x164> 8003754: | | | | | | f8b4 3066 ldrh.w r3, [r4, #102] @ 0x66 8003758: | | | | | | 2b07 cmp r3, #7 800375a: | | | | | +----- d80d bhi.n 8003778 <tcp_output+0x164> 800375c: | | | | | | f012 0fa0 tst.w r2, #160 @ 0xa0 8003760: | | | | | +----- d10a bne.n 8003778 <tcp_output+0x164> if (pcb->unsent == NULL) { 8003762: | | | | \--|----> 6ee3 ldr r3, [r4, #108] @ 0x6c 8003764: | | | +-----|----- b913 cbnz r3, 800376c <tcp_output+0x158> pcb->unsent_oversize = 0; 8003766: | | /-----|--|-----|----> 2300 movs r3, #0 8003768: | | | | | | f8a4 3068 strh.w r3, [r4, #104] @ 0x68 tcp_clear_flags(pcb, TF_NAGLEMEMERR); 800376c: | | | | \-----|----> 8b63 ldrh r3, [r4, #26] 800376e: | | | | | f023 0380 bic.w r3, r3, #128 @ 0x80 8003772: | | | | | 8363 strh r3, [r4, #26] return ERR_OK; 8003774: | | | \--------|----> 2000 movs r0, #0 8003776: | | /--|--------------|----- e083 b.n 8003880 <tcp_output+0x26c> if (pcb->state != SYN_SENT) { 8003778: | | | | \----> 7d23 ldrb r3, [r4, #20] 800377a: | | | | 2b02 cmp r3, #2 TCPH_SET_FLAG(seg->tcphdr, TCP_ACK); 800377c: | | | | bf1f itttt ne 800377e: | | | | 692a ldrne r2, [r5, #16] 8003780: | | | | 8993 ldrhne r3, [r2, #12] 8003782: | | | | f443 5380 orrne.w r3, r3, #4096 @ 0x1000 8003786: | | | | 8193 strhne r3, [r2, #12] if (tcp_output_segment_busy(seg)) { 8003788: | | | | 4628 mov r0, r5 800378a: | | | | f7fe fb17 bl 8001dbc <tcp_output_segment_busy> 800378e: | | | | 2800 cmp r0, #0 8003790: | | | | /----------- f040 80a2 bne.w 80038d8 <tcp_output+0x2c4> seg->tcphdr->ackno = lwip_htonl(pcb->rcv_nxt); 8003794: | | | | | f8d4 9024 ldr.w r9, [r4, #36] @ 0x24 8003798: | | | | | f8d5 a010 ldr.w sl, [r5, #16] 800379c: | | | | | 4648 mov r0, r9 800379e: | | | | | f004 fcc9 bl 8008134 <lwip_htonl> seg->tcphdr->wnd = lwip_htons(TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd))); 80037a2: | | | | | 8d63 ldrh r3, [r4, #42] @ 0x2a seg->tcphdr->ackno = lwip_htonl(pcb->rcv_nxt); 80037a4: | | | | | f8ca 0008 str.w r0, [sl, #8] 80037a8: | | | | | ba5a rev16 r2, r3 pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd; 80037aa: | | | | | 444b add r3, r9 seg->tcphdr->wnd = lwip_htons(TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd))); 80037ac: | | | | | f8aa 200e strh.w r2, [sl, #14] pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd; 80037b0: | | | | | 62e3 str r3, [r4, #44] @ 0x2c if (seg->flags & TF_SEG_OPTS_MSS) { 80037b2: | | | | | f895 900c ldrb.w r9, [r5, #12] 80037b6: | | | | | f019 0901 ands.w r9, r9, #1 80037ba: | | | | | /----- d164 bne.n 8003886 <tcp_output+0x272> opts = (u32_t *)(void *)(seg->tcphdr + 1); 80037bc: | | | | | | f10a 0b14 add.w fp, sl, #20 if (pcb->rtime < 0) { 80037c0: | | | | | /--|----> f9b4 3030 ldrsh.w r3, [r4, #48] @ 0x30 80037c4: | | | | | | | 2b00 cmp r3, #0 pcb->rtime = 0; 80037c6: | | | | | | | bfbc itt lt 80037c8: | | | | | | | 2300 movlt r3, #0 80037ca: | | | | | | | 8623 strhlt r3, [r4, #48] @ 0x30 if (pcb->rttest == 0) { 80037cc: | | | | | | | 6b63 ldr r3, [r4, #52] @ 0x34 80037ce: | | | | | | | /-- b93b cbnz r3, 80037e0 <tcp_output+0x1cc> pcb->rttest = tcp_ticks; 80037d0: | | | | | | | | f8d8 30d8 ldr.w r3, [r8, #216] @ 0xd8 80037d4: | | | | | | | | 6363 str r3, [r4, #52] @ 0x34 pcb->rtseq = lwip_ntohl(seg->tcphdr->seqno); 80037d6: | | | | | | | | f8da 0004 ldr.w r0, [sl, #4] 80037da: | | | | | | | | f004 fcab bl 8008134 <lwip_htonl> 80037de: | | | | | | | | 63a0 str r0, [r4, #56] @ 0x38 len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload); 80037e0: | | | | | | | \-> 686b ldr r3, [r5, #4] 80037e2: | | | | | | | 685a ldr r2, [r3, #4] seg->p->len -= len; 80037e4: | | | | | | | 8959 ldrh r1, [r3, #10] seg->p->payload = seg->tcphdr; 80037e6: | | | | | | | f8c3 a004 str.w sl, [r3, #4] len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload); 80037ea: | | | | | | | ebaa 0202 sub.w r2, sl, r2 80037ee: | | | | | | | b292 uxth r2, r2 seg->p->len -= len; 80037f0: | | | | | | | 1a89 subs r1, r1, r2 80037f2: | | | | | | | 8159 strh r1, [r3, #10] seg->p->tot_len -= len; 80037f4: | | | | | | | 8919 ldrh r1, [r3, #8] 80037f6: | | | | | | | 1a8a subs r2, r1, r2 80037f8: | | | | | | | 811a strh r2, [r3, #8] seg->tcphdr->chksum = 0; 80037fa: | | | | | | | 2300 movs r3, #0 LWIP_ASSERT("options not filled", (u8_t *)opts == ((u8_t *)(seg->tcphdr + 1)) + LWIP_TCP_OPT_LENGTH_SEGMENT(seg->flags, pcb)); 80037fc: | | | | | | | 4599 cmp r9, r3 seg->tcphdr->chksum = 0; 80037fe: | | | | | | | f88a 3010 strb.w r3, [sl, #16] 8003802: | | | | | | | f88a 3011 strb.w r3, [sl, #17] LWIP_ASSERT("options not filled", (u8_t *)opts == ((u8_t *)(seg->tcphdr + 1)) + LWIP_TCP_OPT_LENGTH_SEGMENT(seg->flags, pcb)); 8003806: | | | | | | | bf0c ite eq 8003808: | | | | | | | 2314 moveq r3, #20 800380a: | | | | | | | 2318 movne r3, #24 800380c: | | | | | | | 449a add sl, r3 800380e: | | | | | | | 45d3 cmp fp, sl 8003810: | | | | | | | /-- d00c beq.n 800382c <tcp_output+0x218> 8003812: | | | | | | | | b672 cpsid i 8003814: | | | | | | | | 4b28 ldr r3, [pc, #160] @ (80038b8 ) 8003816: | | | | | | | | 4a2e ldr r2, [pc, #184] @ (80038d0 ) 8003818: | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 800381c: | | | | | | | | 4b28 ldr r3, [pc, #160] @ (80038c0 ) 800381e: | | | | | | | | 9300 str r3, [sp, #0] 8003820: | | | | | | | | 4828 ldr r0, [pc, #160] @ (80038c4 ) 8003822: | | | | | | | | f44f 63c4 mov.w r3, #1568 @ 0x620 8003826: | | | | | | | | f7fd fd67 bl 80012f8 <printf_> 800382a: | | | | | | | | be00 bkpt 0x0000 seg->tcphdr->chksum = ip_chksum_pseudo(seg->p, IP_PROTO_TCP, 800382c: | | | | | | | \-> f8d5 9004 ldr.w r9, [r5, #4] 8003830: | | | | | | | f8d4 a000 ldr.w sl, [r4] 8003834: | | | | | | | 6863 ldr r3, [r4, #4] 8003836: | | | | | | | f8b9 2008 ldrh.w r2, [r9, #8] 800383a: | | | | | | | f8d5 b010 ldr.w fp, [r5, #16] 800383e: | | | | | | | 9300 str r3, [sp, #0] 8003840: | | | | | | | 2106 movs r1, #6 8003842: | | | | | | | 4653 mov r3, sl 8003844: | | | | | | | 4648 mov r0, r9 8003846: | | | | | | | f006 f83f bl 80098c8 <inet_chksum_pseudo.isra.0> TCP_STATS_INC(tcp.xmit); 800384a: | | | | | | | f8b8 303c ldrh.w r3, [r8, #60] @ 0x3c seg->tcphdr->chksum = ip_chksum_pseudo(seg->p, IP_PROTO_TCP, 800384e: | | | | | | | f8ab 0010 strh.w r0, [fp, #16] TCP_STATS_INC(tcp.xmit); 8003852: | | | | | | | 3301 adds r3, #1 8003854: | | | | | | | f8a8 303c strh.w r3, [r8, #60] @ 0x3c err = ip_output_if(seg->p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 8003858: | | | | | | | 7aa3 ldrb r3, [r4, #10] 800385a: | | | | | | | 9702 str r7, [sp, #8] 800385c: | | | | | | | 2206 movs r2, #6 800385e: | | | | | | | e9cd 3200 strd r3, r2, [sp] 8003862: | | | | | | | f1ba 0f00 cmp.w sl, #0 8003866: | | | | | | | bf0c ite eq 8003868: | | | | | | | 4639 moveq r1, r7 800386a: | | | | | | | 4621 movne r1, r4 800386c: | | | | | | | 7ae3 ldrb r3, [r4, #11] 800386e: | | | | | | | 9a05 ldr r2, [sp, #20] 8003870: | | | | | | | 4648 mov r0, r9 8003872: | | | | | | | f006 fb61 bl 8009f38 <ip4_output_if_src> if (err != ERR_OK) { 8003876: | | | | +--|--|----- b378 cbz r0, 80038d8 <tcp_output+0x2c4> tcp_set_flags(pcb, TF_NAGLEMEMERR); 8003878: | | | | | | | 8b63 ldrh r3, [r4, #26] 800387a: | | | | | | | f043 0380 orr.w r3, r3, #128 @ 0x80 800387e: | | | | | | | 8363 strh r3, [r4, #26] } 8003880: | | >--|--------|--|--|----> b007 add sp, #28 8003882: | | | | | | | e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} mtu = outif->mtu; 8003886: | | | | | | \----> 8db8 ldrh r0, [r7, #44] @ 0x2c if (mtu != 0) { 8003888: | | | | | | /----- b190 cbz r0, 80038b0 <tcp_output+0x29c> mss_s = (mtu > offset) ? (u16_t)(mtu - offset) : 0; 800388a: | | | | | | | 2828 cmp r0, #40 @ 0x28 800388c: | | | | | | | bf38 it cc 800388e: | | | | | | | 2028 movcc r0, #40 @ 0x28 8003890: | | | | | | | 3828 subs r0, #40 @ 0x28 sendmss = LWIP_MIN(sendmss, mss_s); 8003892: | | | | | | | b280 uxth r0, r0 8003894: | | | | | | | f5b0 7f06 cmp.w r0, #536 @ 0x218 8003898: | | | | | | | bf28 it cs 800389a: | | | | | | | f44f 7006 movcs.w r0, #536 @ 0x218 *opts = TCP_BUILD_MSS_OPTION(mss); 800389e: | | | | | | | /-> f040 7001 orr.w r0, r0, #33816576 @ 0x2040000 80038a2: | | | | | | | | f004 fc47 bl 8008134 <lwip_htonl> opts += 1; 80038a6: | | | | | | | | f10a 0b18 add.w fp, sl, #24 *opts = TCP_BUILD_MSS_OPTION(mss); 80038aa: | | | | | | | | f8ca 0014 str.w r0, [sl, #20] opts += 1; 80038ae: | | | | | \--|--|-- e787 b.n 80037c0 <tcp_output+0x1ac> return sendmss; 80038b0: | | | | | \--|-> f44f 7006 mov.w r0, #536 @ 0x218 80038b4: | | | | | \-- e7f3 b.n 800389e <tcp_output+0x28a> 80038b6: | | | | | bf00 nop 80038b8: | | | | | 20000060 .word 0x20000060 80038bc: | | | | | 0800bcd5 .word 0x0800bcd5 80038c0: | | | | | 0800b5cd .word 0x0800b5cd 80038c4: | | | | | 0800b232 .word 0x0800b232 80038c8: | | | | | 0800bced .word 0x0800bced 80038cc: | | | | | 0800bd13 .word 0x0800bd13 80038d0: | | | | | 0800bd2a .word 0x0800bd2a 80038d4: | | | | | 20001158 .word 0x20001158 seg->oversize_left = 0; 80038d8: | | | | \----------> 2300 movs r3, #0 80038da: | | | | 816b strh r3, [r5, #10] pcb->unsent = seg->next; 80038dc: | | | | 682b ldr r3, [r5, #0] 80038de: | | | | 66e3 str r3, [r4, #108] @ 0x6c if (pcb->state != SYN_SENT) { 80038e0: | | | | 7d23 ldrb r3, [r4, #20] snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); 80038e2: | | | | f8d5 a010 ldr.w sl, [r5, #16] if (pcb->state != SYN_SENT) { 80038e6: | | | | 2b02 cmp r3, #2 tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW); 80038e8: | | | | bf1e ittt ne 80038ea: | | | | 8b63 ldrhne r3, [r4, #26] 80038ec: | | | | f023 0303 bicne.w r3, r3, #3 80038f0: | | | | 8363 strhne r3, [r4, #26] snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); 80038f2: | | | | f8da 0004 ldr.w r0, [sl, #4] 80038f6: | | | | f004 fc1d bl 8008134 <lwip_htonl> 80038fa: | | | | f8ba 300c ldrh.w r3, [sl, #12] 80038fe: | | | | 892a ldrh r2, [r5, #8] 8003900: | | | | ba5b rev16 r3, r3 8003902: | | | | f013 0303 ands.w r3, r3, #3 8003906: | | | | bf18 it ne 8003908: | | | | 2301 movne r3, #1 800390a: | | | | 4413 add r3, r2 if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) { 800390c: | | | | 6d22 ldr r2, [r4, #80] @ 0x50 snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); 800390e: | | | | 18c1 adds r1, r0, r3 if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) { 8003910: | | | | 1a52 subs r2, r2, r1 8003912: | | | | 2a00 cmp r2, #0 snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); 8003914: | | | | 4681 mov r9, r0 pcb->snd_nxt = snd_nxt; 8003916: | | | | bfb8 it lt 8003918: | | | | 6521 strlt r1, [r4, #80] @ 0x50 if (TCP_TCPLEN(seg) > 0) { 800391a: | | | | /----------------- b383 cbz r3, 800397e <tcp_output+0x36a> if (pcb->unacked == NULL) { 800391c: | | | | | f8d4 b070 ldr.w fp, [r4, #112] @ 0x70 seg->next = NULL; 8003920: | | | | | 2300 movs r3, #0 8003922: | | | | | 602b str r3, [r5, #0] if (pcb->unacked == NULL) { 8003924: | | | | | f1bb 0f00 cmp.w fp, #0 8003928: | | | | | /-- d102 bne.n 8003930 <tcp_output+0x31c> pcb->unacked = seg; 800392a: | | | | | | 6725 str r5, [r4, #112] @ 0x70 useg = seg; 800392c: | | | | | /--------|-> 462e mov r6, r5 800392e: | | | | | /--|--------|-- e01f b.n 8003970 <tcp_output+0x35c> if (TCP_SEQ_LT(lwip_ntohl(seg->tcphdr->seqno), lwip_ntohl(useg->tcphdr->seqno))) { 8003930: | | | | | | | \-> 6933 ldr r3, [r6, #16] 8003932: | | | | | | | 6858 ldr r0, [r3, #4] 8003934: | | | | | | | f004 fbfe bl 8008134 <lwip_htonl> 8003938: | | | | | | | eba9 0000 sub.w r0, r9, r0 800393c: | | | | | | | 2800 cmp r0, #0 800393e: | | | | | | | /-------- da1c bge.n 800397a <tcp_output+0x366> struct tcp_seg **cur_seg = &(pcb->unacked); 8003940: | | | | | | | | f104 0a70 add.w sl, r4, #112 @ 0x70 TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) { 8003944: | | | | | | | | /----> f8db 3010 ldr.w r3, [fp, #16] 8003948: | | | | | | | | | 6858 ldr r0, [r3, #4] 800394a: | | | | | | | | | f004 fbf3 bl 8008134 <lwip_htonl> 800394e: | | | | | | | | | eba0 0009 sub.w r0, r0, r9 while (*cur_seg && 8003952: | | | | | | | | | 2800 cmp r0, #0 cur_seg = &((*cur_seg)->next ); 8003954: | | | | | | | | | f8da 3000 ldr.w r3, [sl] while (*cur_seg && 8003958: | | | | | | | | | /-- da05 bge.n 8003966 <tcp_output+0x352> cur_seg = &((*cur_seg)->next ); 800395a: | | | | | | | | | | f8d3 b000 ldr.w fp, [r3] 800395e: | | | | | | | | | | 469a mov sl, r3 while (*cur_seg && 8003960: | | | | | | | | | | f1bb 0f00 cmp.w fp, #0 8003964: | | | | | | | | \--|-- d1ee bne.n 8003944 <tcp_output+0x330> seg->next = (*cur_seg); 8003966: | | | | | | | | \-> f8da 3000 ldr.w r3, [sl] 800396a: | | | | | | | | 602b str r3, [r5, #0] (*cur_seg) = seg; 800396c: | | | | | | | | f8ca 5000 str.w r5, [sl] seg = pcb->unsent; 8003970: | | | | | >--|--|-------> 6ee5 ldr r5, [r4, #108] @ 0x6c while (seg != NULL && 8003972: | | | | | | | | 2d00 cmp r5, #0 8003974: | \--|--|--|--|--|--|-------- f47f aebe bne.w 80036f4 <tcp_output+0xe0> 8003978: | | \--|--|--|--|-------- e6f5 b.n 8003766 <tcp_output+0x152> useg->next = seg; 800397a: | | | | | \-------> 6035 str r5, [r6, #0] useg = useg->next; 800397c: | | | | \----------- e7d6 b.n 800392c <tcp_output+0x318> tcp_seg_free(seg); 800397e: | | \--|-------------> 4628 mov r0, r5 8003980: | | | f7fe ff3c bl 80027fc <tcp_seg_free> 8003984: | | \-------------- e7f4 b.n 8003970 <tcp_output+0x35c> return ERR_RTE; 8003986: \-----|----------------------> f06f 0003 mvn.w r0, #3 800398a: \----------------------- e779 b.n 8003880 <tcp_output+0x26c> 0800398c : { 800398c: b513 push {r0, r1, r4, lr} LWIP_ASSERT("pcb != NULL", pcb != NULL); 800398e: 4604 mov r4, r0 8003990: /-- b960 cbnz r0, 80039ac <tcp_close_shutdown_fin+0x20> 8003992: | b672 cpsid i 8003994: | 4b15 ldr r3, [pc, #84] @ (80039ec ) 8003996: | 4a16 ldr r2, [pc, #88] @ (80039f0 ) 8003998: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 800399c: | 4b15 ldr r3, [pc, #84] @ (80039f4 ) 800399e: | 9300 str r3, [sp, #0] 80039a0: | 4815 ldr r0, [pc, #84] @ (80039f8 ) 80039a2: | f44f 73ce mov.w r3, #412 @ 0x19c 80039a6: | f7fd fca7 bl 80012f8 <printf_> 80039aa: | be00 bkpt 0x0000 switch (pcb->state) { 80039ac: \-> 7d23 ldrb r3, [r4, #20] 80039ae: 2b04 cmp r3, #4 80039b0: /-- d003 beq.n 80039ba <tcp_close_shutdown_fin+0x2e> 80039b2: | 2b07 cmp r3, #7 80039b4: /-----|-- d00d beq.n 80039d2 <tcp_close_shutdown_fin+0x46> 80039b6: | | 2b03 cmp r3, #3 80039b8: /-----|-----|-- d108 bne.n 80039cc <tcp_close_shutdown_fin+0x40> err = tcp_send_fin(pcb); 80039ba: | | \-> 4620 mov r0, r4 80039bc: | | f7ff f8f6 bl 8002bac <tcp_send_fin> if (err == ERR_OK) { 80039c0: | /--|-------- b968 cbnz r0, 80039de <tcp_close_shutdown_fin+0x52> { 80039c2: | | | 2305 movs r3, #5 pcb->state = FIN_WAIT_1; 80039c4: | | | /----> 7523 strb r3, [r4, #20] tcp_output(pcb); 80039c6: | | | | 4620 mov r0, r4 80039c8: | | | | f7ff fe24 bl 8003614 <tcp_output> return ERR_OK; 80039cc: >--|--|--|----> 2000 movs r0, #0 } 80039ce: | | | | /-> b002 add sp, #8 80039d0: | | | | | bd10 pop {r4, pc} err = tcp_send_fin(pcb); 80039d2: | | \--|--|-> 4620 mov r0, r4 80039d4: | | | | f7ff f8ea bl 8002bac <tcp_send_fin> if (err == ERR_OK) { 80039d8: | +-----|--|-- b908 cbnz r0, 80039de <tcp_close_shutdown_fin+0x52> 80039da: | | | | 2309 movs r3, #9 80039dc: | | \--|-- e7f2 b.n 80039c4 <tcp_close_shutdown_fin+0x38> } else if (err == ERR_MEM) { 80039de: | \--------|-> 1c43 adds r3, r0, #1 80039e0: | \-- d1f5 bne.n 80039ce <tcp_close_shutdown_fin+0x42> tcp_set_flags(pcb, TF_CLOSEPEND); 80039e2: | 8b63 ldrh r3, [r4, #26] 80039e4: | f043 0308 orr.w r3, r3, #8 80039e8: | 8363 strh r3, [r4, #26] return ERR_OK; 80039ea: \-------------- e7ef b.n 80039cc <tcp_close_shutdown_fin+0x40> 80039ec: 20000060 .word 0x20000060 80039f0: 0800bd3d .word 0x0800bd3d 80039f4: 0800b549 .word 0x0800b549 80039f8: 0800b232 .word 0x0800b232 080039fc : { 80039fc: b537 push {r0, r1, r2, r4, r5, lr} 80039fe: 4605 mov r5, r0 LWIP_ASSERT("tcp_pcb_remove: invalid pcb", pcb != NULL); 8003a00: 460c mov r4, r1 8003a02: /-- b961 cbnz r1, 8003a1e <tcp_pcb_remove+0x22> 8003a04: | b672 cpsid i 8003a06: | 4b32 ldr r3, [pc, #200] @ (8003ad0 ) 8003a08: | 4a32 ldr r2, [pc, #200] @ (8003ad4 ) 8003a0a: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003a0e: | 4b32 ldr r3, [pc, #200] @ (8003ad8 ) 8003a10: | 9300 str r3, [sp, #0] 8003a12: | 4832 ldr r0, [pc, #200] @ (8003adc ) 8003a14: | f640 038d movw r3, #2189 @ 0x88d 8003a18: | f7fd fc6e bl 80012f8 <printf_> 8003a1c: | be00 bkpt 0x0000 TCP_RMV(pcblist, pcb); 8003a1e: \-> 682b ldr r3, [r5, #0] 8003a20: 42a3 cmp r3, r4 8003a22: /----------- d12c bne.n 8003a7e <tcp_pcb_remove+0x82> 8003a24: | 68e3 ldr r3, [r4, #12] 8003a26: | 602b str r3, [r5, #0] 8003a28: /--|----------> 2300 movs r3, #0 8003a2a: | | 60e3 str r3, [r4, #12] tcp_pcb_purge(pcb); 8003a2c: | | 4620 mov r0, r4 8003a2e: | | f7fe fefa bl 8002826 <tcp_pcb_purge> if ((pcb->state != TIME_WAIT) && 8003a32: | | 7d23 ldrb r3, [r4, #20] 8003a34: | | 2b0a cmp r3, #10 8003a36: | | /-------- d12a bne.n 8003a8e <tcp_pcb_remove+0x92> LWIP_ASSERT("unsent segments leaking", pcb->unsent == NULL); 8003a38: /--|--|--|-------> 6ee3 ldr r3, [r4, #108] @ 0x6c 8003a3a: | | | | 2b00 cmp r3, #0 8003a3c: /--|--|--|--|-------- d13a bne.n 8003ab4 <tcp_pcb_remove+0xb8> LWIP_ASSERT("unacked segments leaking", pcb->unacked == NULL); 8003a3e: /--|--|--|--|--|-------> 6f23 ldr r3, [r4, #112] @ 0x70 8003a40: | | | | | | /-- b163 cbz r3, 8003a5c <tcp_pcb_remove+0x60> 8003a42: | | | | | | | b672 cpsid i 8003a44: | | | | | | | 4b22 ldr r3, [pc, #136] @ (8003ad0 ) 8003a46: | | | | | | | 4a26 ldr r2, [pc, #152] @ (8003ae0 ) 8003a48: | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003a4c: | | | | | | | 4b22 ldr r3, [pc, #136] @ (8003ad8 ) 8003a4e: | | | | | | | 9300 str r3, [sp, #0] 8003a50: | | | | | | | 4822 ldr r0, [pc, #136] @ (8003adc ) 8003a52: | | | | | | | f640 039e movw r3, #2206 @ 0x89e 8003a56: | | | | | | | f7fd fc4f bl 80012f8 <printf_> 8003a5a: | | | | | | | be00 bkpt 0x0000 LWIP_ASSERT("ooseq segments leaking", pcb->ooseq == NULL); 8003a5c: | | | | | | \-> 6f63 ldr r3, [r4, #116] @ 0x74 8003a5e: | | | | | | /----- b323 cbz r3, 8003aaa <tcp_pcb_remove+0xae> 8003a60: | | | | | | | b672 cpsid i 8003a62: | | | | | | | 4b1b ldr r3, [pc, #108] @ (8003ad0 ) 8003a64: | | | | | | | 4a1f ldr r2, [pc, #124] @ (8003ae4 ) 8003a66: | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003a6a: | | | | | | | 4b1b ldr r3, [pc, #108] @ (8003ad8 ) 8003a6c: | | | | | | | 9300 str r3, [sp, #0] 8003a6e: | | | | | | | 481b ldr r0, [pc, #108] @ (8003adc ) 8003a70: | | | | | | | f44f 630a mov.w r3, #2208 @ 0x8a0 8003a74: | | | | | | | f7fd fc40 bl 80012f8 <printf_> 8003a78: | | | | | | | be00 bkpt 0x0000 8003a7a: | | | | | | +----- e016 b.n 8003aaa <tcp_pcb_remove+0xae> TCP_RMV(pcblist, pcb); 8003a7c: | | | | | | | /-> 4613 mov r3, r2 8003a7e: | | | | \--|--|--|-> 2b00 cmp r3, #0 8003a80: | | | +-----|--|--|-- d0d2 beq.n 8003a28 <tcp_pcb_remove+0x2c> 8003a82: | | | | | | | 68da ldr r2, [r3, #12] 8003a84: | | | | | | | 42a2 cmp r2, r4 8003a86: | | | | | | \-- d1f9 bne.n 8003a7c <tcp_pcb_remove+0x80> 8003a88: | | | | | | 68e2 ldr r2, [r4, #12] 8003a8a: | | | | | | 60da str r2, [r3, #12] 8003a8c: | | | \-----|--|----- e7cc b.n 8003a28 <tcp_pcb_remove+0x2c> if ((pcb->state != TIME_WAIT) && 8003a8e: | | | \--|----> 2b01 cmp r3, #1 8003a90: | | | +----- d00b beq.n 8003aaa <tcp_pcb_remove+0xae> (pcb->flags & TF_ACK_DELAY)) { 8003a92: | | | | 8b63 ldrh r3, [r4, #26] (pcb->state != LISTEN) && 8003a94: | | | | 07da lsls r2, r3, #31 8003a96: | | +-----------|----- d5cf bpl.n 8003a38 <tcp_pcb_remove+0x3c> tcp_ack_now(pcb); 8003a98: | | | | f043 0302 orr.w r3, r3, #2 8003a9c: | | | | 8363 strh r3, [r4, #26] tcp_output(pcb); 8003a9e: | | | | 4620 mov r0, r4 8003aa0: | | | | f7ff fdb8 bl 8003614 <tcp_output> if (pcb->state != LISTEN) { 8003aa4: | | | | 7d23 ldrb r3, [r4, #20] 8003aa6: | | | | 2b01 cmp r3, #1 8003aa8: | | \-----------|----- d1c6 bne.n 8003a38 <tcp_pcb_remove+0x3c> pcb->state = CLOSED; 8003aaa: | | \----> 2300 movs r3, #0 8003aac: | | 7523 strb r3, [r4, #20] pcb->local_port = 0; 8003aae: | | 82e3 strh r3, [r4, #22] } 8003ab0: | | b003 add sp, #12 8003ab2: | | bd30 pop {r4, r5, pc} LWIP_ASSERT("unsent segments leaking", pcb->unsent == NULL); 8003ab4: | \-------------------> b672 cpsid i 8003ab6: | 4b06 ldr r3, [pc, #24] @ (8003ad0 ) 8003ab8: | 4a0b ldr r2, [pc, #44] @ (8003ae8 ) 8003aba: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003abe: | 4b06 ldr r3, [pc, #24] @ (8003ad8 ) 8003ac0: | 9300 str r3, [sp, #0] 8003ac2: | 4806 ldr r0, [pc, #24] @ (8003adc ) 8003ac4: | f640 039d movw r3, #2205 @ 0x89d 8003ac8: | f7fd fc16 bl 80012f8 <printf_> 8003acc: | be00 bkpt 0x0000 8003ace: \----------------------- e7b6 b.n 8003a3e <tcp_pcb_remove+0x42> 8003ad0: 20000060 .word 0x20000060 8003ad4: 0800bd49 .word 0x0800bd49 8003ad8: 0800b549 .word 0x0800b549 8003adc: 0800b232 .word 0x0800b232 8003ae0: 0800bd7d .word 0x0800bd7d 8003ae4: 0800bd96 .word 0x0800bd96 8003ae8: 0800bd65 .word 0x0800bd65 08003aec : { 8003aec: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 8003af0: 460e mov r6, r1 8003af2: b085 sub sp, #20 LWIP_ERROR("tcp_abandon: invalid pcb", pcb != NULL, return); 8003af4: 4604 mov r4, r0 8003af6: /-- b940 cbnz r0, 8003b0a <tcp_abandon+0x1e> 8003af8: | 4b3c ldr r3, [pc, #240] @ (8003bec ) 8003afa: | 483d ldr r0, [pc, #244] @ (8003bf0 ) 8003afc: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc } 8003b00: | b005 add sp, #20 8003b02: | e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} LWIP_ERROR("tcp_abandon: invalid pcb", pcb != NULL, return); 8003b06: | f7fd bbf7 b.w 80012f8 <printf_> LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs", 8003b0a: \-> 7d03 ldrb r3, [r0, #20] 8003b0c: 2b01 cmp r3, #1 8003b0e: /-- d10c bne.n 8003b2a <tcp_abandon+0x3e> 8003b10: | b672 cpsid i 8003b12: | 4b36 ldr r3, [pc, #216] @ (8003bec ) 8003b14: | 4a37 ldr r2, [pc, #220] @ (8003bf4 ) 8003b16: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003b1a: | 4b37 ldr r3, [pc, #220] @ (8003bf8 ) 8003b1c: | 9300 str r3, [sp, #0] 8003b1e: | 4837 ldr r0, [pc, #220] @ (8003bfc ) 8003b20: | f44f 7310 mov.w r3, #576 @ 0x240 8003b24: | f7fd fbe8 bl 80012f8 <printf_> 8003b28: | be00 bkpt 0x0000 if (pcb->state == TIME_WAIT) { 8003b2a: \-> 7d23 ldrb r3, [r4, #20] 8003b2c: 2b0a cmp r3, #10 8003b2e: /-- d109 bne.n 8003b44 <tcp_abandon+0x58> tcp_pcb_remove(&tcp_tw_pcbs, pcb); 8003b30: | 4833 ldr r0, [pc, #204] @ (8003c00 ) 8003b32: | 4621 mov r1, r4 8003b34: | f7ff ff62 bl 80039fc <tcp_pcb_remove> tcp_free(pcb); 8003b38: | 4620 mov r0, r4 } 8003b3a: | b005 add sp, #20 8003b3c: | e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} tcp_free(pcb); 8003b40: | f7fe bc98 b.w 8002474 <tcp_free> seqno = pcb->snd_nxt; 8003b44: \-> f8d4 9050 ldr.w r9, [r4, #80] @ 0x50 ackno = pcb->rcv_nxt; 8003b48: f8d4 a024 ldr.w sl, [r4, #36] @ 0x24 errf = pcb->errf; 8003b4c: f8d4 7090 ldr.w r7, [r4, #144] @ 0x90 errf_arg = pcb->callback_arg; 8003b50: f8d4 8010 ldr.w r8, [r4, #16] if (pcb->local_port != 0) { 8003b54: 8ae5 ldrh r5, [r4, #22] if (pcb->state == CLOSED) { 8003b56: 2b00 cmp r3, #0 8003b58: /----------------- d139 bne.n 8003bce <tcp_abandon+0xe2> if (pcb->local_port != 0) { 8003b5a: | /-- b14d cbz r5, 8003b70 <tcp_abandon+0x84> TCP_RMV(&tcp_bound_pcbs, pcb); 8003b5c: | | 4a29 ldr r2, [pc, #164] @ (8003c04 ) 8003b5e: | | f8d2 30fc ldr.w r3, [r2, #252] @ 0xfc 8003b62: | | 42a3 cmp r3, r4 8003b64: | /-----|-- d12b bne.n 8003bbe <tcp_abandon+0xd2> 8003b66: | | | 68e3 ldr r3, [r4, #12] 8003b68: | | | f8c2 30fc str.w r3, [r2, #252] @ 0xfc 8003b6c: | /--|-----|-> 2300 movs r3, #0 8003b6e: | | | | 60e3 str r3, [r4, #12] u16_t local_port = 0; 8003b70: | | | \-> 2500 movs r5, #0 int send_rst = 0; 8003b72: | | | 462e mov r6, r5 if (pcb->unacked != NULL) { 8003b74: | /--|--|-------> 6f20 ldr r0, [r4, #112] @ 0x70 8003b76: | | | | /-- b108 cbz r0, 8003b7c <tcp_abandon+0x90> tcp_segs_free(pcb->unacked); 8003b78: | | | | | f7fe fe4d bl 8002816 <tcp_segs_free> if (pcb->unsent != NULL) { 8003b7c: | | | | \-> 6ee0 ldr r0, [r4, #108] @ 0x6c 8003b7e: | | | | /-- b108 cbz r0, 8003b84 <tcp_abandon+0x98> tcp_segs_free(pcb->unsent); 8003b80: | | | | | f7fe fe49 bl 8002816 <tcp_segs_free> if (pcb->ooseq != NULL) { 8003b84: | | | | \-> 6f60 ldr r0, [r4, #116] @ 0x74 8003b86: | | | | /-- b108 cbz r0, 8003b8c <tcp_abandon+0xa0> tcp_segs_free(pcb->ooseq); 8003b88: | | | | | f7fe fe45 bl 8002816 <tcp_segs_free> if (send_rst) { 8003b8c: | | | | /--\-X b156 cbz r6, 8003ba4 <tcp_abandon+0xb8> tcp_rst(pcb, seqno, ackno, &pcb->local_ip, &pcb->remote_ip, local_port, pcb->remote_port); 8003b8e: | | | | | 8b23 ldrh r3, [r4, #24] 8003b90: | | | | | e9cd 5301 strd r5, r3, [sp, #4] 8003b94: | | | | | 1d23 adds r3, r4, #4 8003b96: | | | | | 9300 str r3, [sp, #0] 8003b98: | | | | | 4652 mov r2, sl 8003b9a: | | | | | 4623 mov r3, r4 8003b9c: | | | | | 4649 mov r1, r9 8003b9e: | | | | | 4620 mov r0, r4 8003ba0: | | | | | f7ff f8b8 bl 8002d14 <tcp_rst> tcp_free(pcb); 8003ba4: | | | | \----> 4620 mov r0, r4 8003ba6: | | | | f7fe fc65 bl 8002474 <tcp_free> TCP_EVENT_ERR(last_state, errf, errf_arg, ERR_ABRT); 8003baa: | | | | /----- b1df cbz r7, 8003be4 <tcp_abandon+0xf8> 8003bac: | | | | | f06f 010c mvn.w r1, #12 8003bb0: | | | | | 4640 mov r0, r8 8003bb2: | | | | | 463b mov r3, r7 } 8003bb4: | | | | | b005 add sp, #20 8003bb6: | | | | | e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} TCP_EVENT_ERR(last_state, errf, errf_arg, ERR_ABRT); 8003bba: | | | | | 4718 bx r3 TCP_RMV(&tcp_bound_pcbs, pcb); 8003bbc: | | | | | /-> 4613 mov r3, r2 8003bbe: | | | \--|--|-> 2b00 cmp r3, #0 8003bc0: | | +-----|--|-- d0d4 beq.n 8003b6c <tcp_abandon+0x80> 8003bc2: | | | | | 68da ldr r2, [r3, #12] 8003bc4: | | | | | 42a2 cmp r2, r4 8003bc6: | | | | \-- d1f9 bne.n 8003bbc <tcp_abandon+0xd0> 8003bc8: | | | | 68e2 ldr r2, [r4, #12] 8003bca: | | | | 60da str r2, [r3, #12] 8003bcc: | | \-----|----- e7ce b.n 8003b6c <tcp_abandon+0x80> TCP_PCB_REMOVE_ACTIVE(pcb); 8003bce: \--|--------|----> f8df b034 ldr.w fp, [pc, #52] @ 8003c04 8003bd2: | | 4621 mov r1, r4 8003bd4: | | f10b 00bc add.w r0, fp, #188 @ 0xbc 8003bd8: | | f7ff ff10 bl 80039fc <tcp_pcb_remove> 8003bdc: | | 2301 movs r3, #1 8003bde: | | f88b 3100 strb.w r3, [fp, #256] @ 0x100 8003be2: \--------|----- e7c7 b.n 8003b74 <tcp_abandon+0x88> } 8003be4: \----> b005 add sp, #20 8003be6: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} 8003bea: bf00 nop 8003bec: 20000060 .word 0x20000060 8003bf0: 0800bdad .word 0x0800bdad 8003bf4: 0800bdce .word 0x0800bdce 8003bf8: 0800b549 .word 0x0800b549 8003bfc: 0800b232 .word 0x0800b232 8003c00: 20001218 .word 0x20001218 8003c04: 20001158 .word 0x20001158 08003c08 : { 8003c08: b538 push {r3, r4, r5, lr} 8003c0a: 4604 mov r4, r0 8003c0c: 4608 mov r0, r1 while (pcb != NULL) { 8003c0e: /--/-X b900 cbnz r0, 8003c12 <tcp_netif_ip_addr_changed_pcblist+0xa> } 8003c10: | | bd38 pop {r3, r4, r5, pc} if (ip_addr_eq(&pcb->local_ip, old_addr) 8003c12: | \-> 6802 ldr r2, [r0, #0] 8003c14: | 6823 ldr r3, [r4, #0] struct tcp_pcb *next = pcb->next; 8003c16: | 68c5 ldr r5, [r0, #12] if (ip_addr_eq(&pcb->local_ip, old_addr) 8003c18: | 429a cmp r2, r3 8003c1a: | /-- d102 bne.n 8003c22 <tcp_netif_ip_addr_changed_pcblist+0x1a> tcp_abandon(pcb, 1); 8003c1c: | | 2101 movs r1, #1 8003c1e: | | f7ff ff65 bl 8003aec <tcp_abandon> { 8003c22: | \-> 4628 mov r0, r5 8003c24: \----- e7f3 b.n 8003c0e <tcp_netif_ip_addr_changed_pcblist+0x6> 08003c26 : if (!ip_addr_isany(old_addr)) { 8003c26: 6803 ldr r3, [r0, #0] { 8003c28: b570 push {r4, r5, r6, lr} 8003c2a: 4604 mov r4, r0 8003c2c: 460d mov r5, r1 8003c2e: /----------- b16b cbz r3, 8003c4c <netif_do_ip_addr_changed+0x26> tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_active_pcbs); 8003c30: | 4e14 ldr r6, [pc, #80] @ (8003c84 ) 8003c32: | f8d6 10bc ldr.w r1, [r6, #188] @ 0xbc 8003c36: | f7ff ffe7 bl 8003c08 <tcp_netif_ip_addr_changed_pcblist> tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_bound_pcbs); 8003c3a: | f8d6 10fc ldr.w r1, [r6, #252] @ 0xfc 8003c3e: | 4620 mov r0, r4 8003c40: | f7ff ffe2 bl 8003c08 <tcp_netif_ip_addr_changed_pcblist> if (!ip_addr_isany(new_addr)) { 8003c44: | 682b ldr r3, [r5, #0] 8003c46: | /-- b913 cbnz r3, 8003c4e <netif_do_ip_addr_changed+0x28> */ void udp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr) { struct udp_pcb *upcb; if (!ip_addr_isany(old_addr) && !ip_addr_isany(new_addr)) { 8003c48: | /--|-> 6823 ldr r3, [r4, #0] 8003c4a: | /--|--|-- b963 cbnz r3, 8003c66 <netif_do_ip_addr_changed+0x40> } 8003c4c: >--|--|--|-> bd70 pop {r4, r5, r6, pc} for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { 8003c4e: | | | \-> f8d6 3104 ldr.w r3, [r6, #260] @ 0x104 if (ip_addr_eq(&lpcb->local_ip, old_addr)) { 8003c52: | | | /-> 6822 ldr r2, [r4, #0] for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { 8003c54: | | | | 2b00 cmp r3, #0 8003c56: | | \--|-- d0f7 beq.n 8003c48 <netif_do_ip_addr_changed+0x22> if (ip_addr_eq(&lpcb->local_ip, old_addr)) { 8003c58: | | | 6819 ldr r1, [r3, #0] 8003c5a: | | | 4291 cmp r1, r2 ip_addr_copy(lpcb->local_ip, *new_addr); 8003c5c: | | | bf04 itt eq 8003c5e: | | | 682a ldreq r2, [r5, #0] 8003c60: | | | 601a streq r2, [r3, #0] for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { 8003c62: | | | 68db ldr r3, [r3, #12] 8003c64: | | \-- e7f5 b.n 8003c52 <netif_do_ip_addr_changed+0x2c> 8003c66: | \-------> 682b ldr r3, [r5, #0] 8003c68: | 2b00 cmp r3, #0 8003c6a: +----------- d0ef beq.n 8003c4c <netif_do_ip_addr_changed+0x26> for (upcb = udp_pcbs; upcb != NULL; upcb = upcb->next) { 8003c6c: | f8d6 3108 ldr.w r3, [r6, #264] @ 0x108 8003c70: | /-> 2b00 cmp r3, #0 8003c72: \--------|-- d0eb beq.n 8003c4c <netif_do_ip_addr_changed+0x26> /* PCB bound to current local interface address? */ if (ip_addr_eq(&upcb->local_ip, old_addr)) { 8003c74: | 6819 ldr r1, [r3, #0] 8003c76: | 6822 ldr r2, [r4, #0] 8003c78: | 4291 cmp r1, r2 /* The PCB is bound to the old ipaddr and * is set to bound to the new one instead */ ip_addr_copy(upcb->local_ip, *new_addr); 8003c7a: | bf04 itt eq 8003c7c: | 682a ldreq r2, [r5, #0] 8003c7e: | 601a streq r2, [r3, #0] for (upcb = udp_pcbs; upcb != NULL; upcb = upcb->next) { 8003c80: | 68db ldr r3, [r3, #12] 8003c82: \-- e7f5 b.n 8003c70 <netif_do_ip_addr_changed+0x4a> 8003c84: 20001158 .word 0x20001158 08003c88 : { 8003c88: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} 8003c8a: 4617 mov r7, r2 remove = ip4_addr_isany(ipaddr); 8003c8c: 680a ldr r2, [r1, #0] { 8003c8e: 4604 mov r4, r0 8003c90: 460d mov r5, r1 8003c92: 461e mov r6, r3 remove = ip4_addr_isany(ipaddr); 8003c94: 2a00 cmp r2, #0 8003c96: /-------- d136 bne.n 8003d06 <netif_set_addr+0x7e> if (ip4_addr_eq(ipaddr, netif_ip4_addr(netif)) == 0) { 8003c98: | 6803 ldr r3, [r0, #0] 8003c9a: | /-- b183 cbz r3, 8003cbe <netif_set_addr+0x36> netif_do_ip_addr_changed(old_addr, &new_addr); 8003c9c: | | a901 add r1, sp, #4 8003c9e: | | 4668 mov r0, sp ip_addr_copy(*old_addr, *netif_ip_addr4(netif)); 8003ca0: | | e9cd 3200 strd r3, r2, [sp] netif_do_ip_addr_changed(old_addr, &new_addr); 8003ca4: | | f7ff ffbf bl 8003c26 <netif_do_ip_addr_changed> acd_netif_ip_addr_changed(netif, old_addr, &new_addr); 8003ca8: | | aa01 add r2, sp, #4 8003caa: | | 4669 mov r1, sp 8003cac: | | 4620 mov r0, r4 8003cae: | | f7fc ffc7 bl 8000c40 <acd_netif_ip_addr_changed> ip4_addr_set(ip_2_ip4(&netif->ip_addr), ipaddr); 8003cb2: | | 682b ldr r3, [r5, #0] 8003cb4: | | 6023 str r3, [r4, #0] NETIF_STATUS_CALLBACK(netif); 8003cb6: | | 69a3 ldr r3, [r4, #24] 8003cb8: | +-- b10b cbz r3, 8003cbe <netif_set_addr+0x36> 8003cba: | | 4620 mov r0, r4 8003cbc: | | 4798 blx r3 remove = ip4_addr_isany(ipaddr); 8003cbe: | \-> 2301 movs r3, #1 if (ip4_addr_eq(netmask, netif_ip4_netmask(netif)) == 0) { 8003cc0: | /----> 683a ldr r2, [r7, #0] 8003cc2: | | 6861 ldr r1, [r4, #4] 8003cc4: | | 428a cmp r2, r1 ip4_addr_set(ip_2_ip4(&netif->netmask), netmask); 8003cc6: | | bf18 it ne 8003cc8: | | 6062 strne r2, [r4, #4] if (ip4_addr_eq(gw, netif_ip4_gw(netif)) == 0) { 8003cca: | | 6832 ldr r2, [r6, #0] 8003ccc: | | 68a1 ldr r1, [r4, #8] 8003cce: | | 428a cmp r2, r1 ip4_addr_set(ip_2_ip4(&netif->gw), gw); 8003cd0: | | bf18 it ne 8003cd2: | | 60a2 strne r2, [r4, #8] if (!remove) { 8003cd4: | | /-- b9cb cbnz r3, 8003d0a <netif_set_addr+0x82> if (ip4_addr_eq(ipaddr, netif_ip4_addr(netif)) == 0) { 8003cd6: | | | 6823 ldr r3, [r4, #0] 8003cd8: | | | 682a ldr r2, [r5, #0] 8003cda: | | | 429a cmp r2, r3 8003cdc: | | +-- d015 beq.n 8003d0a <netif_set_addr+0x82> netif_do_ip_addr_changed(old_addr, &new_addr); 8003cde: | | | a901 add r1, sp, #4 8003ce0: | | | 4668 mov r0, sp ip_addr_copy(*old_addr, *netif_ip_addr4(netif)); 8003ce2: | | | e9cd 3200 strd r3, r2, [sp] netif_do_ip_addr_changed(old_addr, &new_addr); 8003ce6: | | | f7ff ff9e bl 8003c26 <netif_do_ip_addr_changed> acd_netif_ip_addr_changed(netif, old_addr, &new_addr); 8003cea: | | | aa01 add r2, sp, #4 8003cec: | | | 4669 mov r1, sp 8003cee: | | | 4620 mov r0, r4 8003cf0: | | | f7fc ffa6 bl 8000c40 <acd_netif_ip_addr_changed> ip4_addr_set(ip_2_ip4(&netif->ip_addr), ipaddr); 8003cf4: | | | 682b ldr r3, [r5, #0] 8003cf6: | | | 6023 str r3, [r4, #0] NETIF_STATUS_CALLBACK(netif); 8003cf8: | | | 69a3 ldr r3, [r4, #24] 8003cfa: | | +-- b133 cbz r3, 8003d0a <netif_set_addr+0x82> 8003cfc: | | | 4620 mov r0, r4 } 8003cfe: | | | b003 add sp, #12 8003d00: | | | e8bd 40f0 ldmia.w sp!, {r4, r5, r6, r7, lr} NETIF_STATUS_CALLBACK(netif); 8003d04: | | | 4718 bx r3 remove = ip4_addr_isany(ipaddr); 8003d06: \--|--|-> 2300 movs r3, #0 8003d08: \--|-- e7da b.n 8003cc0 <netif_set_addr+0x38> } 8003d0a: \-> b003 add sp, #12 8003d0c: bdf0 pop {r4, r5, r6, r7, pc} 08003d0e : void ecm_init(void *arg) { 8003d0e: b537 push {r0, r1, r2, r4, r5, lr} if (netif_default != NULL) { 8003d10: 4d23 ldr r5, [pc, #140] @ (8003da0 ) 8003d12: 4c24 ldr r4, [pc, #144] @ (8003da4 ) 8003d14: f8d5 310c ldr.w r3, [r5, #268] @ 0x10c 8003d18: /----- b323 cbz r3, 8003d64 <ecm_init+0x56> LWIP_ASSERT("single netif already set", 0); 8003d1a: | b672 cpsid i 8003d1c: | 4b22 ldr r3, [pc, #136] @ (8003da8 ) 8003d1e: | 4a23 ldr r2, [pc, #140] @ (8003dac ) 8003d20: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003d24: | 4b22 ldr r3, [pc, #136] @ (8003db0 ) 8003d26: | 9300 str r3, [sp, #0] 8003d28: | 4822 ldr r0, [pc, #136] @ (8003db4 ) 8003d2a: | f240 132d movw r3, #301 @ 0x12d 8003d2e: | f7fd fae3 bl 80012f8 <printf_> 8003d32: | be00 bkpt 0x0000 if (!(netif->flags & NETIF_FLAG_UP)) { 8003d34: /--|----> f894 3035 ldrb.w r3, [r4, #53] @ 0x35 netif_default = netif; 8003d38: | | f8c5 410c str.w r4, [r5, #268] @ 0x10c if (!(netif->flags & NETIF_FLAG_UP)) { 8003d3c: | | 07da lsls r2, r3, #31 8003d3e: | | /-- d407 bmi.n 8003d50 <ecm_init+0x42> netif_set_flags(netif, NETIF_FLAG_UP); 8003d40: | | | f043 0301 orr.w r3, r3, #1 8003d44: | | | f884 3035 strb.w r3, [r4, #53] @ 0x35 NETIF_STATUS_CALLBACK(netif); 8003d48: | | | 69a3 ldr r3, [r4, #24] 8003d4a: | | +-- b10b cbz r3, 8003d50 <ecm_init+0x42> 8003d4c: | | | 4815 ldr r0, [pc, #84] @ (8003da4 ) 8003d4e: | | | 4798 blx r3 netif->status_callback = status_callback; 8003d50: | | \-> 4b19 ldr r3, [pc, #100] @ (8003db8 ) 8003d52: | | 61a3 str r3, [r4, #24] netif_set_status_callback(&ecmif, ecm_status_cb); #endif #if LWIP_NETIF_LINK_CALLBACK netif_set_link_callback(&ecmif, ecm_link_cb); #endif dhcp_start(&ecmif); 8003d54: | | 4813 ldr r0, [pc, #76] @ (8003da4 ) netif->link_callback = link_callback; 8003d56: | | 4b19 ldr r3, [pc, #100] @ (8003dbc ) 8003d58: | | 61e3 str r3, [r4, #28] } 8003d5a: | | b003 add sp, #12 8003d5c: | | e8bd 4030 ldmia.w sp!, {r4, r5, lr} dhcp_start(&ecmif); 8003d60: | | f005 be9c b.w 8009a9c <dhcp_start.isra.0> netif->output = netif_null_output_ip4; 8003d64: | \----> 4a16 ldr r2, [pc, #88] @ (8003dc0 ) ip_addr_set_zero_ip4(&netif->gw); 8003d66: | 60a3 str r3, [r4, #8] ip_addr_set_zero_ip4(&netif->netmask); 8003d68: | e9c4 3300 strd r3, r3, [r4] memset(netif->client_data, 0, sizeof(netif->client_data)); 8003d6c: | e9c4 3309 strd r3, r3, [r4, #36] @ 0x24 netif->link_callback = NULL; 8003d70: | e9c4 3306 strd r3, r3, [r4, #24] netif->output = netif_null_output_ip4; 8003d74: | 6122 str r2, [r4, #16] netif->mtu = 0; 8003d76: | 85a3 strh r3, [r4, #44] @ 0x2c netif->flags = 0; 8003d78: | f884 3035 strb.w r3, [r4, #53] @ 0x35 netif->num = netif_num; 8003d7c: | f884 3038 strb.w r3, [r4, #56] @ 0x38 netif->acd_list = NULL; 8003d80: | 63e3 str r3, [r4, #60] @ 0x3c netif->state = state; 8003d82: | 4a10 ldr r2, [pc, #64] @ (8003dc4 ) netif_set_addr(netif, ipaddr, netmask, gw); 8003d84: | 4b10 ldr r3, [pc, #64] @ (8003dc8 ) netif->state = state; 8003d86: | 6222 str r2, [r4, #32] netif->input = input; 8003d88: | 4a10 ldr r2, [pc, #64] @ (8003dcc ) 8003d8a: | 60e2 str r2, [r4, #12] netif_set_addr(netif, ipaddr, netmask, gw); 8003d8c: | 4620 mov r0, r4 8003d8e: | 461a mov r2, r3 8003d90: | 4619 mov r1, r3 8003d92: | f7ff ff79 bl 8003c88 <netif_set_addr> if (init(netif) != ERR_OK) { 8003d96: | 4620 mov r0, r4 8003d98: | f7fe f8f4 bl 8001f84 <ecmif_init> 8003d9c: \-------- e7ca b.n 8003d34 <ecm_init+0x26> 8003d9e: bf00 nop 8003da0: 20001158 .word 0x20001158 8003da4: 20000000 .word 0x20000000 8003da8: 20000060 .word 0x20000060 8003dac: 0800bdff .word 0x0800bdff 8003db0: 0800be18 .word 0x0800be18 8003db4: 0800b232 .word 0x0800b232 8003db8: 08001805 .word 0x08001805 8003dbc: 080018ad .word 0x080018ad 8003dc0: 08000237 .word 0x08000237 8003dc4: 20000818 .word 0x20000818 8003dc8: 0800d32c .word 0x0800d32c 8003dcc: 0800a50d .word 0x0800a50d 08003dd0 : { 8003dd0: b57f push {r0, r1, r2, r3, r4, r5, r6, lr} 8003dd2: 4616 mov r6, r2 LWIP_ERROR("tcp_recv_null: invalid pcb", pcb != NULL, return ERR_ARG); 8003dd4: 460c mov r4, r1 8003dd6: /-- b949 cbnz r1, 8003dec <tcp_recv_null+0x1c> 8003dd8: | 4b67 ldr r3, [pc, #412] @ (8003f78 ) 8003dda: | 4868 ldr r0, [pc, #416] @ (8003f7c ) 8003ddc: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003de0: | f7fd fa8a bl 80012f8 <printf_> 8003de4: | f06f 000f mvn.w r0, #15 } 8003de8: /--------|-> b004 add sp, #16 8003dea: | | bd70 pop {r4, r5, r6, pc} if (p != NULL) { 8003dec: /--|--------\-X b382 cbz r2, 8003e50 <tcp_recv_null+0x80> LWIP_ASSERT("don't call tcp_recved for listen-pcbs", 8003dee: | | 7d0b ldrb r3, [r1, #20] tcp_recved(pcb, p->tot_len); 8003df0: | | 8915 ldrh r5, [r2, #8] LWIP_ASSERT("don't call tcp_recved for listen-pcbs", 8003df2: | | 2b01 cmp r3, #1 8003df4: | | /-- d10c bne.n 8003e10 <tcp_recv_null+0x40> 8003df6: | | | b672 cpsid i 8003df8: | | | 4b5f ldr r3, [pc, #380] @ (8003f78 ) 8003dfa: | | | 4a61 ldr r2, [pc, #388] @ (8003f80 ) 8003dfc: | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003e00: | | | 4b60 ldr r3, [pc, #384] @ (8003f84 ) 8003e02: | | | 9300 str r3, [sp, #0] 8003e04: | | | 4860 ldr r0, [pc, #384] @ (8003f88 ) 8003e06: | | | f240 33d6 movw r3, #982 @ 0x3d6 8003e0a: | | | f7fd fa75 bl 80012f8 <printf_> 8003e0e: | | | be00 bkpt 0x0000 rcv_wnd = (tcpwnd_size_t)(pcb->rcv_wnd + len); 8003e10: | | \-> 8d22 ldrh r2, [r4, #40] @ 0x28 8003e12: | | 18ab adds r3, r5, r2 8003e14: | | b29b uxth r3, r3 if ((rcv_wnd > TCP_WND_MAX(pcb)) || (rcv_wnd < pcb->rcv_wnd)) { 8003e16: | | f5b3 6f06 cmp.w r3, #2144 @ 0x860 8003e1a: | | /-------- d816 bhi.n 8003e4a <tcp_recv_null+0x7a> pcb->rcv_wnd = TCP_WND_MAX(pcb); 8003e1c: | | | 429a cmp r2, r3 8003e1e: | | | bf88 it hi 8003e20: | | | f44f 6306 movhi.w r3, #2144 @ 0x860 8003e24: | | | /----> 8523 strh r3, [r4, #40] @ 0x28 wnd_inflation = tcp_update_rcv_ann_wnd(pcb); 8003e26: | | | | 4620 mov r0, r4 8003e28: | | | | f7fd ff38 bl 8001c9c <tcp_update_rcv_ann_wnd> if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) { 8003e2c: | | | | f5b0 7f06 cmp.w r0, #536 @ 0x218 8003e30: | | | | /-- d306 bcc.n 8003e40 <tcp_recv_null+0x70> tcp_ack_now(pcb); 8003e32: | | | | | 8b63 ldrh r3, [r4, #26] 8003e34: | | | | | f043 0302 orr.w r3, r3, #2 8003e38: | | | | | 8363 strh r3, [r4, #26] tcp_output(pcb); 8003e3a: | | | | | 4620 mov r0, r4 8003e3c: | | | | | f7ff fbea bl 8003614 <tcp_output> pbuf_free(p); 8003e40: | | | | \-> 4630 mov r0, r6 8003e42: | | | | f005 ffbb bl 8009dbc <pbuf_free.isra.0> return ERR_OK; 8003e46: /-----------|--|--|--|----> 2000 movs r0, #0 8003e48: | | \--|--|----- e7ce b.n 8003de8 <tcp_recv_null+0x18> pcb->rcv_wnd = TCP_WND_MAX(pcb); 8003e4a: | | \--|----> f44f 6306 mov.w r3, #2144 @ 0x860 8003e4e: | | \----- e7e9 b.n 8003e24 <tcp_recv_null+0x54> } else if (err == ERR_OK) { 8003e50: | \-------------> 2b00 cmp r3, #0 8003e52: +-------------------------- d1f8 bne.n 8003e46 <tcp_recv_null+0x76> if (pcb->state != LISTEN) { 8003e54: | 7d0a ldrb r2, [r1, #20] 8003e56: | 2a01 cmp r2, #1 8003e58: | /----------------- d045 beq.n 8003ee6 <tcp_recv_null+0x116> tcp_set_flags(pcb, TF_RXCLOSED); 8003e5a: | | 8b4b ldrh r3, [r1, #26] if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) { 8003e5c: | | 2a04 cmp r2, #4 tcp_set_flags(pcb, TF_RXCLOSED); 8003e5e: | | f043 0310 orr.w r3, r3, #16 8003e62: | | 834b strh r3, [r1, #26] if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) { 8003e64: | | /-- d001 beq.n 8003e6a <tcp_recv_null+0x9a> 8003e66: | | | 2a07 cmp r2, #7 8003e68: | | /-----------|-- d135 bne.n 8003ed6 <tcp_recv_null+0x106> if ((pcb->refused_data != NULL) || (pcb->rcv_wnd != TCP_WND_MAX(pcb))) { 8003e6a: | | | \-> 6fa3 ldr r3, [r4, #120] @ 0x78 8003e6c: | | | /-- b91b cbnz r3, 8003e76 <tcp_recv_null+0xa6> 8003e6e: | | | | 8d23 ldrh r3, [r4, #40] @ 0x28 8003e70: | | | | f5b3 6f06 cmp.w r3, #2144 @ 0x860 8003e74: | | | /--------|-- d032 beq.n 8003edc <tcp_recv_null+0x10c> tcp_rst(pcb, pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip, 8003e76: | | | | \-> 8b23 ldrh r3, [r4, #24] 8003e78: | | | | 9302 str r3, [sp, #8] 8003e7a: | | | | 8ae3 ldrh r3, [r4, #22] 8003e7c: | | | | 9301 str r3, [sp, #4] 8003e7e: | | | | 1d23 adds r3, r4, #4 8003e80: | | | | 9300 str r3, [sp, #0] 8003e82: | | | | 6a62 ldr r2, [r4, #36] @ 0x24 8003e84: | | | | 6d21 ldr r1, [r4, #80] @ 0x50 8003e86: | | | | 4623 mov r3, r4 8003e88: | | | | 4620 mov r0, r4 8003e8a: | | | | f7fe ff43 bl 8002d14 <tcp_rst> tcp_pcb_purge(pcb); 8003e8e: | | | | 4620 mov r0, r4 8003e90: | | | | f7fe fcc9 bl 8002826 <tcp_pcb_purge> TCP_RMV_ACTIVE(pcb); 8003e94: | | | | 4b3d ldr r3, [pc, #244] @ (8003f8c ) 8003e96: | | | | f8d3 20bc ldr.w r2, [r3, #188] @ 0xbc 8003e9a: | | | | 4294 cmp r4, r2 8003e9c: | | | | /----- d113 bne.n 8003ec6 <tcp_recv_null+0xf6> 8003e9e: | | | | | 68e2 ldr r2, [r4, #12] 8003ea0: | | | | | f8c3 20bc str.w r2, [r3, #188] @ 0xbc 8003ea4: | | | | /--|----> 2200 movs r2, #0 8003ea6: | | | | | | 60e2 str r2, [r4, #12] 8003ea8: | | | | | | 2201 movs r2, #1 8003eaa: | | | | | | f883 2100 strb.w r2, [r3, #256] @ 0x100 if (tcp_input_pcb == pcb) { 8003eae: | | | | | | f8d3 20f8 ldr.w r2, [r3, #248] @ 0xf8 8003eb2: | | | | | | 4294 cmp r4, r2 8003eb4: | /-----|--|--|--|--|----- d144 bne.n 8003f40 <tcp_recv_null+0x170> void tcp_trigger_input_pcb_close(void) { recv_flags |= TF_CLOSED; 8003eb6: | | | | | | | f893 20f4 ldrb.w r2, [r3, #244] @ 0xf4 8003eba: | | | | | | | f042 0210 orr.w r2, r2, #16 8003ebe: | | | | | | | f883 20f4 strb.w r2, [r3, #244] @ 0xf4 } 8003ec2: +--|-----|--|--|--|--|----- e7c0 b.n 8003e46 <tcp_recv_null+0x76> TCP_RMV_ACTIVE(pcb); 8003ec4: | | | | | | | /-> 460a mov r2, r1 8003ec6: | | | | | | \--|-> 2a00 cmp r2, #0 8003ec8: | | | | | +-----|-- d0ec beq.n 8003ea4 <tcp_recv_null+0xd4> 8003eca: | | | | | | | 68d1 ldr r1, [r2, #12] 8003ecc: | | | | | | | 428c cmp r4, r1 8003ece: | | | | | | \-- d1f9 bne.n 8003ec4 <tcp_recv_null+0xf4> 8003ed0: | | | | | | 68e1 ldr r1, [r4, #12] 8003ed2: | | | | | | 60d1 str r1, [r2, #12] 8003ed4: | | | | | \-------- e7e6 b.n 8003ea4 <tcp_recv_null+0xd4> switch (pcb->state) { 8003ed6: | | | \--|----------> 2a02 cmp r2, #2 8003ed8: | | /--|-----|----------- d045 beq.n 8003f66 <tcp_recv_null+0x196> 8003eda: | | | | | /----- d925 bls.n 8003f28 <tcp_recv_null+0x158> return tcp_close_shutdown_fin(pcb); 8003edc: | | | | \-----|----> 4620 mov r0, r4 } 8003ede: | | | | | b004 add sp, #16 8003ee0: | | | | | e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} return tcp_close_shutdown_fin(pcb); 8003ee4: | | | | | e552 b.n 800398c <tcp_close_shutdown_fin> for (i = 1; i < LWIP_ARRAYSIZE(tcp_pcb_lists); i++) { 8003ee6: | | | \-----------|----> 482a ldr r0, [pc, #168] @ (8003f90 ) tcp_remove_listener(*tcp_pcb_lists[i], (struct tcp_pcb_listen *)pcb); 8003ee8: | | | | /-> f850 1f04 ldr.w r1, [r0, #4]! 8003eec: | | | | | 6809 ldr r1, [r1, #0] for (pcb = list; pcb != NULL; pcb = pcb->next) { 8003eee: | | | /--------|--|-> 2900 cmp r1, #0 8003ef0: | | | | /-----|--|-- d133 bne.n 8003f5a <tcp_recv_null+0x18a> for (i = 1; i < LWIP_ARRAYSIZE(tcp_pcb_lists); i++) { 8003ef2: | | | | | | | 3201 adds r2, #1 8003ef4: | | | | | | | 2a04 cmp r2, #4 8003ef6: | | | | | | \-- d1f7 bne.n 8003ee8 <tcp_recv_null+0x118> tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb); 8003ef8: | | | | | | 4826 ldr r0, [pc, #152] @ (8003f94 ) 8003efa: | | | | | | 4621 mov r1, r4 8003efc: | | | | | | f7ff fd7e bl 80039fc <tcp_pcb_remove> LWIP_ASSERT("tcp_free_listen: !LISTEN", pcb->state != LISTEN); 8003f00: | | | | | | 7d23 ldrb r3, [r4, #20] 8003f02: | | | | | | 2b01 cmp r3, #1 8003f04: | | | | | | /-- d10b bne.n 8003f1e <tcp_recv_null+0x14e> 8003f06: | | | | | | | b672 cpsid i 8003f08: | | | | | | | 4b1b ldr r3, [pc, #108] @ (8003f78 ) 8003f0a: | | | | | | | 4a23 ldr r2, [pc, #140] @ (8003f98 ) 8003f0c: | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003f10: | | | | | | | 4b1c ldr r3, [pc, #112] @ (8003f84 ) 8003f12: | | | | | | | 9300 str r3, [sp, #0] 8003f14: | | | | | | | 481c ldr r0, [pc, #112] @ (8003f88 ) 8003f16: | | | | | | | 23df movs r3, #223 @ 0xdf 8003f18: | | | | | | | f7fd f9ee bl 80012f8 <printf_> 8003f1c: | | | | | | | be00 bkpt 0x0000 memp_free(MEMP_TCP_PCB_LISTEN, pcb); 8003f1e: | | | | | | \-> 4621 mov r1, r4 8003f20: | | | | | | 2002 movs r0, #2 8003f22: | | | | | | f7fe fa91 bl 8002448 <memp_free> } 8003f26: +--|--|-----|--|-----|----- e78e b.n 8003e46 <tcp_recv_null+0x76> if (pcb->local_port != 0) { 8003f28: | | | | | \----> 8acb ldrh r3, [r1, #22] 8003f2a: | +--|-----|--|----------- b14b cbz r3, 8003f40 <tcp_recv_null+0x170> TCP_RMV(&tcp_bound_pcbs, pcb); 8003f2c: | | | | | 4a17 ldr r2, [pc, #92] @ (8003f8c ) 8003f2e: | | | | | f8d2 30fc ldr.w r3, [r2, #252] @ 0xfc 8003f32: | | | | | 4299 cmp r1, r3 8003f34: | | | | | /----- d109 bne.n 8003f4a <tcp_recv_null+0x17a> 8003f36: | | | | | | 68db ldr r3, [r3, #12] 8003f38: | | | | | | f8c2 30fc str.w r3, [r2, #252] @ 0xfc 8003f3c: | | | | | /--|----> 2300 movs r3, #0 8003f3e: | | | | | | | 60e3 str r3, [r4, #12] tcp_free(pcb); 8003f40: | >--|-----|--|--|--|----> 4620 mov r0, r4 8003f42: | | | | | | | f7fe fa97 bl 8002474 <tcp_free> break; 8003f46: \--|--|-----|--|--|--|----- e77e b.n 8003e46 <tcp_recv_null+0x76> TCP_RMV(&tcp_bound_pcbs, pcb); 8003f48: | | | | | | /-> 4613 mov r3, r2 8003f4a: | | | | | \--|-> 2b00 cmp r3, #0 8003f4c: | | | | +-----|-- d0f6 beq.n 8003f3c <tcp_recv_null+0x16c> 8003f4e: | | | | | | 68da ldr r2, [r3, #12] 8003f50: | | | | | | 4294 cmp r4, r2 8003f52: | | | | | \-- d1f9 bne.n 8003f48 <tcp_recv_null+0x178> 8003f54: | | | | | 68e2 ldr r2, [r4, #12] 8003f56: | | | | | 60da str r2, [r3, #12] 8003f58: | | | | \-------- e7f0 b.n 8003f3c <tcp_recv_null+0x16c> if (pcb->listener == lpcb) { 8003f5a: | | | \----------> 6fcd ldr r5, [r1, #124] @ 0x7c 8003f5c: | | | 42ac cmp r4, r5 pcb->listener = NULL; 8003f5e: | | | bf08 it eq 8003f60: | | | 67cb streq r3, [r1, #124] @ 0x7c for (pcb = list; pcb != NULL; pcb = pcb->next) { 8003f62: | | | 68c9 ldr r1, [r1, #12] 8003f64: | | \-------------- e7c3 b.n 8003eee <tcp_recv_null+0x11e> TCP_PCB_REMOVE_ACTIVE(pcb); 8003f66: | \-------------------> 4d09 ldr r5, [pc, #36] @ (8003f8c ) 8003f68: | f105 00bc add.w r0, r5, #188 @ 0xbc 8003f6c: | f7ff fd46 bl 80039fc <tcp_pcb_remove> 8003f70: | 2301 movs r3, #1 8003f72: | f885 3100 strb.w r3, [r5, #256] @ 0x100 8003f76: \----------------------- e7e3 b.n 8003f40 <tcp_recv_null+0x170> 8003f78: 20000060 .word 0x20000060 8003f7c: 0800be2e .word 0x0800be2e 8003f80: 0800be51 .word 0x0800be51 8003f84: 0800b549 .word 0x0800b549 8003f88: 0800b232 .word 0x0800b232 8003f8c: 20001158 .word 0x20001158 8003f90: 0800d330 .word 0x0800d330 8003f94: 2000125c .word 0x2000125c 8003f98: 0800be77 .word 0x0800be77 08003f9c : { 8003f9c: b5f8 push {r3, r4, r5, r6, r7, lr} LWIP_ERROR("tcp_process_refused_data: invalid pcb", pcb != NULL, return ERR_ARG); 8003f9e: 4604 mov r4, r0 8003fa0: /-- b948 cbnz r0, 8003fb6 <tcp_process_refused_data+0x1a> 8003fa2: | 4b1d ldr r3, [pc, #116] @ (8004018 ) 8003fa4: | 481d ldr r0, [pc, #116] @ (800401c ) 8003fa6: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8003faa: | f7fd f9a5 bl 80012f8 <printf_> 8003fae: | f06f 050f mvn.w r5, #15 } 8003fb2: /-----------|-> 4628 mov r0, r5 8003fb4: | | bdf8 pop {r3, r4, r5, r6, r7, pc} u8_t refused_flags = pcb->refused_data->flags; 8003fb6: | \-> 6f86 ldr r6, [r0, #120] @ 0x78 TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err); 8003fb8: | f8d0 5084 ldr.w r5, [r0, #132] @ 0x84 u8_t refused_flags = pcb->refused_data->flags; 8003fbc: | 7b77 ldrb r7, [r6, #13] pcb->refused_data = NULL; 8003fbe: | 2300 movs r3, #0 8003fc0: | 6783 str r3, [r0, #120] @ 0x78 TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err); 8003fc2: | /----- b1dd cbz r5, 8003ffc <tcp_process_refused_data+0x60> 8003fc4: | | 4601 mov r1, r0 8003fc6: | | 4632 mov r2, r6 8003fc8: | | 6900 ldr r0, [r0, #16] 8003fca: | | 47a8 blx r5 8003fcc: | /--|----> 4605 mov r5, r0 if (err == ERR_OK) { 8003fce: | /--|--|----- b9e0 cbnz r0, 800400a <tcp_process_refused_data+0x6e> if ((refused_flags & PBUF_FLAG_TCP_FIN) 8003fd0: | | | | 06bb lsls r3, r7, #26 8003fd2: +--|--|--|----- d5ee bpl.n 8003fb2 <tcp_process_refused_data+0x16> if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) { 8003fd4: | | | | 8d23 ldrh r3, [r4, #40] @ 0x28 TCP_EVENT_CLOSED(pcb, err); 8003fd6: | | | | f8d4 6084 ldr.w r6, [r4, #132] @ 0x84 if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) { 8003fda: | | | | f5b3 6f06 cmp.w r3, #2144 @ 0x860 pcb->rcv_wnd++; 8003fde: | | | | bf1c itt ne 8003fe0: | | | | 3301 addne r3, #1 8003fe2: | | | | 8523 strhne r3, [r4, #40] @ 0x28 TCP_EVENT_CLOSED(pcb, err); 8003fe4: | | | | 2e00 cmp r6, #0 8003fe6: +--|--|--|----- d0e4 beq.n 8003fb2 <tcp_process_refused_data+0x16> 8003fe8: | | | | 2300 movs r3, #0 8003fea: | | | | 6920 ldr r0, [r4, #16] 8003fec: | | | | 461a mov r2, r3 8003fee: | | | | 4621 mov r1, r4 8003ff0: | | | | 47b0 blx r6 if (err == ERR_ABRT) { 8003ff2: | | | | 300d adds r0, #13 8003ff4: +--|--|--|----- d1dd bne.n 8003fb2 <tcp_process_refused_data+0x16> return ERR_ABRT; 8003ff6: | | | | /-> f06f 050c mvn.w r5, #12 8003ffa: +--|--|--|--|-- e7da b.n 8003fb2 <tcp_process_refused_data+0x16> TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err); 8003ffc: | | | \--|-> 4601 mov r1, r0 8003ffe: | | | | 462b mov r3, r5 8004000: | | | | 4632 mov r2, r6 8004002: | | | | 4628 mov r0, r5 8004004: | | | | f7ff fee4 bl 8003dd0 <tcp_recv_null> 8004008: | | \-----|-- e7e0 b.n 8003fcc <tcp_process_refused_data+0x30> } else if (err == ERR_ABRT) { 800400a: | \--------|-> 350d adds r5, #13 800400c: | \-- d0f3 beq.n 8003ff6 <tcp_process_refused_data+0x5a> pcb->refused_data = refused_data; 800400e: | 67a6 str r6, [r4, #120] @ 0x78 return ERR_INPROGRESS; 8004010: | f06f 0504 mvn.w r5, #4 8004014: \-------------- e7cd b.n 8003fb2 <tcp_process_refused_data+0x16> 8004016: bf00 nop 8004018: 20000060 .word 0x20000060 800401c: 0800be90 .word 0x0800be90 08004020 : { 8004020: b510 push {r4, lr} if (recv_flags & TF_CLOSED) { 8004022: 4b0d ldr r3, [pc, #52] @ (8004058 ) 8004024: f893 30f4 ldrb.w r3, [r3, #244] @ 0xf4 { 8004028: 4604 mov r4, r0 if (recv_flags & TF_CLOSED) { 800402a: f013 0010 ands.w r0, r3, #16 800402e: /----- d011 beq.n 8004054 <tcp_input_delayed_close+0x34> if (!(pcb->flags & TF_RXCLOSED)) { 8004030: | 8b63 ldrh r3, [r4, #26] 8004032: | 06db lsls r3, r3, #27 8004034: | /-- d406 bmi.n 8004044 <tcp_input_delayed_close+0x24> TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_CLSD); 8004036: | | f8d4 3090 ldr.w r3, [r4, #144] @ 0x90 800403a: | +-- b11b cbz r3, 8004044 <tcp_input_delayed_close+0x24> 800403c: | | 6920 ldr r0, [r4, #16] 800403e: | | f06f 010e mvn.w r1, #14 8004042: | | 4798 blx r3 tcp_pcb_remove(&tcp_active_pcbs, pcb); 8004044: | \-> 4805 ldr r0, [pc, #20] @ (800405c ) 8004046: | 4621 mov r1, r4 8004048: | f7ff fcd8 bl 80039fc <tcp_pcb_remove> tcp_free(pcb); 800404c: | 4620 mov r0, r4 800404e: | f7fe fa11 bl 8002474 <tcp_free> 8004052: | 2001 movs r0, #1 } 8004054: \----> bd10 pop {r4, pc} 8004056: bf00 nop 8004058: 20001158 .word 0x20001158 800405c: 20001214 .word 0x20001214 08004060 : { 8004060: b513 push {r0, r1, r4, lr} LWIP_ASSERT("tcp_rexmit_rto_commit: invalid pcb", pcb != NULL); 8004062: 4604 mov r4, r0 8004064: /-- b960 cbnz r0, 8004080 <tcp_rexmit_rto_commit+0x20> 8004066: | b672 cpsid i 8004068: | 4b0c ldr r3, [pc, #48] @ (800409c ) 800406a: | 4a0d ldr r2, [pc, #52] @ (80040a0 ) 800406c: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004070: | 4b0c ldr r3, [pc, #48] @ (80040a4 ) 8004072: | 9300 str r3, [sp, #0] 8004074: | 480c ldr r0, [pc, #48] @ (80040a8 ) 8004076: | f240 639c movw r3, #1692 @ 0x69c 800407a: | f7fd f93d bl 80012f8 <printf_> 800407e: | be00 bkpt 0x0000 if (pcb->nrtx < 0xFF) { 8004080: \-> f894 3042 ldrb.w r3, [r4, #66] @ 0x42 8004084: 2bff cmp r3, #255 @ 0xff ++pcb->nrtx; 8004086: bf18 it ne 8004088: 3301 addne r3, #1 tcp_output(pcb); 800408a: 4620 mov r0, r4 ++pcb->nrtx; 800408c: bf18 it ne 800408e: f884 3042 strbne.w r3, [r4, #66] @ 0x42 } 8004092: b002 add sp, #8 8004094: e8bd 4010 ldmia.w sp!, {r4, lr} tcp_output(pcb); 8004098: f7ff babc b.w 8003614 <tcp_output> 800409c: 20000060 .word 0x20000060 80040a0: 0800bebe .word 0x0800bebe 80040a4: 0800b5cd .word 0x0800b5cd 80040a8: 0800b232 .word 0x0800b232 080040ac : { 80040ac: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} ++tcp_timer_ctr; 80040b0: 4d8a ldr r5, [pc, #552] @ (80042dc ) 80040b2: f895 3110 ldrb.w r3, [r5, #272] @ 0x110 80040b6: 3301 adds r3, #1 { 80040b8: b089 sub sp, #36 @ 0x24 ++tcp_timer_ctr; 80040ba: f885 3110 strb.w r3, [r5, #272] @ 0x110 tcp_active_pcbs_changed = 0; 80040be: 2600 movs r6, #0 pcb = tcp_active_pcbs; 80040c0: /----------> f8d5 40bc ldr.w r4, [r5, #188] @ 0xbc while (pcb != NULL) { 80040c4: /--|-----/----X bb44 cbnz r4, 8004118 <tcp_tmr+0x6c> if (++tcp_timer & 1) { 80040c6: | | | f895 3111 ldrb.w r3, [r5, #273] @ 0x111 80040ca: | | | 3301 adds r3, #1 80040cc: | | | b2db uxtb r3, r3 80040ce: | | | f885 3111 strb.w r3, [r5, #273] @ 0x111 80040d2: | | | f013 0301 ands.w r3, r3, #1 80040d6: | | | 9305 str r3, [sp, #20] 80040d8: | | | /-- d01b beq.n 8004112 <tcp_tmr+0x66> ++tcp_ticks; 80040da: | | | | f8d5 30d8 ldr.w r3, [r5, #216] @ 0xd8 80040de: | | | | f8df 9200 ldr.w r9, [pc, #512] @ 80042e0 80040e2: | | | | 3301 adds r3, #1 80040e4: | | | | f8c5 30d8 str.w r3, [r5, #216] @ 0xd8 ++tcp_timer_ctr; 80040e8: | | | | f895 3110 ldrb.w r3, [r5, #272] @ 0x110 80040ec: | | | | 3301 adds r3, #1 80040ee: | | | | f885 3110 strb.w r3, [r5, #272] @ 0x110 prev = NULL; 80040f2: /-----------------------------------------------------|--|-----|--|-> 2300 movs r3, #0 pcb = tcp_active_pcbs; 80040f4: | | | | | f8d5 40bc ldr.w r4, [r5, #188] @ 0xbc prev = NULL; 80040f8: | | | | | 9304 str r3, [sp, #16] while (pcb != NULL) { 80040fa: | /--|--|-----|--|-> 2c00 cmp r4, #0 80040fc: | | | | /--|--|-- d138 bne.n 8004170 <tcp_tmr+0xc4> pcb = tcp_tw_pcbs; 80040fe: | | | | | | | f8d5 60c0 ldr.w r6, [r5, #192] @ 0xc0 8004102: | | | | | | | 4f77 ldr r7, [pc, #476] @ (80042e0 ) LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); 8004104: | | | | | | | f8df 81dc ldr.w r8, [pc, #476] @ 80042e4 8004108: | | | | | | | f8df 91f0 ldr.w r9, [pc, #496] @ 80042fc while (pcb != NULL) { 800410c: /--|--------------------------------------------------|--|--|--|--|--|-> 2e00 cmp r6, #0 800410e: | | /-----------------------------------------------|--|--|--|--|--|-- f040 831e bne.w 800474e <tcp_tmr+0x6a2> } 8004112: | | | | | | | | \-> b009 add sp, #36 @ 0x24 8004114: | | | | | | | | e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} if (pcb->last_timer != tcp_timer_ctr) { 8004118: | | | | | | | \----> f895 3110 ldrb.w r3, [r5, #272] @ 0x110 800411c: | | | | | | | 7fa2 ldrb r2, [r4, #30] 800411e: | | | | | | | 429a cmp r2, r3 8004120: | | | | | | | /----- d024 beq.n 800416c <tcp_tmr+0xc0> pcb->last_timer = tcp_timer_ctr; 8004122: | | | | | | | | 77a3 strb r3, [r4, #30] if (pcb->flags & TF_ACK_DELAY) { 8004124: | | | | | | | | 8b63 ldrh r3, [r4, #26] 8004126: | | | | | | | | 07df lsls r7, r3, #31 8004128: | | | | | | | | /-- d509 bpl.n 800413e <tcp_tmr+0x92> tcp_ack_now(pcb); 800412a: | | | | | | | | | f043 0302 orr.w r3, r3, #2 800412e: | | | | | | | | | 8363 strh r3, [r4, #26] tcp_output(pcb); 8004130: | | | | | | | | | 4620 mov r0, r4 8004132: | | | | | | | | | f7ff fa6f bl 8003614 <tcp_output> tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW); 8004136: | | | | | | | | | 8b63 ldrh r3, [r4, #26] 8004138: | | | | | | | | | f023 0303 bic.w r3, r3, #3 800413c: | | | | | | | | | 8363 strh r3, [r4, #26] if (pcb->flags & TF_CLOSEPEND) { 800413e: | | | | | | | | \-> 8b63 ldrh r3, [r4, #26] 8004140: | | | | | | | | 0718 lsls r0, r3, #28 8004142: | | | | | | | | /-- d505 bpl.n 8004150 <tcp_tmr+0xa4> tcp_clear_flags(pcb, TF_CLOSEPEND); 8004144: | | | | | | | | | f023 0308 bic.w r3, r3, #8 8004148: | | | | | | | | | 8363 strh r3, [r4, #26] tcp_close_shutdown_fin(pcb); 800414a: | | | | | | | | | 4620 mov r0, r4 800414c: | | | | | | | | | f7ff fc1e bl 800398c <tcp_close_shutdown_fin> if (pcb->refused_data != NULL) { 8004150: | | | | | | | | \-> 6fa3 ldr r3, [r4, #120] @ 0x78 next = pcb->next; 8004152: | | | | | | | | 68e7 ldr r7, [r4, #12] if (pcb->refused_data != NULL) { 8004154: | | | | | | | | /-- b143 cbz r3, 8004168 <tcp_tmr+0xbc> tcp_process_refused_data(pcb); 8004156: | | | | | | | | | 4620 mov r0, r4 tcp_active_pcbs_changed = 0; 8004158: | | | | | | | | | f885 6100 strb.w r6, [r5, #256] @ 0x100 tcp_process_refused_data(pcb); 800415c: | | | | | | | | | f7ff ff1e bl 8003f9c <tcp_process_refused_data> if (tcp_active_pcbs_changed) { 8004160: | | | | | | | | | f895 3100 ldrb.w r3, [r5, #256] @ 0x100 8004164: | | | | | | | | | 2b00 cmp r3, #0 8004166: | | | | | \--|--|--|-- d1ab bne.n 80040c0 <tcp_tmr+0x14> pcb = next; 8004168: | | | | | | | \-> 463c mov r4, r7 800416a: | | | | +-----|--|----- e7ab b.n 80040c4 <tcp_tmr+0x18> pcb = pcb->next; 800416c: | | | | | | \----> 68e4 ldr r4, [r4, #12] 800416e: | | | | \-----|-------- e7a9 b.n 80040c4 <tcp_tmr+0x18> LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED", pcb->state != CLOSED); 8004170: | | | | \-------> 7d23 ldrb r3, [r4, #20] 8004172: | | | | /-- b95b cbnz r3, 800418c <tcp_tmr+0xe0> 8004174: | | | | | b672 cpsid i 8004176: | | | | | 4b5b ldr r3, [pc, #364] @ (80042e4 ) 8004178: | | | | | f8d9 12fc ldr.w r1, [r9, #764] @ 0x2fc 800417c: | | | | | 4a5a ldr r2, [pc, #360] @ (80042e8 ) 800417e: | | | | | 9300 str r3, [sp, #0] 8004180: | | | | | 485a ldr r0, [pc, #360] @ (80042ec ) 8004182: | | | | | f240 43c2 movw r3, #1218 @ 0x4c2 8004186: | | | | | f7fd f8b7 bl 80012f8 <printf_> 800418a: | | | | | be00 bkpt 0x0000 LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN", pcb->state != LISTEN); 800418c: | | | | \-> 7d23 ldrb r3, [r4, #20] 800418e: | | | | 2b01 cmp r3, #1 8004190: | | | | /-- d10b bne.n 80041aa <tcp_tmr+0xfe> 8004192: | | | | | b672 cpsid i 8004194: | | | | | 4b53 ldr r3, [pc, #332] @ (80042e4 ) 8004196: | | | | | f8d9 12fc ldr.w r1, [r9, #764] @ 0x2fc 800419a: | | | | | 4a55 ldr r2, [pc, #340] @ (80042f0 ) 800419c: | | | | | 9300 str r3, [sp, #0] 800419e: | | | | | 4853 ldr r0, [pc, #332] @ (80042ec ) 80041a0: | | | | | f240 43c3 movw r3, #1219 @ 0x4c3 80041a4: | | | | | f7fd f8a8 bl 80012f8 <printf_> 80041a8: | | | | | be00 bkpt 0x0000 LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); 80041aa: | | | | \-> 7d23 ldrb r3, [r4, #20] 80041ac: | | | | 2b0a cmp r3, #10 80041ae: | | | | /-- d10b bne.n 80041c8 <tcp_tmr+0x11c> 80041b0: | | | | | b672 cpsid i 80041b2: | | | | | 4b4c ldr r3, [pc, #304] @ (80042e4 ) 80041b4: | | | | | f8d9 12fc ldr.w r1, [r9, #764] @ 0x2fc 80041b8: | | | | | 4a4e ldr r2, [pc, #312] @ (80042f4 ) 80041ba: | | | | | 9300 str r3, [sp, #0] 80041bc: | | | | | 484b ldr r0, [pc, #300] @ (80042ec ) 80041be: | | | | | f240 43c4 movw r3, #1220 @ 0x4c4 80041c2: | | | | | f7fd f899 bl 80012f8 <printf_> 80041c6: | | | | | be00 bkpt 0x0000 if (pcb->last_timer == tcp_timer_ctr) { 80041c8: | | | | \-> f895 3110 ldrb.w r3, [r5, #272] @ 0x110 80041cc: | | | | 7fa2 ldrb r2, [r4, #30] 80041ce: | | | | 429a cmp r2, r3 80041d0: | | | | /-- d103 bne.n 80041da <tcp_tmr+0x12e> pcb = pcb->next; 80041d2: | | | | | 68e7 ldr r7, [r4, #12] ++pcb_reset; 80041d4: | | | /--------------------------------------------|--------------|-> 9404 str r4, [sp, #16] 80041d6: | | | | | | 463c mov r4, r7 80041d8: | | | | \--------------|-- e78f b.n 80040fa <tcp_tmr+0x4e> if (pcb->state == SYN_SENT && pcb->nrtx >= TCP_SYNMAXRTX) { 80041da: | | | | \-> 7d22 ldrb r2, [r4, #20] pcb->last_timer = tcp_timer_ctr; 80041dc: | | | | 77a3 strb r3, [r4, #30] if (pcb->state == SYN_SENT && pcb->nrtx >= TCP_SYNMAXRTX) { 80041de: | | | | 2a02 cmp r2, #2 80041e0: | | | | f894 3042 ldrb.w r3, [r4, #66] @ 0x42 80041e4: | | | | /-------- d177 bne.n 80042d6 <tcp_tmr+0x22a> 80041e6: | | | | | 2b05 cmp r3, #5 80041e8: | | | | /--|--/----X f240 808a bls.w 8004300 <tcp_tmr+0x254> ++pcb_remove; 80041ec: | | | | /--|--|--|----> 9e05 ldr r6, [sp, #20] if (pcb->state == FIN_WAIT_2) { 80041ee: | | | | /-----------------|--|--|--|----> 7d22 ldrb r2, [r4, #20] 80041f0: | | | | | | | | | 2a06 cmp r2, #6 80041f2: | | | | | | | | | /-- d10a bne.n 800420a <tcp_tmr+0x15e> if (pcb->flags & TF_RXCLOSED) { 80041f4: | | | | | | | | | | 8b63 ldrh r3, [r4, #26] 80041f6: | | | | | | | | | | 06d9 lsls r1, r3, #27 80041f8: | | | | | | | | | +-- d507 bpl.n 800420a <tcp_tmr+0x15e> if ((u32_t)(tcp_ticks - pcb->tmr) > 80041fa: | | | | | | | | | | f8d5 30d8 ldr.w r3, [r5, #216] @ 0xd8 80041fe: | | | | | | | | | | 6a21 ldr r1, [r4, #32] 8004200: | | | | | | | | | | 1a5b subs r3, r3, r1 8004202: | | | | | | | | | | 2b28 cmp r3, #40 @ 0x28 ++pcb_remove; 8004204: | | | | | | | | | | bf84 itt hi 8004206: | | | | | | | | | | 3601 addhi r6, #1 8004208: | | | | | | | | | | b2f6 uxtbhi r6, r6 if (ip_get_option(pcb, SOF_KEEPALIVE) && 800420a: | | | | | | | | | \-> 7a63 ldrb r3, [r4, #9] 800420c: | | | | | | | | | 071b lsls r3, r3, #28 800420e: | | | | /--------------------------|-----------------|--|--|--|----- d505 bpl.n 800421c <tcp_tmr+0x170> 8004210: | | | | | | | | | | 2a04 cmp r2, #4 8004212: | | | | | /--|-----------------|--|--|--|----- f000 8224 beq.w 800465e <tcp_tmr+0x5b2> ((pcb->state == ESTABLISHED) || 8004216: | | | | | | | | | | | 2a07 cmp r2, #7 8004218: | | | | | +--|-----------------|--|--|--|----- f000 8221 beq.w 800465e <tcp_tmr+0x5b2> pcb_reset = 0; 800421c: | | | | >-----------------------|--|-----------------|--|--|--|----> 2700 movs r7, #0 if (pcb->ooseq != NULL && 800421e: | | | | | /--|--|-----------------|--|--|--|----> 6f60 ldr r0, [r4, #116] @ 0x74 8004220: | | | | | | | | | | | | /-- b170 cbz r0, 8004240 <tcp_tmr+0x194> (tcp_ticks - pcb->tmr >= (u32_t)pcb->rto * TCP_OOSEQ_TIMEOUT)) { 8004222: | | | | | | | | | | | | | f8d5 30d8 ldr.w r3, [r5, #216] @ 0xd8 8004226: | | | | | | | | | | | | | 6a22 ldr r2, [r4, #32] 8004228: | | | | | | | | | | | | | 1a9a subs r2, r3, r2 800422a: | | | | | | | | | | | | | f9b4 3040 ldrsh.w r3, [r4, #64] @ 0x40 800422e: | | | | | | | | | | | | | eb03 0343 add.w r3, r3, r3, lsl #1 if (pcb->ooseq != NULL && 8004232: | | | | | | | | | | | | | ebb2 0f43 cmp.w r2, r3, lsl #1 8004236: | | | | | | | | | | | | +-- d303 bcc.n 8004240 <tcp_tmr+0x194> tcp_segs_free(pcb->ooseq); 8004238: | | | | | | | | | | | | | f7fe faed bl 8002816 <tcp_segs_free> pcb->ooseq = NULL; 800423c: | | | | | | | | | | | | | 2300 movs r3, #0 800423e: | | | | | | | | | | | | | 6763 str r3, [r4, #116] @ 0x74 if (pcb->state == SYN_RCVD) { 8004240: | | | | | | | | | | | | \-> 7d23 ldrb r3, [r4, #20] 8004242: | | | | | | | | | | | | 2b03 cmp r3, #3 8004244: | | | | | /-----------|--|--|-----------------|--|--|--|----- f040 8247 bne.w 80046d6 <tcp_tmr+0x62a> if ((u32_t)(tcp_ticks - pcb->tmr) > 8004248: | | | | | | | | | | | | | f8d5 30d8 ldr.w r3, [r5, #216] @ 0xd8 800424c: | | | | | | | | | | | | | 6a22 ldr r2, [r4, #32] 800424e: | | | | | | | | | | | | | 1a9b subs r3, r3, r2 8004250: | | | | | | | | | | | | | 2b28 cmp r3, #40 @ 0x28 if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) { 8004252: | | | | | /--|-----------|--|--|-----------------|--|--|--|--/-X d802 bhi.n 800425a <tcp_tmr+0x1ae> if (pcb_remove) { 8004254: | | | | | | | /--------|--|--|-----------------|--|--|--|--|-> 2e00 cmp r6, #0 8004256: | | | | | /--|--|--|--------|--|--|-----------------|--|--|--|--|-- f000 825b beq.w 8004710 <tcp_tmr+0x664> tcp_pcb_purge(pcb); 800425a: | | | | | | | | | | | | | | | | \-> 4620 mov r0, r4 tcp_err_fn err_fn = pcb->errf; 800425c: | | | | | | | | | | | | | | | | f8d4 6090 ldr.w r6, [r4, #144] @ 0x90 tcp_pcb_purge(pcb); 8004260: | | | | | | | | | | | | | | | | f7fe fae1 bl 8002826 <tcp_pcb_purge> if (prev != NULL) { 8004264: | | | | | | | | | | | | | | | | 9b04 ldr r3, [sp, #16] 8004266: | | | | | | | | | | | | | | | | 2b00 cmp r3, #0 8004268: | | | | | | | | | /-----|--|--|-----------------|--|--|--|----- f000 823e beq.w 80046e8 <tcp_tmr+0x63c> LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs); 800426c: | | | | | | | | | | | | | | | | | f8d5 30bc ldr.w r3, [r5, #188] @ 0xbc 8004270: | | | | | | | | | | | | | | | | | 429c cmp r4, r3 8004272: | | | | | | | | | | | | | | | | | /-- d10c bne.n 800428e <tcp_tmr+0x1e2> 8004274: | | | | | | | | | | | | | | | | | | b672 cpsid i 8004276: | | | | | | | | | | | | | | | | | | 4b1a ldr r3, [pc, #104] @ (80042e0 ) 8004278: | | | | | | | | | | | | | | | | | | 4a1f ldr r2, [pc, #124] @ (80042f8 ) 800427a: | | | | | | | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 800427e: | | | | | | | | | | | | | | | | | | 4b19 ldr r3, [pc, #100] @ (80042e4 ) 8004280: | | | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 8004282: | | | | | | | | | | | | | | | | | | 481a ldr r0, [pc, #104] @ (80042ec ) 8004284: | | | | | | | | | | | | | | | | | | f240 5371 movw r3, #1393 @ 0x571 8004288: | | | | | | | | | | | | | | | | | | f7fd f836 bl 80012f8 <printf_> 800428c: | | | | | | | | | | | | | | | | | | be00 bkpt 0x0000 prev->next = pcb->next; 800428e: | | | | | | | | | | | | | | | | | \-> 9a04 ldr r2, [sp, #16] 8004290: | | | | | | | | | | | | | | | | | 68e3 ldr r3, [r4, #12] 8004292: | | | | | | | | | | | | | | | | | 60d3 str r3, [r2, #12] if (pcb_reset) { 8004294: | | | | | | | | | | /--|--|--|-----------------|--|--|--|--/-X b15f cbz r7, 80042ae <tcp_tmr+0x202> tcp_rst(pcb, pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip, 8004296: | | | | | | | | | | | | | | | | | | | 8b23 ldrh r3, [r4, #24] 8004298: | | | | | | | | | | | | | | | | | | | 9302 str r3, [sp, #8] 800429a: | | | | | | | | | | | | | | | | | | | 8ae3 ldrh r3, [r4, #22] 800429c: | | | | | | | | | | | | | | | | | | | 9301 str r3, [sp, #4] 800429e: | | | | | | | | | | | | | | | | | | | 1d23 adds r3, r4, #4 80042a0: | | | | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 80042a2: | | | | | | | | | | | | | | | | | | | 6a62 ldr r2, [r4, #36] @ 0x24 80042a4: | | | | | | | | | | | | | | | | | | | 6d21 ldr r1, [r4, #80] @ 0x50 80042a6: | | | | | | | | | | | | | | | | | | | 4623 mov r3, r4 80042a8: | | | | | | | | | | | | | | | | | | | 4620 mov r0, r4 80042aa: | | | | | | | | | | | | | | | | | | | f7fe fd33 bl 8002d14 <tcp_rst> tcp_free(pcb2); 80042ae: | | | | | | | | | | | | | | | | | | \-> 4620 mov r0, r4 pcb = pcb->next; 80042b0: | | | | | | | | | | | | | | | | | | e9d4 7803 ldrd r7, r8, [r4, #12] tcp_free(pcb2); 80042b4: | | | | | | | | | | | | | | | | | | f7fe f8de bl 8002474 <tcp_free> tcp_active_pcbs_changed = 0; 80042b8: | | | | | | | | | | | | | | | | | | 2300 movs r3, #0 80042ba: | | | | | | | | | | | | | | | | | | f885 3100 strb.w r3, [r5, #256] @ 0x100 TCP_EVENT_ERR(last_state, err_fn, err_arg, ERR_ABRT); 80042be: | | | | | | | | | | | | | | | | | | /-- b146 cbz r6, 80042d2 <tcp_tmr+0x226> 80042c0: | | | | | | | | | | | | | | | | | | | f06f 010c mvn.w r1, #12 80042c4: | | | | | | | | | | | | | | | | | | | 4640 mov r0, r8 80042c6: | | | | | | | | | | | | | | | | | | | 47b0 blx r6 if (tcp_active_pcbs_changed) { 80042c8: | | | | | | | | | | | | | | | | | | | f895 3100 ldrb.w r3, [r5, #256] @ 0x100 80042cc: | | | | | | | | | | | | | | | | | | | 2b00 cmp r3, #0 80042ce: | +--|--|--|--|--|--|--|--|--|--|--|--|-----------------|--|--|--|--|-- f47f af10 bne.w 80040f2 <tcp_tmr+0x46> ++pcb_reset; 80042d2: | | | | | | | | | | | | | | | | | | \-> 9c04 ldr r4, [sp, #16] 80042d4: | | | +--|--|--|--|--|--|--|--|--|--|-----------------|--|--|--|----- e77e b.n 80041d4 <tcp_tmr+0x128> } else if (pcb->nrtx >= TCP_MAXRTX) { 80042d6: | | | | | | | | | | | | | | | | \--|----> 2b0b cmp r3, #11 80042d8: | | | | | | | | | | | | | | | | \----- e786 b.n 80041e8 <tcp_tmr+0x13c> 80042da: | | | | | | | | | | | | | | | | bf00 nop 80042dc: | | | | | | | | | | | | | | | | 20001158 .word 0x20001158 80042e0: | | | | | | | | | | | | | | | | 20000060 .word 0x20000060 80042e4: | | | | | | | | | | | | | | | | 0800b549 .word 0x0800b549 80042e8: | | | | | | | | | | | | | | | | 0800bee1 .word 0x0800bee1 80042ec: | | | | | | | | | | | | | | | | 0800b232 .word 0x0800b232 80042f0: | | | | | | | | | | | | | | | | 0800bf0a .word 0x0800bf0a 80042f4: | | | | | | | | | | | | | | | | 0800bf33 .word 0x0800bf33 80042f8: | | | | | | | | | | | | | | | | 0800bfe1 .word 0x0800bfe1 80042fc: | | | | | | | | | | | | | | | | 0800c036 .word 0x0800c036 if (pcb->persist_backoff > 0) { 8004300: | | | | | | | | | | | | | | | \----------> f894 3099 ldrb.w r3, [r4, #153] @ 0x99 8004304: | | | | | | | | | | | | | | | 2b00 cmp r3, #0 8004306: | | | | | | | | | | | | | | /--------------|-------------- f000 815b beq.w 80045c0 <tcp_tmr+0x514> LWIP_ASSERT("tcp_slowtimr: persist ticking with in-flight data", pcb->unacked == NULL); 800430a: | | | | | | | | | | | | | | | | 6f23 ldr r3, [r4, #112] @ 0x70 800430c: | | | | | | | | | | | | | | | | /-- b15b cbz r3, 8004326 <tcp_tmr+0x27a> 800430e: | | | | | | | | | | | | | | | | | b672 cpsid i 8004310: | | | | | | | | | | | | | | | | | 4ba2 ldr r3, [pc, #648] @ (800459c ) 8004312: | | | | | | | | | | | | | | | | | f8d9 12fc ldr.w r1, [r9, #764] @ 0x2fc 8004316: | | | | | | | | | | | | | | | | | 4aa2 ldr r2, [pc, #648] @ (80045a0 ) 8004318: | | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 800431a: | | | | | | | | | | | | | | | | | 48a2 ldr r0, [pc, #648] @ (80045a4 ) 800431c: | | | | | | | | | | | | | | | | | f44f 639b mov.w r3, #1240 @ 0x4d8 8004320: | | | | | | | | | | | | | | | | | f7fc ffea bl 80012f8 <printf_> 8004324: | | | | | | | | | | | | | | | | | be00 bkpt 0x0000 LWIP_ASSERT("tcp_slowtimr: persist ticking with empty send buffer", pcb->unsent != NULL); 8004326: | | | | | | | | | | | | | | | | \-> 6ee3 ldr r3, [r4, #108] @ 0x6c 8004328: | | | | | | | | | | | | | | | | /-- b963 cbnz r3, 8004344 <tcp_tmr+0x298> 800432a: | | | | | | | | | | | | | | | | | b672 cpsid i 800432c: | | | | | | | | | | | | | | | | | 4b9e ldr r3, [pc, #632] @ (80045a8 ) 800432e: | | | | | | | | | | | | | | | | | 4a9f ldr r2, [pc, #636] @ (80045ac ) 8004330: | | | | | | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004334: | | | | | | | | | | | | | | | | | 4b99 ldr r3, [pc, #612] @ (800459c ) 8004336: | | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 8004338: | | | | | | | | | | | | | | | | | 489a ldr r0, [pc, #616] @ (80045a4 ) 800433a: | | | | | | | | | | | | | | | | | f240 43d9 movw r3, #1241 @ 0x4d9 800433e: | | | | | | | | | | | | | | | | | f7fc ffdb bl 80012f8 <printf_> 8004342: | | | | | | | | | | | | | | | | | be00 bkpt 0x0000 if (pcb->persist_probe >= TCP_MAXRTX) { 8004344: | | | | | | | | | | | | | | | | \-> f894 209a ldrb.w r2, [r4, #154] @ 0x9a 8004348: | | | | | | | | | | | | | | | | 2a0b cmp r2, #11 800434a: | | | | | | | | | | | | | | | \-------------- f63f af4f bhi.w 80041ec <tcp_tmr+0x140> u8_t backoff_cnt = tcp_persist_backoff[pcb->persist_backoff - 1]; 800434e: | | | | | | | | | | | | | | | f894 1099 ldrb.w r1, [r4, #153] @ 0x99 8004352: | | | | | | | | | | | | | | | 4b97 ldr r3, [pc, #604] @ (80045b0 ) 8004354: | | | | | | | | | | | | | | | 440b add r3, r1 8004356: | | | | | | | | | | | | | | | f893 10db ldrb.w r1, [r3, #219] @ 0xdb if (pcb->persist_cnt < backoff_cnt) { 800435a: | | | | | | | | | | | | | | | f894 3098 ldrb.w r3, [r4, #152] @ 0x98 800435e: | | | | | | | | | | | | | | | 4299 cmp r1, r3 8004360: | | | | | | | | | | | | | | | /-------- f200 80b4 bhi.w 80044cc <tcp_tmr+0x420> if (pcb->snd_wnd == 0) { 8004364: | | | | | | | | | | | | | | | /--|-------> f8b4 7060 ldrh.w r7, [r4, #96] @ 0x60 ("tcp_zero_window_probe: tcp_ticks %"U32_F " pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n", tcp_ticks, pcb->tmr, (u16_t)pcb->keep_cnt_sent)); /* Only consider unsent, persist timer should be off when there is data in-flight */ seg = pcb->unsent; 8004368: | | | | | | | | | | | | | | | | | 6ee6 ldr r6, [r4, #108] @ 0x6c 800436a: | | | | | | | | | | | | | | | | | 2f00 cmp r7, #0 800436c: | | | | | | | | | | | | | | | /--|--|-------- f000 80b7 beq.w 80044de <tcp_tmr+0x432> if (useg == NULL) { 8004370: | | | | | | | | | | | | | | | | | | 2e00 cmp r6, #0 8004372: | | | | | | | | | | | | | | | /-----------|--|--|-------- f000 80ef beq.w 8004554 <tcp_tmr+0x4a8> if (useg->len <= split) { 8004376: | | | | | | | | | | | | | | | | | | | 8933 ldrh r3, [r6, #8] 8004378: | | | | | | | | | | | | | | | | | | | 42bb cmp r3, r7 800437a: | | | | | | | | | | | | | | | | | | | /----- f240 80a2 bls.w 80044c2 <tcp_tmr+0x416> LWIP_ASSERT("split <= mss", split <= pcb->mss); 800437e: | | | | | | | | | | | | | | | | | | | | 8e63 ldrh r3, [r4, #50] @ 0x32 8004380: | | | | | | | | | | | | | | | | | | | | 42bb cmp r3, r7 8004382: | | | | | | | | | | | | | | | | | | | | /-- d21d bcs.n 80043c0 <tcp_tmr+0x314> 8004384: | | | | | | | | | | | | | | | | | | | | | b672 cpsid i 8004386: | | | | | | | | | | | | | | | | | | | | | f8df a220 ldr.w sl, [pc, #544] @ 80045a8 800438a: | | | | | | | | | | | | | | | | | | | | | f8df 8230 ldr.w r8, [pc, #560] @ 80045bc 800438e: | | | | | | | | | | | | | | | | | | | | | f8da 12fc ldr.w r1, [sl, #764] @ 0x2fc 8004392: | | | | | | | | | | | | | | | | | | | | | 4a88 ldr r2, [pc, #544] @ (80045b4 ) 8004394: | | | | | | | | | | | | | | | | | | | | | f8cd 8000 str.w r8, [sp] 8004398: | | | | | | | | | | | | | | | | | | | | | f240 335e movw r3, #862 @ 0x35e 800439c: | | | | | | | | | | | | | | | | | | | | | 4881 ldr r0, [pc, #516] @ (80045a4 ) 800439e: | | | | | | | | | | | | | | | | | | | | | f7fc ffab bl 80012f8 <printf_> 80043a2: | | | | | | | | | | | | | | | | | | | | | be00 bkpt 0x0000 LWIP_ASSERT("useg->len > 0", useg->len > 0); 80043a4: | | | | | | | | | | | | | | | | | | | | | 8933 ldrh r3, [r6, #8] 80043a6: | | | | | | | | | | | | | | | | | | | | +-- b95b cbnz r3, 80043c0 <tcp_tmr+0x314> 80043a8: | | | | | | | | | | | | | | | | | | | | | b672 cpsid i 80043aa: | | | | | | | | | | | | | | | | | | | | | 4a83 ldr r2, [pc, #524] @ (80045b8 ) 80043ac: | | | | | | | | | | | | | | | | | | | | | f8da 12fc ldr.w r1, [sl, #764] @ 0x2fc 80043b0: | | | | | | | | | | | | | | | | | | | | | 487c ldr r0, [pc, #496] @ (80045a4 ) 80043b2: | | | | | | | | | | | | | | | | | | | | | f8cd 8000 str.w r8, [sp] 80043b6: | | | | | | | | | | | | | | | | | | | | | f240 335f movw r3, #863 @ 0x35f 80043ba: | | | | | | | | | | | | | | | | | | | | | f7fc ff9d bl 80012f8 <printf_> 80043be: | | | | | | | | | | | | | | | | | | | | | be00 bkpt 0x0000 optflags = useg->flags; 80043c0: | | | | | | | | | | | | | | | | | | | | \-> 7b33 ldrb r3, [r6, #12] 80043c2: | | | | | | | | | | | | | | | | | | | | 9306 str r3, [sp, #24] optlen = LWIP_TCP_OPT_LENGTH(optflags); 80043c4: | | | | | | | | | | | | | | | | | | | | ea4f 0a83 mov.w sl, r3, lsl #2 remainder = useg->len - split; 80043c8: | | | | | | | | | | | | | | | | | | | | 8933 ldrh r3, [r6, #8] 80043ca: | | | | | | | | | | | | | | | | | | | | 9307 str r3, [sp, #28] 80043cc: | | | | | | | | | | | | | | | | | | | | 1bd9 subs r1, r3, r7 optlen = LWIP_TCP_OPT_LENGTH(optflags); 80043ce: | | | | | | | | | | | | | | | | | | | | f00a 0a04 and.w sl, sl, #4 remainder = useg->len - split; 80043d2: | | | | | | | | | | | | | | | | | | | | fa1f fb81 uxth.w fp, r1 p = pbuf_alloc(PBUF_TRANSPORT, remainder + optlen, PBUF_RAM); 80043d6: | | | | | | | | | | | | | | | | | | | | fa1a f181 uxtah r1, sl, r1 80043da: | | | | | | | | | | | | | | | | | | | | b289 uxth r1, r1 80043dc: | | | | | | | | | | | | | | | | | | | | 2036 movs r0, #54 @ 0x36 80043de: | | | | | | | | | | | | | | | | | | | | f004 ff4b bl 8009278 <pbuf_alloc.constprop.0> if (p == NULL) { 80043e2: | | | | | | | | | | | | | | | | | | | | 4680 mov r8, r0 80043e4: | | | | | | | | | | | | | | | | | | | | 2800 cmp r0, #0 80043e6: | | | | | | | | | | | | | | | | /--------|--|--|--|----- f000 80ca beq.w 800457e <tcp_tmr+0x4d2> offset = useg->p->tot_len - useg->len + split; 80043ea: | | | | | | | | | | | | | | | | | | | | | 6870 ldr r0, [r6, #4] 80043ec: | | | | | | | | | | | | | | | | | | | | | 8932 ldrh r2, [r6, #8] 80043ee: | | | | | | | | | | | | | | | | | | | | | 8903 ldrh r3, [r0, #8] if (pbuf_copy_partial(useg->p, (u8_t *)p->payload + optlen, remainder, offset ) != remainder) { 80043f0: | | | | | | | | | | | | | | | | | | | | | f8d8 1004 ldr.w r1, [r8, #4] offset = useg->p->tot_len - useg->len + split; 80043f4: | | | | | | | | | | | | | | | | | | | | | 1a9b subs r3, r3, r2 80043f6: | | | | | | | | | | | | | | | | | | | | | 443b add r3, r7 if (pbuf_copy_partial(useg->p, (u8_t *)p->payload + optlen, remainder, offset ) != remainder) { 80043f8: | | | | | | | | | | | | | | | | | | | | | b29b uxth r3, r3 80043fa: | | | | | | | | | | | | | | | | | | | | | 465a mov r2, fp 80043fc: | | | | | | | | | | | | | | | | | | | | | 4451 add r1, sl 80043fe: | | | | | | | | | | | | | | | | | | | | | f7fd fbad bl 8001b5c <pbuf_copy_partial> 8004402: | | | | | | | | | | | | | | | | | | | | | 4583 cmp fp, r0 8004404: | | | | | | | | | | | | | | | | | /--|--|--|--|----- f040 80bd bne.w 8004582 <tcp_tmr+0x4d6> split_flags = TCPH_FLAGS(useg->tcphdr); 8004408: | | | | | | | | | | | | | | | | | | | | | | 6933 ldr r3, [r6, #16] 800440a: | | | | | | | | | | | | | | | | | | | | | | f8b3 b00c ldrh.w fp, [r3, #12] seg = tcp_create_segment(pcb, p, remainder_flags, lwip_ntohl(useg->tcphdr->seqno) + split, optflags); 800440e: | | | | | | | | | | | | | | | | | | | | | | 6858 ldr r0, [r3, #4] 8004410: | | | | | | | | | | | | | | | | | | | | | | fa9b fb9b rev16.w fp, fp split_flags = TCPH_FLAGS(useg->tcphdr); 8004414: | | | | | | | | | | | | | | | | | | | | | | fa5f fa8b uxtb.w sl, fp if (split_flags & TCP_PSH) { 8004418: | | | | | | | | | | | | | | | | | | | | | | f01b 0b08 ands.w fp, fp, #8 split_flags &= ~TCP_PSH; 800441c: | | | | | | | | | | | | | | | | | | | | | | bf16 itet ne 800441e: | | | | | | | | | | | | | | | | | | | | | | f00a 0a37 andne.w sl, sl, #55 @ 0x37 split_flags = TCPH_FLAGS(useg->tcphdr); 8004422: | | | | | | | | | | | | | | | | | | | | | | f00a 0a3f andeq.w sl, sl, #63 @ 0x3f remainder_flags |= TCP_PSH; 8004426: | | | | | | | | | | | | | | | | | | | | | | f04f 0b08 movne.w fp, #8 if (split_flags & TCP_FIN) { 800442a: | | | | | | | | | | | | | | | | | | | | | | f01a 0f01 tst.w sl, #1 remainder_flags |= TCP_FIN; 800442e: | | | | | | | | | | | | | | | | | | | | | | bf1c itt ne 8004430: | | | | | | | | | | | | | | | | | | | | | | f04b 0b01 orrne.w fp, fp, #1 split_flags &= ~TCP_FIN; 8004434: | | | | | | | | | | | | | | | | | | | | | | f00a 0afe andne.w sl, sl, #254 @ 0xfe seg = tcp_create_segment(pcb, p, remainder_flags, lwip_ntohl(useg->tcphdr->seqno) + split, optflags); 8004438: | | | | | | | | | | | | | | | | | | | | | | f003 fe7c bl 8008134 <lwip_htonl> 800443c: | | | | | | | | | | | | | | | | | | | | | | 9b06 ldr r3, [sp, #24] 800443e: | | | | | | | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 8004440: | | | | | | | | | | | | | | | | | | | | | | 4641 mov r1, r8 8004442: | | | | | | | | | | | | | | | | | | | | | | 183b adds r3, r7, r0 8004444: | | | | | | | | | | | | | | | | | | | | | | 465a mov r2, fp 8004446: | | | | | | | | | | | | | | | | | | | | | | 4620 mov r0, r4 8004448: | | | | | | | | | | | | | | | | | | | | | | f7fe fa6c bl 8002924 <tcp_create_segment> if (seg == NULL) { 800444c: | | | | | | | | | | | | | | | | | | | | | | 4680 mov r8, r0 800444e: | | | | | | | | | | | | | | | | | | | | | | 2800 cmp r0, #0 8004450: | | | | | | | | | | | | | | | | +-----|--|--|--|--|----- f000 8095 beq.w 800457e <tcp_tmr+0x4d2> pcb->snd_queuelen -= pbuf_clen(useg->p); 8004454: | | | | | | | | | | | | | | | | | | | | | | f8d6 b004 ldr.w fp, [r6, #4] 8004458: | | | | | | | | | | | | | | | | | | | | | | 4658 mov r0, fp 800445a: | | | | | | | | | | | | | | | | | | | | | | f7fe f8e3 bl 8002624 <pbuf_clen> 800445e: | | | | | | | | | | | | | | | | | | | | | | f8b4 3066 ldrh.w r3, [r4, #102] @ 0x66 8004462: | | | | | | | | | | | | | | | | | | | | | | 1a1b subs r3, r3, r0 8004464: | | | | | | | | | | | | | | | | | | | | | | f8a4 3066 strh.w r3, [r4, #102] @ 0x66 pbuf_realloc(useg->p, useg->p->tot_len - remainder); 8004468: | | | | | | | | | | | | | | | | | | | | | | 9b07 ldr r3, [sp, #28] 800446a: | | | | | | | | | | | | | | | | | | | | | | 1af9 subs r1, r7, r3 800446c: | | | | | | | | | | | | | | | | | | | | | | f8bb 3008 ldrh.w r3, [fp, #8] 8004470: | | | | | | | | | | | | | | | | | | | | | | b28f uxth r7, r1 8004472: | | | | | | | | | | | | | | | | | | | | | | fa13 f181 uxtah r1, r3, r1 8004476: | | | | | | | | | | | | | | | | | | | | | | b289 uxth r1, r1 8004478: | | | | | | | | | | | | | | | | | | | | | | 4658 mov r0, fp 800447a: | | | | | | | | | | | | | | | | | | | | | | f7fd fa73 bl 8001964 <pbuf_realloc> useg->len -= remainder; 800447e: | | | | | | | | | | | | | | | | | | | | | | 8933 ldrh r3, [r6, #8] TCPH_SET_FLAG(useg->tcphdr, split_flags); 8004480: | | | | | | | | | | | | | | | | | | | | | | 6932 ldr r2, [r6, #16] pcb->snd_queuelen += pbuf_clen(useg->p); 8004482: | | | | | | | | | | | | | | | | | | | | | | 6870 ldr r0, [r6, #4] useg->len -= remainder; 8004484: | | | | | | | | | | | | | | | | | | | | | | 441f add r7, r3 8004486: | | | | | | | | | | | | | | | | | | | | | | 8137 strh r7, [r6, #8] TCPH_SET_FLAG(useg->tcphdr, split_flags); 8004488: | | | | | | | | | | | | | | | | | | | | | | 8993 ldrh r3, [r2, #12] 800448a: | | | | | | | | | | | | | | | | | | | | | | ea43 230a orr.w r3, r3, sl, lsl #8 800448e: | | | | | | | | | | | | | | | | | | | | | | 8193 strh r3, [r2, #12] useg->oversize_left = 0; 8004490: | | | | | | | | | | | | | | | | | | | | | | 2300 movs r3, #0 8004492: | | | | | | | | | | | | | | | | | | | | | | 8173 strh r3, [r6, #10] pcb->snd_queuelen += pbuf_clen(useg->p); 8004494: | | | | | | | | | | | | | | | | | | | | | | f7fe f8c6 bl 8002624 <pbuf_clen> 8004498: | | | | | | | | | | | | | | | | | | | | | | 4601 mov r1, r0 pcb->snd_queuelen += pbuf_clen(seg->p); 800449a: | | | | | | | | | | | | | | | | | | | | | | f8d8 0004 ldr.w r0, [r8, #4] pcb->snd_queuelen += pbuf_clen(useg->p); 800449e: | | | | | | | | | | | | | | | | | | | | | | f8b4 7066 ldrh.w r7, [r4, #102] @ 0x66 pcb->snd_queuelen += pbuf_clen(seg->p); 80044a2: | | | | | | | | | | | | | | | | | | | | | | f7fe f8bf bl 8002624 <pbuf_clen> 80044a6: | | | | | | | | | | | | | | | | | | | | | | 4401 add r1, r0 seg->next = useg->next; 80044a8: | | | | | | | | | | | | | | | | | | | | | | 6833 ldr r3, [r6, #0] pcb->snd_queuelen += pbuf_clen(seg->p); 80044aa: | | | | | | | | | | | | | | | | | | | | | | 440f add r7, r1 80044ac: | | | | | | | | | | | | | | | | | | | | | | f8a4 7066 strh.w r7, [r4, #102] @ 0x66 seg->next = useg->next; 80044b0: | | | | | | | | | | | | | | | | | | | | | | f8c8 3000 str.w r3, [r8] useg->next = seg; 80044b4: | | | | | | | | | | | | | | | | | | | | | | f8c6 8000 str.w r8, [r6] if (seg->next == NULL) { 80044b8: | | | | | | | | | | | | | | | | | | | | | | f8d8 3000 ldr.w r3, [r8] 80044bc: | | | | | | | | | | | | | | | | | | | | | +----- b90b cbnz r3, 80044c2 <tcp_tmr+0x416> pcb->unsent_oversize = 0; 80044be: | | | | | | | | | | | | | | | | | | | | | | f8a4 3068 strh.w r3, [r4, #104] @ 0x68 if (tcp_output(pcb) == ERR_OK) { 80044c2: | | | | | | | | | | | | | | | | | | | | | \----> 4620 mov r0, r4 80044c4: | | | | | | | | | | | | | | | | | | | | | f7ff f8a6 bl 8003614 <tcp_output> 80044c8: | | | | | | | | | | | | | | | | | /--|--|--|--|-------- b138 cbz r0, 80044da <tcp_tmr+0x42e> 80044ca: | | | | | | | | | | | | | | | +--|--|--|--|--|--|-------- e043 b.n 8004554 <tcp_tmr+0x4a8> pcb->persist_cnt++; 80044cc: | | | | | | | | | | | | | | | | | | | | | \-------> 3301 adds r3, #1 80044ce: | | | | | | | | | | | | | | | | | | | | | b2db uxtb r3, r3 if (pcb->persist_cnt >= backoff_cnt) { 80044d0: | | | | | | | | | | | | | | | | | | | | | 4299 cmp r1, r3 pcb->persist_cnt++; 80044d2: | | | | | | | | | | | | | | | | | | | | | f884 3098 strb.w r3, [r4, #152] @ 0x98 if (pcb->persist_cnt >= backoff_cnt) { 80044d6: | | | | | | | | | | | | | | | | | | | | \----------- f67f af45 bls.w 8004364 <tcp_tmr+0x2b8> pcb_remove = 0; 80044da: | | | | | | | | | | | | | | | | | >--|--|-------------> 2600 movs r6, #0 80044dc: | | | | | | | | | | | | | \--|--|--|--|--|--|-------------- e687 b.n 80041ee <tcp_tmr+0x142> if (seg == NULL) { 80044de: | | | | | | | | | | | | | | | | | | \-------------> 2e00 cmp r6, #0 80044e0: | | | | | | | | | | | | | | +--|--|--|----------------- d038 beq.n 8004554 <tcp_tmr+0x4a8> /* increment probe count. NOTE: we record probe even if it fails to actually transmit due to an error. This ensures memory exhaustion/ routing problem doesn't leave a zero-window pcb as an indefinite zombie. RTO mechanism has similar behavior, see pcb->nrtx */ if (pcb->persist_probe < 0xFF) { ++pcb->persist_probe; 80044e2: | | | | | | | | | | | | | | | | | | 1c53 adds r3, r2, #1 80044e4: | | | | | | | | | | | | | | | | | | f884 309a strb.w r3, [r4, #154] @ 0x9a } is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0); 80044e8: | | | | | | | | | | | | | | | | | | 6933 ldr r3, [r6, #16] 80044ea: | | | | | | | | | | | | | | | | | | f8b3 800c ldrh.w r8, [r3, #12] /* we want to send one seqno: either FIN or data (no options) */ len = is_fin ? 0 : 1; p = tcp_output_alloc_header(pcb, optlen, len, seg->tcphdr->seqno); 80044ee: | | | | | | | | | | | | | | | | | | 685a ldr r2, [r3, #4] 80044f0: | | | | | | | | | | | | | | | | | | fa98 f898 rev16.w r8, r8 is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0); 80044f4: | | | | | | | | | | | | | | | | | | f018 0801 ands.w r8, r8, #1 80044f8: | | | | | | | | | | | | | | | | | | bf1e ittt ne 80044fa: | | | | | | | | | | | | | | | | | | f8b6 8008 ldrhne.w r8, [r6, #8] 80044fe: | | | | | | | | | | | | | | | | | | fab8 f888 clzne r8, r8 8004502: | | | | | | | | | | | | | | | | | | ea4f 1858 movne.w r8, r8, lsr #5 p = tcp_output_alloc_header(pcb, optlen, len, seg->tcphdr->seqno); 8004506: | | | | | | | | | | | | | | | | | | f088 0101 eor.w r1, r8, #1 800450a: | | | | | | | | | | | | | | | | | | 4620 mov r0, r4 800450c: | | | | | | | | | | | | | | | | | | f004 ff40 bl 8009390 <tcp_output_alloc_header.constprop.0> if (p == NULL) { 8004510: | | | | | | | | | | | | | | | | | | 4607 mov r7, r0 8004512: | | | | | | | | | | | | | | | | | | 2800 cmp r0, #0 8004514: | | | | | | | | | | | | | | | | +--|----------------- d0e1 beq.n 80044da <tcp_tmr+0x42e> LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: no memory for pbuf\n")); return ERR_MEM; } tcphdr = (struct tcp_hdr *)p->payload; 8004516: | | | | | | | | | | | | | | | | | | 6841 ldr r1, [r0, #4] if (is_fin) { 8004518: | | | | | | | | | | | | | | | | | | f1b8 0f00 cmp.w r8, #0 800451c: | | | | | | | | | | | | | | | | | | /-- d025 beq.n 800456a <tcp_tmr+0x4be> /* FIN segment, no data */ TCPH_FLAGS_SET(tcphdr, TCP_ACK | TCP_FIN); 800451e: | | | | | | | | | | | | | | | | | | | 898b ldrh r3, [r1, #12] 8004520: | | | | | | | | | | | | | | | | | | | f423 537c bic.w r3, r3, #16128 @ 0x3f00 8004524: | | | | | | | | | | | | | | | | | | | f443 5388 orr.w r3, r3, #4352 @ 0x1100 8004528: | | | | | | | | | | | | | | | | | | | 818b strh r3, [r1, #12] Ensure we copy the first TCP data byte: */ pbuf_copy_partial(seg->p, d, 1, seg->p->tot_len - seg->len); } /* The byte may be acknowledged without the window being opened. */ snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + 1; 800452a: | | | | | | | | | | | | | | | | | | /--|-> 6933 ldr r3, [r6, #16] 800452c: | | | | | | | | | | | | | | | | | | | | 6858 ldr r0, [r3, #4] 800452e: | | | | | | | | | | | | | | | | | | | | f003 fe01 bl 8008134 <lwip_htonl> if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) { 8004532: | | | | | | | | | | | | | | | | | | | | 6d23 ldr r3, [r4, #80] @ 0x50 snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + 1; 8004534: | | | | | | | | | | | | | | | | | | | | 3001 adds r0, #1 if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) { 8004536: | | | | | | | | | | | | | | | | | | | | 1a1b subs r3, r3, r0 8004538: | | | | | | | | | | | | | | | | | | | | 2b00 cmp r3, #0 pcb->snd_nxt = snd_nxt; 800453a: | | | | | | | | | | | | | | | | | | | | bfb8 it lt 800453c: | | | | | | | | | | | | | | | | | | | | 6520 strlt r0, [r4, #80] @ 0x50 } tcp_output_fill_options(pcb, p, 0, 0); 800453e: | | | | | | | | | | | | | | | | | | | | 4638 mov r0, r7 8004540: | | | | | | | | | | | | | | | | | | | | f004 fd50 bl 8008fe4 <tcp_output_fill_options.constprop.0> err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip); 8004544: | | | | | | | | | | | | | | | | | | | | 1d23 adds r3, r4, #4 8004546: | | | | | | | | | | | | | | | | | | | | 4622 mov r2, r4 8004548: | | | | | | | | | | | | | | | | | | | | 4639 mov r1, r7 800454a: | | | | | | | | | | | | | | | | | | | | 4620 mov r0, r4 800454c: | | | | | | | | | | | | | | | | | | | | f7fe fbb2 bl 8002cb4 <tcp_output_control_segment> if (tcp_zero_window_probe(pcb) != ERR_OK) { 8004550: | | | | | | | | | | | | | | | | | | | | 2800 cmp r0, #0 8004552: | | | | | | | | | | | | | | | | +--|-----------|--|-- d1c2 bne.n 80044da <tcp_tmr+0x42e> pcb->persist_cnt = 0; 8004554: | | | | | | | | | | | | | | >--|--|--|-----------|--|-> 2300 movs r3, #0 8004556: | | | | | | | | | | | | | | | | | | | | f884 3098 strb.w r3, [r4, #152] @ 0x98 if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) { 800455a: | | | | | | | | | | | | | | | | | | | | f894 3099 ldrb.w r3, [r4, #153] @ 0x99 800455e: | | | | | | | | | | | | | | | | | | | | 2b06 cmp r3, #6 pcb->persist_backoff++; 8004560: | | | | | | | | | | | | | | | | | | | | bf9c itt ls 8004562: | | | | | | | | | | | | | | | | | | | | 3301 addls r3, #1 8004564: | | | | | | | | | | | | | | | | | | | | f884 3099 strbls.w r3, [r4, #153] @ 0x99 8004568: | | | | | | | | | | | | | | | | +--|-----------|--|-- e7b7 b.n 80044da <tcp_tmr+0x42e> pbuf_copy_partial(seg->p, d, 1, seg->p->tot_len - seg->len); 800456a: | | | | | | | | | | | | | | | | | | | \-> 6870 ldr r0, [r6, #4] 800456c: | | | | | | | | | | | | | | | | | | | 8932 ldrh r2, [r6, #8] 800456e: | | | | | | | | | | | | | | | | | | | 8903 ldrh r3, [r0, #8] 8004570: | | | | | | | | | | | | | | | | | | | 1a9b subs r3, r3, r2 8004572: | | | | | | | | | | | | | | | | | | | b29b uxth r3, r3 8004574: | | | | | | | | | | | | | | | | | | | 2201 movs r2, #1 8004576: | | | | | | | | | | | | | | | | | | | 3114 adds r1, #20 8004578: | | | | | | | | | | | | | | | | | | | f7fd faf0 bl 8001b5c <pbuf_copy_partial> 800457c: | | | | | | | | | | | | | | | | | | \----- e7d5 b.n 800452a <tcp_tmr+0x47e> p = pbuf_alloc(PBUF_TRANSPORT, remainder + optlen, PBUF_RAM); 800457e: | | | | | | | | | | | | | | | \--|--|----------------> f04f 0800 mov.w r8, #0 TCP_STATS_INC(tcp.memerr); 8004582: | | | | | | | | | | | | | | | | \----------------> f8b5 3048 ldrh.w r3, [r5, #72] @ 0x48 8004586: | | | | | | | | | | | | | | | | 3301 adds r3, #1 8004588: | | | | | | | | | | | | | | | | f8a5 3048 strh.w r3, [r5, #72] @ 0x48 if (p != NULL) { 800458c: | | | | | | | | | | | | | | | | f1b8 0f00 cmp.w r8, #0 8004590: | | | | | | | | | | | | | | +-----|-------------------- d0e0 beq.n 8004554 <tcp_tmr+0x4a8> pbuf_free(p); 8004592: | | | | | | | | | | | | | | | | 4640 mov r0, r8 8004594: | | | | | | | | | | | | | | | | f005 fc12 bl 8009dbc <pbuf_free.isra.0> 8004598: | | | | | | | | | | | | | | \-----|-------------------- e7dc b.n 8004554 <tcp_tmr+0x4a8> 800459a: | | | | | | | | | | | | | | | bf00 nop 800459c: | | | | | | | | | | | | | | | 0800b549 .word 0x0800b549 80045a0: | | | | | | | | | | | | | | | 0800bf5f .word 0x0800bf5f 80045a4: | | | | | | | | | | | | | | | 0800b232 .word 0x0800b232 80045a8: | | | | | | | | | | | | | | | 20000060 .word 0x20000060 80045ac: | | | | | | | | | | | | | | | 0800bf91 .word 0x0800bf91 80045b0: | | | | | | | | | | | | | | | 0800d264 .word 0x0800d264 80045b4: | | | | | | | | | | | | | | | 0800bfc6 .word 0x0800bfc6 80045b8: | | | | | | | | | | | | | | | 0800bfd3 .word 0x0800bfd3 80045bc: | | | | | | | | | | | | | | | 0800b5cd .word 0x0800b5cd if ((pcb->rtime >= 0) && (pcb->rtime < 0x7FFF)) { 80045c0: | | | | | | | | | | | | | \--------|-------------------> 8e23 ldrh r3, [r4, #48] @ 0x30 80045c2: | | | | | | | | | | | | | | f647 72fe movw r2, #32766 @ 0x7ffe 80045c6: | | | | | | | | | | | | | | 4293 cmp r3, r2 ++pcb->rtime; 80045c8: | | | | | | | | | | | | | | bf9c itt ls 80045ca: | | | | | | | | | | | | | | 3301 addls r3, #1 80045cc: | | | | | | | | | | | | | | 8623 strhls r3, [r4, #48] @ 0x30 if (pcb->rtime >= pcb->rto) { 80045ce: | | | | | | | | | | | | | | f9b4 2030 ldrsh.w r2, [r4, #48] @ 0x30 80045d2: | | | | | | | | | | | | | | f9b4 3040 ldrsh.w r3, [r4, #64] @ 0x40 80045d6: | | | | | | | | | | | | | | 429a cmp r2, r3 80045d8: | | | | | | | | | | | | | +-------------------- f6ff af7f blt.w 80044da <tcp_tmr+0x42e> if ((tcp_rexmit_rto_prepare(pcb) == ERR_OK) || ((pcb->unacked == NULL) && (pcb->unsent != NULL))) { 80045dc: | | | | | | | | | | | | | | 4620 mov r0, r4 80045de: | | | | | | | | | | | | | | f7fd fc0d bl 8001dfc <tcp_rexmit_rto_prepare> 80045e2: | | | | | | | | | | | | | | /-- b138 cbz r0, 80045f4 <tcp_tmr+0x548> 80045e4: | | | | | | | | | | | | | | | 6f23 ldr r3, [r4, #112] @ 0x70 80045e6: | | | | | | | | | | | | | | | 2b00 cmp r3, #0 80045e8: | | | | | | | | | | | | | +-----------------|-- f47f af77 bne.w 80044da <tcp_tmr+0x42e> 80045ec: | | | | | | | | | | | | | | | 6ee3 ldr r3, [r4, #108] @ 0x6c 80045ee: | | | | | | | | | | | | | | | 2b00 cmp r3, #0 80045f0: | | | | | | | | | | | | | +-----------------|-- f43f af73 beq.w 80044da <tcp_tmr+0x42e> if (pcb->state != SYN_SENT) { 80045f4: | | | | | | | | | | | | | | \-> 7d23 ldrb r3, [r4, #20] 80045f6: | | | | | | | | | | | | | | 2b02 cmp r3, #2 80045f8: | | | | | | | | | | | | | | /-- d016 beq.n 8004628 <tcp_tmr+0x57c> int calc_rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[backoff_idx]; 80045fa: | | | | | | | | | | | | | | | f9b4 203c ldrsh.w r2, [r4, #60] @ 0x3c 80045fe: | | | | | | | | | | | | | | | f9b4 303e ldrsh.w r3, [r4, #62] @ 0x3e u8_t backoff_idx = LWIP_MIN(pcb->nrtx, sizeof(tcp_backoff) - 1); 8004602: | | | | | | | | | | | | | | | f894 1042 ldrb.w r1, [r4, #66] @ 0x42 int calc_rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[backoff_idx]; 8004606: | | | | | | | | | | | | | | | eb03 03e2 add.w r3, r3, r2, asr #3 800460a: | | | | | | | | | | | | | | | 4a76 ldr r2, [pc, #472] @ (80047e4 ) 800460c: | | | | | | | | | | | | | | | 290c cmp r1, #12 800460e: | | | | | | | | | | | | | | | bf94 ite ls 8004610: | | | | | | | | | | | | | | | 1852 addls r2, r2, r1 8004612: | | | | | | | | | | | | | | | 320c addhi r2, #12 8004614: | | | | | | | | | | | | | | | f892 20e3 ldrb.w r2, [r2, #227] @ 0xe3 8004618: | | | | | | | | | | | | | | | 4093 lsls r3, r2 pcb->rto = (s16_t)LWIP_MIN(calc_rto, 0x7FFF); 800461a: | | | | | | | | | | | | | | | f647 72ff movw r2, #32767 @ 0x7fff 800461e: | | | | | | | | | | | | | | | 4293 cmp r3, r2 8004620: | | | | | | | | | | | | | | | bfa8 it ge 8004622: | | | | | | | | | | | | | | | 4613 movge r3, r2 8004624: | | | | | | | | | | | | | | | f8a4 3040 strh.w r3, [r4, #64] @ 0x40 eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd); 8004628: | | | | | | | | | | | | | | \-> f8b4 2048 ldrh.w r2, [r4, #72] @ 0x48 800462c: | | | | | | | | | | | | | | f8b4 3060 ldrh.w r3, [r4, #96] @ 0x60 if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) { 8004630: | | | | | | | | | | | | | | 8e60 ldrh r0, [r4, #50] @ 0x32 pcb->cwnd = pcb->mss; 8004632: | | | | | | | | | | | | | | f8a4 0048 strh.w r0, [r4, #72] @ 0x48 pcb->ssthresh = eff_wnd >> 1; 8004636: | | | | | | | | | | | | | | 4293 cmp r3, r2 8004638: | | | | | | | | | | | | | | bf28 it cs 800463a: | | | | | | | | | | | | | | 4613 movcs r3, r2 if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) { 800463c: | | | | | | | | | | | | | | 0042 lsls r2, r0, #1 800463e: | | | | | | | | | | | | | | 085b lsrs r3, r3, #1 8004640: | | | | | | | | | | | | | | b292 uxth r2, r2 8004642: | | | | | | | | | | | | | | 4293 cmp r3, r2 pcb->rtime = 0; 8004644: | | | | | | | | | | | | | | f04f 0100 mov.w r1, #0 if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) { 8004648: | | | | | | | | | | | | | | bf38 it cc 800464a: | | | | | | | | | | | | | | 4613 movcc r3, r2 pcb->rtime = 0; 800464c: | | | | | | | | | | | | | | 8621 strh r1, [r4, #48] @ 0x30 if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) { 800464e: | | | | | | | | | | | | | | f8a4 304a strh.w r3, [r4, #74] @ 0x4a pcb->bytes_acked = 0; 8004652: | | | | | | | | | | | | | | f8a4 106a strh.w r1, [r4, #106] @ 0x6a tcp_rexmit_rto_commit(pcb); 8004656: | | | | | | | | | | | | | | 4620 mov r0, r4 8004658: | | | | | | | | | | | | | | f7ff fd02 bl 8004060 <tcp_rexmit_rto_commit> 800465c: | | | | | | | | | | | | | \-------------------- e73d b.n 80044da <tcp_tmr+0x42e> if ((u32_t)(tcp_ticks - pcb->tmr) > 800465e: | | | | | | | | | | | | \----------------------------------> 6a23 ldr r3, [r4, #32] 8004660: | | | | | | | | | | | | f8d5 10d8 ldr.w r1, [r5, #216] @ 0xd8 8004664: | | | | | | | | | | | | 1ac9 subs r1, r1, r3 (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL) { 8004666: | | | | | | | | | | | | f8d4 3094 ldr.w r3, [r4, #148] @ 0x94 800466a: | | | | | | | | | | | | f503 2224 add.w r2, r3, #671744 @ 0xa4000 800466e: | | | | | | | | | | | | f602 42b8 addw r2, r2, #3256 @ 0xcb8 8004672: | | | | | | | | | | | | f44f 70fa mov.w r0, #500 @ 0x1f4 8004676: | | | | | | | | | | | | fbb2 f2f0 udiv r2, r2, r0 if ((u32_t)(tcp_ticks - pcb->tmr) > 800467a: | | | | | | | | | | | | 4291 cmp r1, r2 800467c: | | | | | | | | | | | | /-- d903 bls.n 8004686 <tcp_tmr+0x5da> ++pcb_remove; 800467e: | | | | | | | | | | | | | 3601 adds r6, #1 ++pcb_reset; 8004680: | | | | | | | | | | | | | 9f05 ldr r7, [sp, #20] ++pcb_remove; 8004682: | | | | | | | | | | | | | b2f6 uxtb r6, r6 ++pcb_reset; 8004684: | | | | | | | | | | | \-----------------------------------|-- e5cb b.n 800421e <tcp_tmr+0x172> (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb)) 8004686: | | | | | | | | | | | \-> f894 209b ldrb.w r2, [r4, #155] @ 0x9b 800468a: | | | | | | | | | | | 4f57 ldr r7, [pc, #348] @ (80047e8 ) 800468c: | | | | | | | | | | | fb07 3302 mla r3, r7, r2, r3 / TCP_SLOW_INTERVAL) { 8004690: | | | | | | | | | | | fbb3 f3f0 udiv r3, r3, r0 } else if ((u32_t)(tcp_ticks - pcb->tmr) > 8004694: | | | | | | | | | | | 4299 cmp r1, r3 8004696: | | | | +--|--|--|--|--|--|----------------------------------------- f67f adc1 bls.w 800421c <tcp_tmr+0x170> p = tcp_output_alloc_header(pcb, optlen, 0, lwip_htonl(pcb->snd_nxt - 1)); 800469a: | | | | | | | | | | | 6d20 ldr r0, [r4, #80] @ 0x50 800469c: | | | | | | | | | | | 3801 subs r0, #1 800469e: | | | | | | | | | | | f003 fd49 bl 8008134 <lwip_htonl> 80046a2: | | | | | | | | | | | 2100 movs r1, #0 80046a4: | | | | | | | | | | | 4602 mov r2, r0 80046a6: | | | | | | | | | | | 4620 mov r0, r4 80046a8: | | | | | | | | | | | f004 fe72 bl 8009390 <tcp_output_alloc_header.constprop.0> if (p == NULL) { 80046ac: | | | | | | | | | | | 4607 mov r7, r0 80046ae: | | | | | | | | | | | 2800 cmp r0, #0 80046b0: | | | | +--|--|--|--|--|--|----------------------------------------- f43f adb4 beq.w 800421c <tcp_tmr+0x170> tcp_output_fill_options(pcb, p, 0, 0); 80046b4: | | | | | | | | | | | f004 fc96 bl 8008fe4 <tcp_output_fill_options.constprop.0> err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip); 80046b8: | | | | | | | | | | | 1d23 adds r3, r4, #4 80046ba: | | | | | | | | | | | 4622 mov r2, r4 80046bc: | | | | | | | | | | | 4639 mov r1, r7 80046be: | | | | | | | | | | | 4620 mov r0, r4 80046c0: | | | | | | | | | | | f7fe faf8 bl 8002cb4 <tcp_output_control_segment> if (err == ERR_OK) { 80046c4: | | | | | | | | | | | 2800 cmp r0, #0 80046c6: | | | | +--|--|--|--|--|--|----------------------------------------- f47f ada9 bne.w 800421c <tcp_tmr+0x170> pcb->keep_cnt_sent++; 80046ca: | | | | | | | | | | | f894 309b ldrb.w r3, [r4, #155] @ 0x9b 80046ce: | | | | | | | | | | | 3301 adds r3, #1 80046d0: | | | | | | | | | | | f884 309b strb.w r3, [r4, #155] @ 0x9b 80046d4: | | | | \--|--|--|--|--|--|----------------------------------------- e5a2 b.n 800421c <tcp_tmr+0x170> if (pcb->state == LAST_ACK) { 80046d6: | | | | | | \--|--|--|----------------------------------------> 2b09 cmp r3, #9 80046d8: | | | | | | \--|--|----------------------------------------- f47f adbc bne.w 8004254 <tcp_tmr+0x1a8> if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) { 80046dc: | | | | | | | | f8d5 30d8 ldr.w r3, [r5, #216] @ 0xd8 80046e0: | | | | | | | | 6a22 ldr r2, [r4, #32] 80046e2: | | | | | | | | 1a9b subs r3, r3, r2 80046e4: | | | | | | | | 2bf0 cmp r3, #240 @ 0xf0 80046e6: | | | | | \--------|--|----------------------------------------- e5b4 b.n 8004252 <tcp_tmr+0x1a6> LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb); 80046e8: | | | | | \--|----------------------------------------> f8d5 30bc ldr.w r3, [r5, #188] @ 0xbc 80046ec: | | | | | | 429c cmp r4, r3 80046ee: | | | | | | /-- d00b beq.n 8004708 <tcp_tmr+0x65c> 80046f0: | | | | | | | b672 cpsid i 80046f2: | | | | | | | 4b3e ldr r3, [pc, #248] @ (80047ec ) 80046f4: | | | | | | | f8d9 12fc ldr.w r1, [r9, #764] @ 0x2fc 80046f8: | | | | | | | 4a3d ldr r2, [pc, #244] @ (80047f0 ) 80046fa: | | | | | | | 9300 str r3, [sp, #0] 80046fc: | | | | | | | 483d ldr r0, [pc, #244] @ (80047f4 ) 80046fe: | | | | | | | f240 5375 movw r3, #1397 @ 0x575 8004702: | | | | | | | f7fc fdf9 bl 80012f8 <printf_> 8004706: | | | | | | | be00 bkpt 0x0000 tcp_active_pcbs = pcb->next; 8004708: | | | | | | \-> 68e3 ldr r3, [r4, #12] 800470a: | | | | | | f8c5 30bc str.w r3, [r5, #188] @ 0xbc 800470e: | | | | | \----------------------------------------- e5c1 b.n 8004294 <tcp_tmr+0x1e8> ++prev->polltmr; 8004710: | | | | \-------------------------------------------------------> 7f23 ldrb r3, [r4, #28] if (prev->polltmr >= prev->pollinterval) { 8004712: | | | | 7f62 ldrb r2, [r4, #29] pcb = pcb->next; 8004714: | | | | 68e7 ldr r7, [r4, #12] ++prev->polltmr; 8004716: | | | | 3301 adds r3, #1 8004718: | | | | b2db uxtb r3, r3 if (prev->polltmr >= prev->pollinterval) { 800471a: | | | | 429a cmp r2, r3 ++prev->polltmr; 800471c: | | | | 7723 strb r3, [r4, #28] if (prev->polltmr >= prev->pollinterval) { 800471e: | | | +-------------------------------------------------------------- f63f ad59 bhi.w 80041d4 <tcp_tmr+0x128> TCP_EVENT_POLL(prev, err); 8004722: | | | | f8d4 308c ldr.w r3, [r4, #140] @ 0x8c prev->polltmr = 0; 8004726: | | | | 7726 strb r6, [r4, #28] tcp_active_pcbs_changed = 0; 8004728: | | | | f885 6100 strb.w r6, [r5, #256] @ 0x100 TCP_EVENT_POLL(prev, err); 800472c: | | | | /-- b91b cbnz r3, 8004736 <tcp_tmr+0x68a> tcp_output(prev); 800472e: | | | | /--|-> 4620 mov r0, r4 8004730: | | | | | | f7fe ff70 bl 8003614 <tcp_output> 8004734: | | | +--------------------------------------------------------|--|-- e54e b.n 80041d4 <tcp_tmr+0x128> TCP_EVENT_POLL(prev, err); 8004736: | | | | | \-> 6920 ldr r0, [r4, #16] 8004738: | | | | | 4621 mov r1, r4 800473a: | | | | | 4798 blx r3 if (tcp_active_pcbs_changed) { 800473c: | | | | | f895 3100 ldrb.w r3, [r5, #256] @ 0x100 8004740: | | | | | 2b00 cmp r3, #0 8004742: | \--|--|--------------------------------------------------------|----- f47f acd6 bne.w 80040f2 <tcp_tmr+0x46> if (err == ERR_OK) { 8004746: | | | | 2800 cmp r0, #0 8004748: | | \--------------------------------------------------------|----- f47f ad44 bne.w 80041d4 <tcp_tmr+0x128> 800474c: | | \----- e7ef b.n 800472e <tcp_tmr+0x682> LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); 800474e: | \----------------------------------------------------------------> 7d33 ldrb r3, [r6, #20] 8004750: | 2b0a cmp r3, #10 8004752: | /-- d00b beq.n 800476c <tcp_tmr+0x6c0> 8004754: | | b672 cpsid i 8004756: | | f240 53a5 movw r3, #1445 @ 0x5a5 800475a: | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 800475e: | | 4825 ldr r0, [pc, #148] @ (80047f4 ) 8004760: | | f8cd 8000 str.w r8, [sp] 8004764: | | 464a mov r2, r9 8004766: | | f7fc fdc7 bl 80012f8 <printf_> 800476a: | | be00 bkpt 0x0000 if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) { 800476c: | \-> f8d5 30d8 ldr.w r3, [r5, #216] @ 0xd8 8004770: | 6a32 ldr r2, [r6, #32] 8004772: | 1a9b subs r3, r3, r2 8004774: | 2bf0 cmp r3, #240 @ 0xf0 8004776: | /----------- d918 bls.n 80047aa <tcp_tmr+0x6fe> tcp_pcb_purge(pcb); 8004778: | | 4630 mov r0, r6 800477a: | | f7fe f854 bl 8002826 <tcp_pcb_purge> if (prev != NULL) { 800477e: | | /-------- b9bc cbnz r4, 80047b0 <tcp_tmr+0x704> LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb); 8004780: | | | f8d5 30c0 ldr.w r3, [r5, #192] @ 0xc0 8004784: | | | 429e cmp r6, r3 8004786: | | | /-- d00c beq.n 80047a2 <tcp_tmr+0x6f6> 8004788: | | | | b672 cpsid i 800478a: | | | | 4b1b ldr r3, [pc, #108] @ (80047f8 ) 800478c: | | | | 4a1b ldr r2, [pc, #108] @ (80047fc ) 800478e: | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004792: | | | | 4b16 ldr r3, [pc, #88] @ (80047ec ) 8004794: | | | | 9300 str r3, [sp, #0] 8004796: | | | | 4817 ldr r0, [pc, #92] @ (80047f4 ) 8004798: | | | | f240 53b7 movw r3, #1463 @ 0x5b7 800479c: | | | | f7fc fdac bl 80012f8 <printf_> 80047a0: | | | | be00 bkpt 0x0000 tcp_tw_pcbs = pcb->next; 80047a2: | | | \-> 68f3 ldr r3, [r6, #12] 80047a4: | | | f8c5 30c0 str.w r3, [r5, #192] @ 0xc0 80047a8: | | | /----- e015 b.n 80047d6 <tcp_tmr+0x72a> prev = pcb; 80047aa: | \--|--|----> 4634 mov r4, r6 pcb = pcb->next; 80047ac: | | | 68f6 ldr r6, [r6, #12] 80047ae: +--------------------------------------------------------------|--|----- e4ad b.n 800410c <tcp_tmr+0x60> LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs); 80047b0: | \--|----> f8d5 30c0 ldr.w r3, [r5, #192] @ 0xc0 80047b4: | | 429e cmp r6, r3 80047b6: | | /-- d10c bne.n 80047d2 <tcp_tmr+0x726> 80047b8: | | | b672 cpsid i 80047ba: | | | 4b0f ldr r3, [pc, #60] @ (80047f8 ) 80047bc: | | | 4a10 ldr r2, [pc, #64] @ (8004800 ) 80047be: | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80047c2: | | | 4b0a ldr r3, [pc, #40] @ (80047ec ) 80047c4: | | | 9300 str r3, [sp, #0] 80047c6: | | | 480b ldr r0, [pc, #44] @ (80047f4 ) 80047c8: | | | f240 53b3 movw r3, #1459 @ 0x5b3 80047cc: | | | f7fc fd94 bl 80012f8 <printf_> 80047d0: | | | be00 bkpt 0x0000 prev->next = pcb->next; 80047d2: | | \-> 68f3 ldr r3, [r6, #12] 80047d4: | | 60e3 str r3, [r4, #12] pcb = pcb->next; 80047d6: | \----> f8d6 a00c ldr.w sl, [r6, #12] tcp_free(pcb2); 80047da: | 4630 mov r0, r6 80047dc: | f7fd fe4a bl 8002474 <tcp_free> pcb = pcb->next; 80047e0: | 4656 mov r6, sl 80047e2: \----------------------------------------------------------------------- e493 b.n 800410c <tcp_tmr+0x60> 80047e4: 0800d264 .word 0x0800d264 80047e8: 000124f8 .word 0x000124f8 80047ec: 0800b549 .word 0x0800b549 80047f0: 0800c00c .word 0x0800c00c 80047f4: 0800b232 .word 0x0800b232 80047f8: 20000060 .word 0x20000060 80047fc: 0800c08c .word 0x0800c08c 8004800: 0800c065 .word 0x0800c065 08004804 : { 8004804: b508 push {r3, lr} tcp_tmr(); 8004806: f7ff fc51 bl 80040ac <tcp_tmr> if (tcp_active_pcbs || tcp_tw_pcbs) { 800480a: 4b08 ldr r3, [pc, #32] @ (800482c ) 800480c: f8d3 20bc ldr.w r2, [r3, #188] @ 0xbc 8004810: /-- b912 cbnz r2, 8004818 <tcpip_tcp_timer+0x14> 8004812: | f8d3 20c0 ldr.w r2, [r3, #192] @ 0xc0 8004816: /--|-- b132 cbz r2, 8004826 <tcpip_tcp_timer+0x22> } 8004818: | \-> e8bd 4008 ldmia.w sp!, {r3, lr} sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL); 800481c: | 4904 ldr r1, [pc, #16] @ (8004830 ) 800481e: | 2200 movs r2, #0 8004820: | 20fa movs r0, #250 @ 0xfa 8004822: | f7fd bcc3 b.w 80021ac <sys_timeout> tcpip_tcp_timer_active = 0; 8004826: \----> f8c3 20b8 str.w r2, [r3, #184] @ 0xb8 } 800482a: bd08 pop {r3, pc} 800482c: 20001158 .word 0x20001158 8004830: 08004805 .word 0x08004805 08004834 : * * Must be called periodically from your main loop. */ void sys_check_timeouts(void) { 8004834: b5f8 push {r3, r4, r5, r6, r7, lr} 8004836: 4b0d ldr r3, [pc, #52] @ (800486c ) sys_timeout_handler handler; void *arg; PBUF_CHECK_FREE_OOSEQ(); tmptimeout = next_timeout; 8004838: 4c0d ldr r4, [pc, #52] @ (8004870 ) 800483a: f8d3 72fc ldr.w r7, [r3, #764] @ 0x2fc 800483e: /----> f854 1c5c ldr.w r1, [r4, #-92] if (tmptimeout == NULL) { 8004842: | /-- b191 cbz r1, 800486a <sys_check_timeouts+0x36> return; } if (TIME_LESS_THAN(now, tmptimeout->time)) { 8004844: | | 684b ldr r3, [r1, #4] 8004846: | | 1afa subs r2, r7, r3 8004848: | | 2a00 cmp r2, #0 800484a: | +-- db0e blt.n 800486a <sys_check_timeouts+0x36> } /* Timeout has expired */ next_timeout = tmptimeout->next; handler = tmptimeout->h; arg = tmptimeout->arg; 800484c: | | e9d1 5602 ldrd r5, r6, [r1, #8] next_timeout = tmptimeout->next; 8004850: | | 680a ldr r2, [r1, #0] 8004852: | | f844 2c5c str.w r2, [r4, #-92] if (handler != NULL) { LWIP_DEBUGF(TIMERS_DEBUG, ("sct calling h=%s t=%"U32_F" arg=%p\n", tmptimeout->handler_name, sys_now() - tmptimeout->time, arg)); } #endif /* LWIP_DEBUG_TIMERNAMES */ memp_free(MEMP_SYS_TIMEOUT, tmptimeout); 8004856: | | 2009 movs r0, #9 current_timeout_due_time = tmptimeout->time; 8004858: | | f844 3c58 str.w r3, [r4, #-88] memp_free(MEMP_SYS_TIMEOUT, tmptimeout); 800485c: | | f7fd fdf4 bl 8002448 <memp_free> if (handler != NULL) { 8004860: | | 2d00 cmp r5, #0 8004862: +--|-- d0ec beq.n 800483e <sys_check_timeouts+0xa> handler(arg); 8004864: | | 4630 mov r0, r6 8004866: | | 47a8 blx r5 8004868: \--|-- e7e9 b.n 800483e <sys_check_timeouts+0xa> } LWIP_TCPIP_THREAD_ALIVE(); /* Repeat until all expired timers have been called */ } while (1); } 800486a: \-> bdf8 pop {r3, r4, r5, r6, r7, pc} 800486c: 20000060 .word 0x20000060 8004870: 20001158 .word 0x20001158 08004874 : { 8004874: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} LWIP_ERROR("udp_bind: invalid pcb", pcb != NULL, return ERR_ARG); 8004878: /-- b948 cbnz r0, 800488e <udp_bind+0x1a> 800487a: | 4b2b ldr r3, [pc, #172] @ (8004928 ) 800487c: | 482b ldr r0, [pc, #172] @ (800492c ) 800487e: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004882: | f7fc fd39 bl 80012f8 <printf_> 8004886: | f06f 000f mvn.w r0, #15 } 800488a: /--------------------|-> e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { 800488e: | \-> 4f28 ldr r7, [pc, #160] @ (8004930 ) 8004890: | f8d7 5108 ldr.w r5, [r7, #264] @ 0x108 8004894: | 462c mov r4, r5 8004896: | /--/----X b96c cbnz r4, 80048b4 <udp_bind+0x40> if (port == 0) { 8004898: | /--/--|--|----X b192 cbz r2, 80048c0 <udp_bind+0x4c> ip_addr_set_ipaddr(&pcb->local_ip, ipaddr); 800489a: | | | | | 680e ldr r6, [r1, #0] for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { 800489c: | | | | | 462b mov r3, r5 800489e: /--|--------|--|--|--|----> 2b00 cmp r3, #0 80048a0: | | /-----|--|--|--|----- d131 bne.n 8004906 <udp_bind+0x92> ip_addr_set_ipaddr(&pcb->local_ip, ipaddr); 80048a2: | | | /--|--|--|--|----> 680b ldr r3, [r1, #0] 80048a4: | | | | | | | | 6003 str r3, [r0, #0] pcb->local_port = port; 80048a6: | | | | | | | | 8242 strh r2, [r0, #18] if (rebind == 0) { 80048a8: | | | | | | | | /-- b914 cbnz r4, 80048b0 <udp_bind+0x3c> pcb->next = udp_pcbs; 80048aa: | | | | | | | | | 60c5 str r5, [r0, #12] udp_pcbs = pcb; 80048ac: | | | | | | | | | f8c7 0108 str.w r0, [r7, #264] @ 0x108 return ERR_OK; 80048b0: | | | | | | | | \-> 2000 movs r0, #0 80048b2: | +--|--|--|--|--|--|----- e7ea b.n 800488a <udp_bind+0x16> if (pcb == ipcb) { 80048b4: | | | | | | | \----> 42a0 cmp r0, r4 80048b6: | | | | | | | /-- d001 beq.n 80048bc <udp_bind+0x48> for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { 80048b8: | | | | | | | | 68e4 ldr r4, [r4, #12] 80048ba: | | | | | | \-----|-- e7ec b.n 8004896 <udp_bind+0x22> rebind = 1; 80048bc: | | | | | | \-> 2401 movs r4, #1 80048be: | | | | | \----------- e7eb b.n 8004898 <udp_bind+0x24> 80048c0: | | | | \-------------> f8df c070 ldr.w ip, [pc, #112] @ 8004934 80048c4: | | | | f8bc 3044 ldrh.w r3, [ip, #68] @ 0x44 if (port == 0) { 80048c8: | | | | f44f 4280 mov.w r2, #16384 @ 0x4000 if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) { 80048cc: | | | | f64f 7eff movw lr, #65535 @ 0xffff 80048d0: | | | | /-------> 4573 cmp r3, lr 80048d2: | | | | | bf1a itte ne 80048d4: | | | | | 3301 addne r3, #1 80048d6: | | | | | b29b uxthne r3, r3 udp_port = UDP_LOCAL_PORT_RANGE_START; 80048d8: | | | | | f44f 4340 moveq.w r3, #49152 @ 0xc000 for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { 80048dc: | | | | | 462e mov r6, r5 80048de: | | | | /--|-----/-X b90e cbnz r6, 80048e4 <udp_bind+0x70> return udp_port; 80048e0: | | | | | | | 461a mov r2, r3 80048e2: | | | | | | /--|-- e007 b.n 80048f4 <udp_bind+0x80> if (pcb->local_port == udp_port) { 80048e4: | | | | | | | \-> f8b6 8012 ldrh.w r8, [r6, #18] 80048e8: | | | | | | | 4598 cmp r8, r3 80048ea: | | | | | | | /-- d10a bne.n 8004902 <udp_bind+0x8e> if (++n > (UDP_LOCAL_PORT_RANGE_END - UDP_LOCAL_PORT_RANGE_START)) { 80048ec: | | | | | | | | 3a01 subs r2, #1 80048ee: | | | | | | | | b292 uxth r2, r2 80048f0: | | | | | | | | 2a00 cmp r2, #0 80048f2: | | | | | \--|--|-- d1ed bne.n 80048d0 <udp_bind+0x5c> 80048f4: | | | | | \--|-> f8ac 3044 strh.w r3, [ip, #68] @ 0x44 if (port == 0) { 80048f8: | | | | | | 2a00 cmp r2, #0 80048fa: | | | \-----|--------|-- d1d2 bne.n 80048a2 <udp_bind+0x2e> return ERR_USE; 80048fc: | | | | /--|-> f06f 0007 mvn.w r0, #7 8004900: | \--|--------|-----|--|-- e7c3 b.n 800488a <udp_bind+0x16> for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { 8004902: | | | | \-> 68f6 ldr r6, [r6, #12] 8004904: | | \-----|----- e7eb b.n 80048de <udp_bind+0x6a> if (pcb != ipcb) { 8004906: | \--------------|----> 4283 cmp r3, r0 8004908: | | /-- d00c beq.n 8004924 <udp_bind+0xb0> if ((ipcb->local_port == port) && 800490a: | | | f8b3 c012 ldrh.w ip, [r3, #18] 800490e: | | | 4594 cmp ip, r2 8004910: | | +-- d108 bne.n 8004924 <udp_bind+0xb0> (ip_addr_eq(&ipcb->local_ip, ipaddr) || 8004912: | | | f8d3 c000 ldr.w ip, [r3] if ((ipcb->local_port == port) && 8004916: | | | 45b4 cmp ip, r6 8004918: | +--|-- d0f0 beq.n 80048fc <udp_bind+0x88> ip_addr_isany(ipaddr) || 800491a: | | | 2e00 cmp r6, #0 800491c: | +--|-- d0ee beq.n 80048fc <udp_bind+0x88> ip_addr_isany(&ipcb->local_ip))) || 800491e: | | | f1bc 0f00 cmp.w ip, #0 8004922: | \--|-- d0eb beq.n 80048fc <udp_bind+0x88> for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { 8004924: | \-> 68db ldr r3, [r3, #12] 8004926: \-------------------------- e7ba b.n 800489e <udp_bind+0x2a> 8004928: 20000060 .word 0x20000060 800492c: 0800c0b2 .word 0x0800c0b2 8004930: 20001158 .word 0x20001158 8004934: 20000000 .word 0x20000000 08004938 : { 8004938: b570 push {r4, r5, r6, lr} acd->num_conflicts++; 800493a: 7b4b ldrb r3, [r1, #13] { 800493c: 460c mov r4, r1 acd->num_conflicts++; 800493e: 3301 adds r3, #1 8004940: 734b strb r3, [r1, #13] acd->acd_conflict_callback(netif, ACD_DECLINE); 8004942: 690b ldr r3, [r1, #16] 8004944: 2102 movs r1, #2 { 8004946: 4605 mov r5, r0 acd->acd_conflict_callback(netif, ACD_DECLINE); 8004948: 4798 blx r3 if (acd->num_conflicts >= MAX_CONFLICTS) { 800494a: 7b63 ldrb r3, [r4, #13] 800494c: 2b09 cmp r3, #9 800494e: /-- d905 bls.n 800495c <acd_restart.lto_priv.0+0x24> acd->state = ACD_STATE_RATE_LIMIT; 8004950: | 2307 movs r3, #7 8004952: | 7223 strb r3, [r4, #8] acd->ttw = (u16_t)(RATE_LIMIT_INTERVAL * ACD_TICKS_PER_SECOND); 8004954: | f44f 7316 mov.w r3, #600 @ 0x258 8004958: | 8163 strh r3, [r4, #10] } 800495a: | bd70 pop {r4, r5, r6, pc} acd->state = ACD_STATE_OFF; 800495c: \-> 2300 movs r3, #0 800495e: 7223 strb r3, [r4, #8] acd->acd_conflict_callback(netif, ACD_RESTART_CLIENT); 8004960: 4628 mov r0, r5 8004962: 6923 ldr r3, [r4, #16] 8004964: 2101 movs r1, #1 } 8004966: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} acd->acd_conflict_callback(netif, ACD_RESTART_CLIENT); 800496a: 4718 bx r3 0800496c : } /** Free DHCP PCB if the last netif stops using it */ static void dhcp_dec_pcb_refcount(void) { 800496c: b513 push {r0, r1, r4, lr} LWIP_ASSERT("dhcp_pcb_refcount(): refcount error", (dhcp_pcb_refcount > 0)); 800496e: 4c1e ldr r4, [pc, #120] @ (80049e8 ) 8004970: f894 3112 ldrb.w r3, [r4, #274] @ 0x112 8004974: /-- b963 cbnz r3, 8004990 <dhcp_dec_pcb_refcount.lto_priv.0+0x24> 8004976: | b672 cpsid i 8004978: | 4b1c ldr r3, [pc, #112] @ (80049ec ) 800497a: | 4a1d ldr r2, [pc, #116] @ (80049f0 ) 800497c: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004980: | 4b1c ldr r3, [pc, #112] @ (80049f4 ) 8004982: | 9300 str r3, [sp, #0] 8004984: | 481c ldr r0, [pc, #112] @ (80049f8 ) 8004986: | f44f 7397 mov.w r3, #302 @ 0x12e 800498a: | f7fc fcb5 bl 80012f8 <printf_> 800498e: | be00 bkpt 0x0000 dhcp_pcb_refcount--; 8004990: \-> f894 3112 ldrb.w r3, [r4, #274] @ 0x112 8004994: 3b01 subs r3, #1 8004996: b2db uxtb r3, r3 8004998: f884 3112 strb.w r3, [r4, #274] @ 0x112 if (dhcp_pcb_refcount == 0) { 800499c: /----- b95b cbnz r3, 80049b6 <dhcp_dec_pcb_refcount.lto_priv.0+0x4a> udp_remove(dhcp_pcb); 800499e: | f8d4 1114 ldr.w r1, [r4, #276] @ 0x114 LWIP_ERROR("udp_remove: invalid pcb", pcb != NULL, return); 80049a2: | /-- b951 cbnz r1, 80049ba <dhcp_dec_pcb_refcount.lto_priv.0+0x4e> 80049a4: | | 4b11 ldr r3, [pc, #68] @ (80049ec ) 80049a6: | | 4815 ldr r0, [pc, #84] @ (80049fc ) 80049a8: | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80049ac: | | f7fc fca4 bl 80012f8 <printf_> dhcp_pcb = NULL; 80049b0: /--|--|-> 2300 movs r3, #0 80049b2: | | | f8c4 3114 str.w r3, [r4, #276] @ 0x114 } } 80049b6: | \--|-> b002 add sp, #8 80049b8: | | bd10 pop {r4, pc} if (udp_pcbs == pcb) { 80049ba: | \-> f8d4 3108 ldr.w r3, [r4, #264] @ 0x108 80049be: | 4299 cmp r1, r3 80049c0: | /-- d106 bne.n 80049d0 <dhcp_dec_pcb_refcount.lto_priv.0+0x64> udp_pcbs = udp_pcbs->next; 80049c2: | | 68cb ldr r3, [r1, #12] 80049c4: | | f8c4 3108 str.w r3, [r4, #264] @ 0x108 memp_free(MEMP_UDP_PCB, pcb); 80049c8: | /--|-> 2000 movs r0, #0 80049ca: | | | f7fd fd3d bl 8002448 <memp_free> 80049ce: \--|--|-- e7ef b.n 80049b0 <dhcp_dec_pcb_refcount.lto_priv.0+0x44> for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) { 80049d0: | \-> 2b00 cmp r3, #0 80049d2: +----- d0f9 beq.n 80049c8 <dhcp_dec_pcb_refcount.lto_priv.0+0x5c> if (pcb2->next != NULL && pcb2->next == pcb) { 80049d4: | /-> 461a mov r2, r3 80049d6: | | 68db ldr r3, [r3, #12] 80049d8: | | 2b00 cmp r3, #0 80049da: +--|-- d0f5 beq.n 80049c8 <dhcp_dec_pcb_refcount.lto_priv.0+0x5c> 80049dc: | | 4299 cmp r1, r3 80049de: | \-- d1f9 bne.n 80049d4 <dhcp_dec_pcb_refcount.lto_priv.0+0x68> pcb2->next = pcb->next; 80049e0: | 68cb ldr r3, [r1, #12] 80049e2: | 60d3 str r3, [r2, #12] break; 80049e4: \----- e7f0 b.n 80049c8 <dhcp_dec_pcb_refcount.lto_priv.0+0x5c> 80049e6: bf00 nop 80049e8: 20001158 .word 0x20001158 80049ec: 20000060 .word 0x20000060 80049f0: 0800c0d0 .word 0x0800c0d0 80049f4: 0800c0f4 .word 0x0800c0f4 80049f8: 0800b232 .word 0x0800b232 80049fc: 0800c10e .word 0x0800c10e 08004a00 : * If the state changed, reset the number of tries. */ static void dhcp_set_state(struct dhcp *dhcp, u8_t new_state) { if (new_state != dhcp->state) { 8004a00: 7943 ldrb r3, [r0, #5] 8004a02: 428b cmp r3, r1 dhcp->state = new_state; dhcp->tries = 0; 8004a04: bf1f itttt ne 8004a06: 2300 movne r3, #0 dhcp->state = new_state; 8004a08: 7141 strbne r1, [r0, #5] dhcp->tries = 0; 8004a0a: 7183 strbne r3, [r0, #6] dhcp->request_timeout = 0; 8004a0c: 8103 strhne r3, [r0, #8] } } 8004a0e: 4770 bx lr 08004a10 : { 8004a10: b513 push {r0, r1, r4, lr} LWIP_ERROR("dhcp_bind: netif != NULL", (netif != NULL), return;); 8004a12: 4604 mov r4, r0 8004a14: /-- b940 cbnz r0, 8004a28 <dhcp_bind+0x18> 8004a16: | 4b3a ldr r3, [pc, #232] @ (8004b00 ) 8004a18: | 483a ldr r0, [pc, #232] @ (8004b04 ) 8004a1a: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc } 8004a1e: /--|-> b002 add sp, #8 8004a20: | | e8bd 4010 ldmia.w sp!, {r4, lr} LWIP_ERROR("dhcp_bind: dhcp != NULL", (dhcp != NULL), return;); 8004a24: | | f7fc bc68 b.w 80012f8 <printf_> dhcp = netif_dhcp_data(netif); 8004a28: | \-> 6a40 ldr r0, [r0, #36] @ 0x24 LWIP_ERROR("dhcp_bind: dhcp != NULL", (dhcp != NULL), return;); 8004a2a: | /-- b920 cbnz r0, 8004a36 <dhcp_bind+0x26> 8004a2c: | | 4b34 ldr r3, [pc, #208] @ (8004b00 ) 8004a2e: | | 4836 ldr r0, [pc, #216] @ (8004b08 ) 8004a30: | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004a34: \--|-- e7f3 b.n 8004a1e <dhcp_bind+0xe> dhcp->lease_used = 0; 8004a36: \-> 2300 movs r3, #0 8004a38: 8243 strh r3, [r0, #18] if (dhcp->offered_t0_lease != 0xffffffffUL) { 8004a3a: 6a83 ldr r3, [r0, #40] @ 0x28 8004a3c: 1c5a adds r2, r3, #1 8004a3e: /-- d009 beq.n 8004a54 <dhcp_bind+0x44> DHCP_SET_TIMEOUT_FROM_OFFERED_T0_LEASE(dhcp->t0_timeout, dhcp); 8004a40: | 331e adds r3, #30 8004a42: | f5b3 1f70 cmp.w r3, #3932160 @ 0x3c0000 8004a46: /--------------------------|-- d23d bcs.n 8004ac4 <dhcp_bind+0xb4> 8004a48: | | 2b3b cmp r3, #59 @ 0x3b 8004a4a: /--|--------------------------|-- d93e bls.n 8004aca <dhcp_bind+0xba> 8004a4c: | | | 223c movs r2, #60 @ 0x3c 8004a4e: | | | fbb3 f3f2 udiv r3, r3, r2 8004a52: | | /-----------------------|-> 8283 strh r3, [r0, #20] if (dhcp->offered_t1_renew != 0xffffffffUL) { 8004a54: | | | \-> 6ac3 ldr r3, [r0, #44] @ 0x2c 8004a56: | | | 1c59 adds r1, r3, #1 8004a58: | | | /-- d00b beq.n 8004a72 <dhcp_bind+0x62> DHCP_SET_TIMEOUT_FROM_OFFERED_T1_RENEW(dhcp->t1_timeout, dhcp); 8004a5a: | | | | 331e adds r3, #30 8004a5c: | | | | f5b3 1f70 cmp.w r3, #3932160 @ 0x3c0000 8004a60: | | | /-----------------|-- d235 bcs.n 8004ace <dhcp_bind+0xbe> 8004a62: | | | | | 2b3b cmp r3, #59 @ 0x3b 8004a64: | | | /--|-----------------|-- d936 bls.n 8004ad4 <dhcp_bind+0xc4> 8004a66: | | | | | | 223c movs r2, #60 @ 0x3c 8004a68: | | | | | | fbb3 f3f2 udiv r3, r3, r2 8004a6c: | | | | | /--------------|-> b29b uxth r3, r3 8004a6e: | | | | | | | 8143 strh r3, [r0, #10] dhcp->t1_renew_time = dhcp->t1_timeout; 8004a70: | | | | | | | 81c3 strh r3, [r0, #14] if (dhcp->offered_t2_rebind != 0xffffffffUL) { 8004a72: | | | | | | \-> 6b03 ldr r3, [r0, #48] @ 0x30 8004a74: | | | | | | 1c5a adds r2, r3, #1 8004a76: | | | | | | /-- d00b beq.n 8004a90 <dhcp_bind+0x80> DHCP_SET_TIMEOUT_FROM_OFFERED_T2_REBIND(dhcp->t2_timeout, dhcp); 8004a78: | | | | | | | 331e adds r3, #30 8004a7a: | | | | | | | f5b3 1f70 cmp.w r3, #3932160 @ 0x3c0000 8004a7e: | | | | | | /--------|-- d22b bcs.n 8004ad8 <dhcp_bind+0xc8> 8004a80: | | | | | | | | 2b3b cmp r3, #59 @ 0x3b 8004a82: | | | | | | /--|--------|-- d92c bls.n 8004ade <dhcp_bind+0xce> 8004a84: | | | | | | | | | 223c movs r2, #60 @ 0x3c 8004a86: | | | | | | | | | fbb3 f3f2 udiv r3, r3, r2 8004a8a: | | | | | | | | /--|-> b29b uxth r3, r3 8004a8c: | | | | | | | | | | 8183 strh r3, [r0, #12] dhcp->t2_rebind_time = dhcp->t2_timeout; 8004a8e: | | | | | | | | | | 8203 strh r3, [r0, #16] if ((dhcp->t1_timeout >= dhcp->t2_timeout) && (dhcp->t2_timeout > 0)) { 8004a90: | | | | | | | | | \-> 8983 ldrh r3, [r0, #12] 8004a92: | | | | | | | | | 8942 ldrh r2, [r0, #10] 8004a94: | | | | | | | | | 429a cmp r2, r3 8004a96: | | | | | | | | | /-- d302 bcc.n 8004a9e <dhcp_bind+0x8e> 8004a98: | | | | | | | | | +-- b10b cbz r3, 8004a9e <dhcp_bind+0x8e> dhcp->t1_timeout = 0; 8004a9a: | | | | | | | | | | 2300 movs r3, #0 8004a9c: | | | | | | | | | | 8143 strh r3, [r0, #10] if (dhcp->flags & DHCP_FLAG_SUBNET_MASK_GIVEN) { 8004a9e: | | | | | | | | | \-> 79c3 ldrb r3, [r0, #7] 8004aa0: | | | | | | | | | 07db lsls r3, r3, #31 8004aa2: | | | | | | | | | /-- d51e bpl.n 8004ae2 <dhcp_bind+0xd2> ip4_addr_copy(sn_mask, dhcp->offered_sn_mask); 8004aa4: | | | | | | | | | | 6a03 ldr r3, [r0, #32] 8004aa6: | | | | | | | | /--|--|-> 9301 str r3, [sp, #4] dhcp_set_state(dhcp, DHCP_STATE_BOUND); 8004aa8: | | | | | | | | | | | 210a movs r1, #10 ip4_addr_copy(gw_addr, dhcp->offered_gw_addr); 8004aaa: | | | | | | | | | | | 6a43 ldr r3, [r0, #36] @ 0x24 8004aac: | | | | | | | | | | | 9300 str r3, [sp, #0] netif_set_addr(netif, &dhcp->offered_ip_addr, &sn_mask, &gw_addr); 8004aae: | | | | | | | | | | | aa01 add r2, sp, #4 dhcp_set_state(dhcp, DHCP_STATE_BOUND); 8004ab0: | | | | | | | | | | | f7ff ffa6 bl 8004a00 <dhcp_set_state.lto_priv.0> netif_set_addr(netif, &dhcp->offered_ip_addr, &sn_mask, &gw_addr); 8004ab4: | | | | | | | | | | | f100 011c add.w r1, r0, #28 8004ab8: | | | | | | | | | | | 466b mov r3, sp 8004aba: | | | | | | | | | | | 4620 mov r0, r4 8004abc: | | | | | | | | | | | f7ff f8e4 bl 8003c88 <netif_set_addr> } 8004ac0: | | | | | | | | | | | b002 add sp, #8 8004ac2: | | | | | | | | | | | bd10 pop {r4, pc} DHCP_SET_TIMEOUT_FROM_OFFERED_T0_LEASE(dhcp->t0_timeout, dhcp); 8004ac4: | \--|--|--|--|--|--|--|--|--|-> f64f 73ff movw r3, #65535 @ 0xffff 8004ac8: | +--|--|--|--|--|--|--|--|-- e7c3 b.n 8004a52 <dhcp_bind+0x42> 8004aca: \-----|--|--|--|--|--|--|--|--|-> 2301 movs r3, #1 8004acc: \--|--|--|--|--|--|--|--|-- e7c1 b.n 8004a52 <dhcp_bind+0x42> DHCP_SET_TIMEOUT_FROM_OFFERED_T1_RENEW(dhcp->t1_timeout, dhcp); 8004ace: | \--|--|--|--|--|--|-> f64f 73ff movw r3, #65535 @ 0xffff 8004ad2: | +--|--|--|--|--|-- e7cb b.n 8004a6c <dhcp_bind+0x5c> 8004ad4: \-----|--|--|--|--|--|-> 2301 movs r3, #1 8004ad6: \--|--|--|--|--|-- e7c9 b.n 8004a6c <dhcp_bind+0x5c> DHCP_SET_TIMEOUT_FROM_OFFERED_T2_REBIND(dhcp->t2_timeout, dhcp); 8004ad8: | \--|--|--|-> f64f 73ff movw r3, #65535 @ 0xffff 8004adc: | | +--|-- e7d5 b.n 8004a8a <dhcp_bind+0x7a> 8004ade: \-----|--|--|-> 2301 movs r3, #1 8004ae0: | \--|-- e7d3 b.n 8004a8a <dhcp_bind+0x7a> if (first_octet <= 127) { 8004ae2: | \-> f990 201c ldrsb.w r2, [r0, #28] u8_t first_octet = ip4_addr1(&dhcp->offered_ip_addr); 8004ae6: | 7f03 ldrb r3, [r0, #28] if (first_octet <= 127) { 8004ae8: | 2a00 cmp r2, #0 8004aea: | /-- da06 bge.n 8004afa <dhcp_bind+0xea> } else if (first_octet >= 192) { 8004aec: | | 2bbf cmp r3, #191 @ 0xbf 8004aee: | | f64f 73ff movw r3, #65535 @ 0xffff 8004af2: | | bf88 it hi 8004af4: | | f06f 437f mvnhi.w r3, #4278190080 @ 0xff000000 8004af8: +-----|-- e7d5 b.n 8004aa6 <dhcp_bind+0x96> 8004afa: | \-> 23ff movs r3, #255 @ 0xff 8004afc: \-------- e7d3 b.n 8004aa6 <dhcp_bind+0x96> 8004afe: bf00 nop 8004b00: 20000060 .word 0x20000060 8004b04: 0800c12e .word 0x0800c12e 8004b08: 0800c14f .word 0x0800c14f 08004b0c : * DHCP message. * */ static u16_t dhcp_option(u16_t options_out_len, u8_t *options, u8_t option_type, u8_t option_len) { 8004b0c: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} 8004b0e: 461e mov r6, r3 LWIP_ASSERT("dhcp_option: options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN); 8004b10: 3302 adds r3, #2 8004b12: fa50 f383 uxtab r3, r0, r3 8004b16: 2b44 cmp r3, #68 @ 0x44 { 8004b18: 4604 mov r4, r0 8004b1a: 460d mov r5, r1 8004b1c: 4617 mov r7, r2 LWIP_ASSERT("dhcp_option: options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN); 8004b1e: /-- d90c bls.n 8004b3a <dhcp_option.lto_priv.0+0x2e> 8004b20: | b672 cpsid i 8004b22: | 4b0a ldr r3, [pc, #40] @ (8004b4c ) 8004b24: | 4a0a ldr r2, [pc, #40] @ (8004b50 ) 8004b26: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004b2a: | 4b0a ldr r3, [pc, #40] @ (8004b54 ) 8004b2c: | 9300 str r3, [sp, #0] 8004b2e: | 480a ldr r0, [pc, #40] @ (8004b58 ) 8004b30: | f44f 63b4 mov.w r3, #1440 @ 0x5a0 8004b34: | f7fc fbe0 bl 80012f8 <printf_> 8004b38: | be00 bkpt 0x0000 options[options_out_len++] = option_type; 8004b3a: \-> 1c63 adds r3, r4, #1 options[options_out_len++] = option_len; 8004b3c: b29b uxth r3, r3 8004b3e: 1ca0 adds r0, r4, #2 return options_out_len; } 8004b40: b280 uxth r0, r0 options[options_out_len++] = option_type; 8004b42: 552f strb r7, [r5, r4] options[options_out_len++] = option_len; 8004b44: 54ee strb r6, [r5, r3] } 8004b46: b003 add sp, #12 8004b48: bdf0 pop {r4, r5, r6, r7, pc} 8004b4a: bf00 nop 8004b4c: 20000060 .word 0x20000060 8004b50: 0800c16f .word 0x0800c16f 8004b54: 0800c0f4 .word 0x0800c0f4 8004b58: 0800b232 .word 0x0800b232 08004b5c : * */ static u16_t dhcp_option_byte(u16_t options_out_len, u8_t *options, u8_t value) { LWIP_ASSERT("dhcp_option_byte: options_out_len < DHCP_OPTIONS_LEN", options_out_len < DHCP_OPTIONS_LEN); 8004b5c: 2843 cmp r0, #67 @ 0x43 { 8004b5e: b573 push {r0, r1, r4, r5, r6, lr} 8004b60: 4604 mov r4, r0 8004b62: 460d mov r5, r1 8004b64: 4616 mov r6, r2 LWIP_ASSERT("dhcp_option_byte: options_out_len < DHCP_OPTIONS_LEN", options_out_len < DHCP_OPTIONS_LEN); 8004b66: /-- d90c bls.n 8004b82 <dhcp_option_byte.lto_priv.0+0x26> 8004b68: | b672 cpsid i 8004b6a: | 4b08 ldr r3, [pc, #32] @ (8004b8c ) 8004b6c: | 4a08 ldr r2, [pc, #32] @ (8004b90 ) 8004b6e: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004b72: | 4b08 ldr r3, [pc, #32] @ (8004b94 ) 8004b74: | 9300 str r3, [sp, #0] 8004b76: | 4808 ldr r0, [pc, #32] @ (8004b98 ) 8004b78: | f240 53ac movw r3, #1452 @ 0x5ac 8004b7c: | f7fc fbbc bl 80012f8 <printf_> 8004b80: | be00 bkpt 0x0000 options[options_out_len++] = value; 8004b82: \-> 1c60 adds r0, r4, #1 return options_out_len; } 8004b84: b280 uxth r0, r0 options[options_out_len++] = value; 8004b86: 552e strb r6, [r5, r4] } 8004b88: b002 add sp, #8 8004b8a: bd70 pop {r4, r5, r6, pc} 8004b8c: 20000060 .word 0x20000060 8004b90: 0800c1b1 .word 0x0800c1b1 8004b94: 0800c0f4 .word 0x0800c0f4 8004b98: 0800b232 .word 0x0800b232 08004b9c : static u16_t dhcp_option_short(u16_t options_out_len, u8_t *options, u16_t value) { 8004b9c: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} LWIP_ASSERT("dhcp_option_short: options_out_len + 2 <= DHCP_OPTIONS_LEN", options_out_len + 2U <= DHCP_OPTIONS_LEN); 8004b9e: 1c87 adds r7, r0, #2 8004ba0: 2f44 cmp r7, #68 @ 0x44 { 8004ba2: 4604 mov r4, r0 8004ba4: 460d mov r5, r1 8004ba6: 4616 mov r6, r2 LWIP_ASSERT("dhcp_option_short: options_out_len + 2 <= DHCP_OPTIONS_LEN", options_out_len + 2U <= DHCP_OPTIONS_LEN); 8004ba8: /-- d90c bls.n 8004bc4 <dhcp_option_short.lto_priv.0+0x28> 8004baa: | b672 cpsid i 8004bac: | 4b09 ldr r3, [pc, #36] @ (8004bd4 ) 8004bae: | 4a0a ldr r2, [pc, #40] @ (8004bd8 ) 8004bb0: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004bb4: | 4b09 ldr r3, [pc, #36] @ (8004bdc ) 8004bb6: | 9300 str r3, [sp, #0] 8004bb8: | 4809 ldr r0, [pc, #36] @ (8004be0 ) 8004bba: | f240 53b4 movw r3, #1460 @ 0x5b4 8004bbe: | f7fc fb9b bl 80012f8 <printf_> 8004bc2: | be00 bkpt 0x0000 options[options_out_len++] = (u8_t)((value & 0xff00U) >> 8); 8004bc4: \-> 0a33 lsrs r3, r6, #8 8004bc6: 552b strb r3, [r5, r4] 8004bc8: 3401 adds r4, #1 options[options_out_len++] = (u8_t) (value & 0x00ffU); 8004bca: b2a4 uxth r4, r4 return options_out_len; } 8004bcc: b2b8 uxth r0, r7 options[options_out_len++] = (u8_t) (value & 0x00ffU); 8004bce: 552e strb r6, [r5, r4] } 8004bd0: b003 add sp, #12 8004bd2: bdf0 pop {r4, r5, r6, r7, pc} 8004bd4: 20000060 .word 0x20000060 8004bd8: 0800c1e6 .word 0x0800c1e6 8004bdc: 0800c0f4 .word 0x0800c0f4 8004be0: 0800b232 .word 0x0800b232 08004be4 : static u16_t dhcp_option_long(u16_t options_out_len, u8_t *options, u32_t value) { 8004be4: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} LWIP_ASSERT("dhcp_option_long: options_out_len + 4 <= DHCP_OPTIONS_LEN", options_out_len + 4U <= DHCP_OPTIONS_LEN); 8004be6: 1d07 adds r7, r0, #4 8004be8: 2f44 cmp r7, #68 @ 0x44 { 8004bea: 4604 mov r4, r0 8004bec: 460d mov r5, r1 8004bee: 4616 mov r6, r2 LWIP_ASSERT("dhcp_option_long: options_out_len + 4 <= DHCP_OPTIONS_LEN", options_out_len + 4U <= DHCP_OPTIONS_LEN); 8004bf0: /-- d90c bls.n 8004c0c <dhcp_option_long.lto_priv.0+0x28> 8004bf2: | b672 cpsid i 8004bf4: | 4b0d ldr r3, [pc, #52] @ (8004c2c ) 8004bf6: | 4a0e ldr r2, [pc, #56] @ (8004c30 ) 8004bf8: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004bfc: | 4b0d ldr r3, [pc, #52] @ (8004c34 ) 8004bfe: | 9300 str r3, [sp, #0] 8004c00: | 480d ldr r0, [pc, #52] @ (8004c38 ) 8004c02: | f240 53bd movw r3, #1469 @ 0x5bd 8004c06: | f7fc fb77 bl 80012f8 <printf_> 8004c0a: | be00 bkpt 0x0000 options[options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24); 8004c0c: \-> 0e33 lsrs r3, r6, #24 8004c0e: 552b strb r3, [r5, r4] 8004c10: 1c63 adds r3, r4, #1 options[options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16); 8004c12: b29b uxth r3, r3 8004c14: 0c32 lsrs r2, r6, #16 8004c16: 54ea strb r2, [r5, r3] 8004c18: 1ca3 adds r3, r4, #2 options[options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8); 8004c1a: 3403 adds r4, #3 8004c1c: b29b uxth r3, r3 options[options_out_len++] = (u8_t)((value & 0x000000ffUL)); 8004c1e: b2a4 uxth r4, r4 options[options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8); 8004c20: 0a32 lsrs r2, r6, #8 return options_out_len; } 8004c22: b2b8 uxth r0, r7 options[options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8); 8004c24: 54ea strb r2, [r5, r3] options[options_out_len++] = (u8_t)((value & 0x000000ffUL)); 8004c26: 552e strb r6, [r5, r4] } 8004c28: b003 add sp, #12 8004c2a: bdf0 pop {r4, r5, r6, r7, pc} 8004c2c: 20000060 .word 0x20000060 8004c30: 0800c221 .word 0x0800c221 8004c34: 0800c0f4 .word 0x0800c0f4 8004c38: 0800b232 .word 0x0800b232 08004c3c : * @param dhcp dhcp control struct * @param message_type message type of the request */ static struct pbuf * dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type, u16_t *options_out_len) { 8004c3c: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr} 8004c40: 460e mov r6, r1 8004c42: 4690 mov r8, r2 8004c44: 4699 mov r9, r3 if (!xid_initialised) { xid = DHCP_GLOBAL_XID; xid_initialised = !xid_initialised; } #endif LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return NULL;); 8004c46: 4605 mov r5, r0 8004c48: /----- b950 cbnz r0, 8004c60 <dhcp_create_msg.lto_priv.0+0x24> 8004c4a: | 4b3e ldr r3, [pc, #248] @ (8004d44 ) 8004c4c: | 483e ldr r0, [pc, #248] @ (8004d48 ) 8004c4e: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return NULL;); 8004c52: /--|----> f7fc fb51 bl 80012f8 <printf_> LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return NULL;); 8004c56: /--|--|----> 2700 movs r7, #0 options_out_len_loc = dhcp_option_byte(options_out_len_loc, msg_out->options, message_type); if (options_out_len) { *options_out_len = options_out_len_loc; } return p_out; } 8004c58: /--|--|--|----> 4638 mov r0, r7 8004c5a: | | | | b003 add sp, #12 8004c5c: | | | | e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return NULL;); 8004c60: | | | \--/-X b921 cbnz r1, 8004c6c <dhcp_create_msg.lto_priv.0+0x30> 8004c62: | | | | 4b38 ldr r3, [pc, #224] @ (8004d44 ) 8004c64: | | | | 4839 ldr r0, [pc, #228] @ (8004d4c ) 8004c66: | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004c6a: | | \-----|-- e7f2 b.n 8004c52 <dhcp_create_msg.lto_priv.0+0x16> p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM); 8004c6c: | | \-> f44f 719a mov.w r1, #308 @ 0x134 8004c70: | | 2036 movs r0, #54 @ 0x36 8004c72: | | f004 fb01 bl 8009278 <pbuf_alloc.constprop.0> if (p_out == NULL) { 8004c76: | | 4607 mov r7, r0 8004c78: | | 2800 cmp r0, #0 8004c7a: | \----------- d0ec beq.n 8004c56 <dhcp_create_msg.lto_priv.0+0x1a> LWIP_ASSERT("dhcp_create_msg: check that first pbuf can hold struct dhcp_msg", 8004c7c: | 8943 ldrh r3, [r0, #10] 8004c7e: | f5b3 7f9a cmp.w r3, #308 @ 0x134 8004c82: | /-- d20c bcs.n 8004c9e <dhcp_create_msg.lto_priv.0+0x62> 8004c84: | | b672 cpsid i 8004c86: | | 4b2f ldr r3, [pc, #188] @ (8004d44 ) 8004c88: | | 4a31 ldr r2, [pc, #196] @ (8004d50 ) 8004c8a: | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004c8e: | | 4b31 ldr r3, [pc, #196] @ (8004d54 ) 8004c90: | | 9300 str r3, [sp, #0] 8004c92: | | 4831 ldr r0, [pc, #196] @ (8004d58 ) 8004c94: | | f240 737a movw r3, #1914 @ 0x77a 8004c98: | | f7fc fb2e bl 80012f8 <printf_> 8004c9c: | | be00 bkpt 0x0000 if ((message_type != DHCP_REQUEST) || (dhcp->state == DHCP_STATE_REBOOTING)) { 8004c9e: | \-> f1b8 0f03 cmp.w r8, #3 8004ca2: | /-- d102 bne.n 8004caa <dhcp_create_msg.lto_priv.0+0x6e> 8004ca4: | | 7973 ldrb r3, [r6, #5] 8004ca6: | | 2b03 cmp r3, #3 8004ca8: | /--|-- d107 bne.n 8004cba <dhcp_create_msg.lto_priv.0+0x7e> if (dhcp->tries == 0) { 8004caa: | | \-> 79b2 ldrb r2, [r6, #6] 8004cac: | | 4b2b ldr r3, [pc, #172] @ (8004d5c ) 8004cae: | | /-- b912 cbnz r2, 8004cb6 <dhcp_create_msg.lto_priv.0+0x7a> xid++; 8004cb0: | | | 6c9a ldr r2, [r3, #72] @ 0x48 8004cb2: | | | 3201 adds r2, #1 8004cb4: | | | 649a str r2, [r3, #72] @ 0x48 dhcp->xid = xid; 8004cb6: | | \-> 6c9b ldr r3, [r3, #72] @ 0x48 8004cb8: | | 6033 str r3, [r6, #0] msg_out = (struct dhcp_msg *)p_out->payload; 8004cba: | \----> 687c ldr r4, [r7, #4] memset(msg_out, 0, sizeof(struct dhcp_msg)); 8004cbc: | f44f 729a mov.w r2, #308 @ 0x134 8004cc0: | 2100 movs r1, #0 8004cc2: | 4620 mov r0, r4 8004cc4: | f006 f906 bl 800aed4 <memset> msg_out->op = DHCP_BOOTREQUEST; 8004cc8: | 2301 movs r3, #1 8004cca: | 7023 strb r3, [r4, #0] msg_out->htype = LWIP_IANA_HWTYPE_ETHERNET; 8004ccc: | 7063 strb r3, [r4, #1] msg_out->hlen = netif->hwaddr_len; 8004cce: | f895 3034 ldrb.w r3, [r5, #52] @ 0x34 8004cd2: | 70a3 strb r3, [r4, #2] msg_out->xid = lwip_htonl(dhcp->xid); 8004cd4: | 6830 ldr r0, [r6, #0] 8004cd6: | f003 fa2d bl 8008134 <lwip_htonl> if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) || (message_type == DHCP_RELEASE) || 8004cda: | 2390 movs r3, #144 @ 0x90 8004cdc: | fa23 f308 lsr.w r3, r3, r8 8004ce0: | 07db lsls r3, r3, #31 msg_out->xid = lwip_htonl(dhcp->xid); 8004ce2: | 6060 str r0, [r4, #4] if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) || (message_type == DHCP_RELEASE) || 8004ce4: | /----- d406 bmi.n 8004cf4 <dhcp_create_msg.lto_priv.0+0xb8> 8004ce6: | | f1b8 0f03 cmp.w r8, #3 8004cea: | | /-- d105 bne.n 8004cf8 <dhcp_create_msg.lto_priv.0+0xbc> ((dhcp->state == DHCP_STATE_RENEWING) || dhcp->state == DHCP_STATE_REBINDING))) { 8004cec: | | | 7973 ldrb r3, [r6, #5] ((message_type == DHCP_REQUEST) && /* DHCP_STATE_BOUND not used for sending! */ 8004cee: | | | 3b04 subs r3, #4 8004cf0: | | | 2b01 cmp r3, #1 8004cf2: | | +-- d801 bhi.n 8004cf8 <dhcp_create_msg.lto_priv.0+0xbc> ip4_addr_copy(msg_out->ciaddr, *netif_ip4_addr(netif)); 8004cf4: | \--|-> 682b ldr r3, [r5, #0] 8004cf6: | | 60e3 str r3, [r4, #12] for (i = 0; i < LWIP_MIN(DHCP_CHADDR_LEN, NETIF_MAX_HWADDR_LEN); i++) { 8004cf8: | \-> f105 032d add.w r3, r5, #45 @ 0x2d 8004cfc: | f104 021b add.w r2, r4, #27 8004d00: | 3533 adds r5, #51 @ 0x33 msg_out->chaddr[i] = netif->hwaddr[i]; 8004d02: | /-> f813 1f01 ldrb.w r1, [r3, #1]! 8004d06: | | f802 1f01 strb.w r1, [r2, #1]! for (i = 0; i < LWIP_MIN(DHCP_CHADDR_LEN, NETIF_MAX_HWADDR_LEN); i++) { 8004d0a: | | 42ab cmp r3, r5 8004d0c: | \-- d1f9 bne.n 8004d02 <dhcp_create_msg.lto_priv.0+0xc6> msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE); 8004d0e: | f06f 027d mvn.w r2, #125 @ 0x7d 8004d12: | f884 20ed strb.w r2, [r4, #237] @ 0xed 8004d16: | 2363 movs r3, #99 @ 0x63 8004d18: | 2253 movs r2, #83 @ 0x53 8004d1a: | f884 30ec strb.w r3, [r4, #236] @ 0xec 8004d1e: | f884 20ee strb.w r2, [r4, #238] @ 0xee 8004d22: | f884 30ef strb.w r3, [r4, #239] @ 0xef options_out_len_loc = dhcp_option(0, msg_out->options, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); 8004d26: | 34f0 adds r4, #240 @ 0xf0 8004d28: | 2301 movs r3, #1 8004d2a: | 2235 movs r2, #53 @ 0x35 8004d2c: | 4621 mov r1, r4 8004d2e: | 2000 movs r0, #0 8004d30: | f7ff feec bl 8004b0c <dhcp_option.lto_priv.0> options_out_len_loc = dhcp_option_byte(options_out_len_loc, msg_out->options, message_type); 8004d34: | 4642 mov r2, r8 8004d36: | 4621 mov r1, r4 8004d38: | f7ff ff10 bl 8004b5c <dhcp_option_byte.lto_priv.0> *options_out_len = options_out_len_loc; 8004d3c: | f8a9 0000 strh.w r0, [r9] 8004d40: \-------------- e78a b.n 8004c58 <dhcp_create_msg.lto_priv.0+0x1c> 8004d42: bf00 nop 8004d44: 20000060 .word 0x20000060 8004d48: 0800c25b .word 0x0800c25b 8004d4c: 0800c282 .word 0x0800c282 8004d50: 0800c2a8 .word 0x0800c2a8 8004d54: 0800c0f4 .word 0x0800c0f4 8004d58: 0800b232 .word 0x0800b232 8004d5c: 20000000 .word 0x20000000 08004d60 : * Adds the END option to the DHCP message, and if * necessary, up to three padding bytes. */ static void dhcp_option_trailer(u16_t options_out_len, u8_t *options, struct pbuf *p_out) { 8004d60: b5f8 push {r3, r4, r5, r6, r7, lr} 8004d62: 4604 mov r4, r0 options[options_out_len++] = DHCP_OPTION_END; 8004d64: 1c63 adds r3, r4, #1 8004d66: b29b uxth r3, r3 /* packet is too small, or not 4 byte aligned? */ while (((options_out_len < DHCP_MIN_OPTIONS_LEN) || (options_out_len & 3)) && (options_out_len < DHCP_OPTIONS_LEN)) { /* add a fill/padding byte */ options[options_out_len++] = 0; 8004d68: 2b44 cmp r3, #68 @ 0x44 8004d6a: bf8c ite hi 8004d6c: 2700 movhi r7, #0 8004d6e: 2701 movls r7, #1 8004d70: f1c4 0543 rsb r5, r4, #67 @ 0x43 8004d74: 2f00 cmp r7, #0 8004d76: b2ad uxth r5, r5 { 8004d78: 4616 mov r6, r2 8004d7a: 4608 mov r0, r1 options[options_out_len++] = DHCP_OPTION_END; 8004d7c: f04f 02ff mov.w r2, #255 @ 0xff 8004d80: 550a strb r2, [r1, r4] options[options_out_len++] = 0; 8004d82: 4418 add r0, r3 8004d84: bf14 ite ne 8004d86: 462a movne r2, r5 8004d88: 2200 moveq r2, #0 8004d8a: 2100 movs r1, #0 8004d8c: f006 f8a2 bl 800aed4 <memset> } /* shrink the pbuf to the actual content length */ pbuf_realloc(p_out, (u16_t)(sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + options_out_len)); 8004d90: 2f00 cmp r7, #0 8004d92: f104 01f1 add.w r1, r4, #241 @ 0xf1 8004d96: bf08 it eq 8004d98: 2500 moveq r5, #0 8004d9a: 4429 add r1, r5 8004d9c: 4630 mov r0, r6 8004d9e: b289 uxth r1, r1 } 8004da0: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr} pbuf_realloc(p_out, (u16_t)(sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + options_out_len)); 8004da4: f7fc bdde b.w 8001964 <pbuf_realloc> 08004da8 : { 8004da8: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} struct dhcp *dhcp = netif_dhcp_data(netif); 8004dac: 6a46 ldr r6, [r0, #36] @ 0x24 { 8004dae: b085 sub sp, #20 8004db0: 4604 mov r4, r0 8004db2: 460d mov r5, r1 LWIP_ASSERT("DHCP should be enabled at this point, but it is not!", 8004db4: /-- b10e cbz r6, 8004dba <dhcp_conflict_callback.lto_priv.0+0x12> 8004db6: | 7973 ldrb r3, [r6, #5] 8004db8: /--|-- b963 cbnz r3, 8004dd4 <dhcp_conflict_callback.lto_priv.0+0x2c> 8004dba: | \-> b672 cpsid i 8004dbc: | 4b2e ldr r3, [pc, #184] @ (8004e78 ) 8004dbe: | 4a2f ldr r2, [pc, #188] @ (8004e7c ) 8004dc0: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004dc4: | 4b2e ldr r3, [pc, #184] @ (8004e80 ) 8004dc6: | 9300 str r3, [sp, #0] 8004dc8: | 482e ldr r0, [pc, #184] @ (8004e84 ) 8004dca: | f44f 73b0 mov.w r3, #352 @ 0x160 8004dce: | f7fc fa93 bl 80012f8 <printf_> 8004dd2: | be00 bkpt 0x0000 switch (state) { 8004dd4: \----> 2d01 cmp r5, #1 8004dd6: /-- d007 beq.n 8004de8 <dhcp_conflict_callback.lto_priv.0+0x40> 8004dd8: | 2d02 cmp r5, #2 8004dda: /--|-- d00e beq.n 8004dfa <dhcp_conflict_callback.lto_priv.0+0x52> 8004ddc: /--|--|-- b955 cbnz r5, 8004df4 <dhcp_conflict_callback.lto_priv.0+0x4c> dhcp_bind(netif); 8004dde: | | | 4620 mov r0, r4 } 8004de0: | | | b005 add sp, #20 8004de2: | | | e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr} dhcp_bind(netif); 8004de6: | | | e613 b.n 8004a10 <dhcp_bind> dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF); 8004de8: | | \-> 210c movs r1, #12 8004dea: | | 4630 mov r0, r6 8004dec: | | f7ff fe08 bl 8004a00 <dhcp_set_state.lto_priv.0> dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); 8004df0: | | 2314 movs r3, #20 8004df2: | | 8133 strh r3, [r6, #8] } 8004df4: >--|----> b005 add sp, #20 8004df6: | | e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4); 8004dfa: | \----> 4e23 ldr r6, [pc, #140] @ (8004e88 ) 8004dfc: | 4620 mov r0, r4 8004dfe: | 4633 mov r3, r6 8004e00: | 4632 mov r2, r6 8004e02: | 4631 mov r1, r6 8004e04: | f7fe ff40 bl 8003c88 <netif_set_addr> struct dhcp *dhcp = netif_dhcp_data(netif); 8004e08: | f8d4 9024 ldr.w r9, [r4, #36] @ 0x24 dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF); 8004e0c: | 210c movs r1, #12 8004e0e: | 4648 mov r0, r9 8004e10: | f7ff fdf6 bl 8004a00 <dhcp_set_state.lto_priv.0> p_out = dhcp_create_msg(netif, dhcp, DHCP_DECLINE, &options_out_len); 8004e14: | 2204 movs r2, #4 8004e16: | f10d 030e add.w r3, sp, #14 8004e1a: | 4649 mov r1, r9 8004e1c: | 4620 mov r0, r4 8004e1e: | f7ff ff0d bl 8004c3c <dhcp_create_msg.lto_priv.0> if (p_out != NULL) { 8004e22: | 4605 mov r5, r0 8004e24: | 2800 cmp r0, #0 8004e26: \-------- d0e5 beq.n 8004df4 <dhcp_conflict_callback.lto_priv.0+0x4c> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4); 8004e28: 6847 ldr r7, [r0, #4] 8004e2a: f8bd 000e ldrh.w r0, [sp, #14] 8004e2e: 37f0 adds r7, #240 @ 0xf0 8004e30: 2304 movs r3, #4 8004e32: 4639 mov r1, r7 8004e34: 2232 movs r2, #50 @ 0x32 8004e36: f7ff fe69 bl 8004b0c <dhcp_option.lto_priv.0> 8004e3a: 4680 mov r8, r0 options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr))); 8004e3c: f8d9 001c ldr.w r0, [r9, #28] 8004e40: f003 f978 bl 8008134 <lwip_htonl> 8004e44: 4639 mov r1, r7 8004e46: 4602 mov r2, r0 8004e48: 4640 mov r0, r8 8004e4a: f7ff fecb bl 8004be4 <dhcp_option_long.lto_priv.0> dhcp_option_trailer(options_out_len, msg_out->options, p_out); 8004e4e: 462a mov r2, r5 8004e50: 4639 mov r1, r7 8004e52: f7ff ff85 bl 8004d60 <dhcp_option_trailer.lto_priv.0> result = udp_sendto_if_src(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif, IP4_ADDR_ANY); 8004e56: 480d ldr r0, [pc, #52] @ (8004e8c ) 8004e58: 9600 str r6, [sp, #0] 8004e5a: f8d0 0114 ldr.w r0, [r0, #276] @ 0x114 8004e5e: 4623 mov r3, r4 8004e60: f106 0228 add.w r2, r6, #40 @ 0x28 8004e64: 4629 mov r1, r5 8004e66: f005 fb6b bl 800a540 <udp_sendto_if_src.constprop.0.isra.0> pbuf_free(p_out); 8004e6a: 4628 mov r0, r5 } 8004e6c: b005 add sp, #20 8004e6e: e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr} pbuf_free(p_out); 8004e72: f004 bfa3 b.w 8009dbc <pbuf_free.isra.0> 8004e76: bf00 nop 8004e78: 20000060 .word 0x20000060 8004e7c: 0800c2e8 .word 0x0800c2e8 8004e80: 0800c0f4 .word 0x0800c0f4 8004e84: 0800b232 .word 0x0800b232 8004e88: 0800d32c .word 0x0800d32c 8004e8c: 20001158 .word 0x20001158 08004e90 : { 8004e90: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} struct dhcp *dhcp = netif_dhcp_data(netif); 8004e94: 6a44 ldr r4, [r0, #36] @ 0x24 ip4_addr_set_any(&dhcp->offered_ip_addr); 8004e96: 2300 movs r3, #0 { 8004e98: b085 sub sp, #20 8004e9a: 4607 mov r7, r0 ip4_addr_set_any(&dhcp->offered_ip_addr); 8004e9c: 61e3 str r3, [r4, #28] dhcp_set_state(dhcp, DHCP_STATE_SELECTING); 8004e9e: 2106 movs r1, #6 8004ea0: 4620 mov r0, r4 8004ea2: f7ff fdad bl 8004a00 <dhcp_set_state.lto_priv.0> p_out = dhcp_create_msg(netif, dhcp, DHCP_DISCOVER, &options_out_len); 8004ea6: 2201 movs r2, #1 8004ea8: f10d 030e add.w r3, sp, #14 8004eac: 4621 mov r1, r4 8004eae: 4638 mov r0, r7 8004eb0: f7ff fec4 bl 8004c3c <dhcp_create_msg.lto_priv.0> if (p_out != NULL) { 8004eb4: 4605 mov r5, r0 8004eb6: /----- b3b0 cbz r0, 8004f26 <dhcp_discover.lto_priv.0+0x96> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); 8004eb8: | 6846 ldr r6, [r0, #4] 8004eba: | f8bd 000e ldrh.w r0, [sp, #14] 8004ebe: | f8df 90ac ldr.w r9, [pc, #172] @ 8004f6c 8004ec2: | 36f0 adds r6, #240 @ 0xf0 8004ec4: | 2302 movs r3, #2 8004ec6: | 2239 movs r2, #57 @ 0x39 8004ec8: | 4631 mov r1, r6 8004eca: | f7ff fe1f bl 8004b0c <dhcp_option.lto_priv.0> options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif)); 8004ece: | 8dba ldrh r2, [r7, #44] @ 0x2c 8004ed0: | 4631 mov r1, r6 8004ed2: | f7ff fe63 bl 8004b9c <dhcp_option_short.lto_priv.0> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); 8004ed6: | 2303 movs r3, #3 8004ed8: | 2237 movs r2, #55 @ 0x37 8004eda: | 4631 mov r1, r6 8004edc: | f7ff fe16 bl 8004b0c <dhcp_option.lto_priv.0> 8004ee0: | f04f 0803 mov.w r8, #3 8004ee4: | f8ad 000e strh.w r0, [sp, #14] options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); 8004ee8: | /-> f819 2b01 ldrb.w r2, [r9], #1 8004eec: | | f8bd 000e ldrh.w r0, [sp, #14] 8004ef0: | | 4631 mov r1, r6 8004ef2: | | f7ff fe33 bl 8004b5c <dhcp_option_byte.lto_priv.0> for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { 8004ef6: | | f108 38ff add.w r8, r8, #4294967295 @ 0xffffffff 8004efa: | | f018 08ff ands.w r8, r8, #255 @ 0xff options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); 8004efe: | | f8ad 000e strh.w r0, [sp, #14] for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { 8004f02: | \-- d1f1 bne.n 8004ee8 <dhcp_discover.lto_priv.0+0x58> dhcp_option_trailer(options_out_len, msg_out->options, p_out); 8004f04: | 462a mov r2, r5 8004f06: | 4631 mov r1, r6 8004f08: | f7ff ff2a bl 8004d60 <dhcp_option_trailer.lto_priv.0> udp_sendto_if_src(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif, IP4_ADDR_ANY); 8004f0c: | 4a15 ldr r2, [pc, #84] @ (8004f64 ) 8004f0e: | 4816 ldr r0, [pc, #88] @ (8004f68 ) 8004f10: | 9200 str r2, [sp, #0] 8004f12: | f8d0 0114 ldr.w r0, [r0, #276] @ 0x114 8004f16: | 463b mov r3, r7 8004f18: | 3228 adds r2, #40 @ 0x28 8004f1a: | 4629 mov r1, r5 8004f1c: | f005 fb10 bl 800a540 <udp_sendto_if_src.constprop.0.isra.0> pbuf_free(p_out); 8004f20: | 4628 mov r0, r5 8004f22: | f004 ff4b bl 8009dbc <pbuf_free.isra.0> if (dhcp->tries < 255) { 8004f26: \----> 79a3 ldrb r3, [r4, #6] 8004f28: 2bff cmp r3, #255 @ 0xff dhcp->tries++; 8004f2a: bf1c itt ne 8004f2c: 3301 addne r3, #1 8004f2e: 71a3 strbne r3, [r4, #6] msecs = DHCP_REQUEST_BACKOFF_SEQUENCE(dhcp->tries); 8004f30: 79a2 ldrb r2, [r4, #6] 8004f32: 2a05 cmp r2, #5 8004f34: bf9f itttt ls 8004f36: 2301 movls r3, #1 8004f38: 4093 lslls r3, r2 8004f3a: ebc3 1243 rsbls r2, r3, r3, lsl #5 8004f3e: eb03 0382 addls.w r3, r3, r2, lsl #2 8004f42: bf9a itte ls 8004f44: 00db lslls r3, r3, #3 8004f46: b29b uxthls r3, r3 8004f48: f64e 2360 movwhi r3, #60000 @ 0xea60 dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); 8004f4c: f44f 72fa mov.w r2, #500 @ 0x1f4 } 8004f50: 2000 movs r0, #0 dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); 8004f52: f203 13f3 addw r3, r3, #499 @ 0x1f3 8004f56: b29b uxth r3, r3 8004f58: fbb3 f3f2 udiv r3, r3, r2 8004f5c: 8123 strh r3, [r4, #8] } 8004f5e: b005 add sp, #20 8004f60: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} 8004f64: 0800d32c .word 0x0800d32c 8004f68: 20001158 .word 0x20001158 8004f6c: 0800d358 .word 0x0800d358 08004f70 : { 8004f70: b537 push {r0, r1, r2, r4, r5, lr} LWIP_ERROR("netif_set_link_up: invalid netif", netif != NULL, return); 8004f72: 4604 mov r4, r0 8004f74: /-- b940 cbnz r0, 8004f88 <netif_set_link_up+0x18> 8004f76: | 4b1f ldr r3, [pc, #124] @ (8004ff4 ) 8004f78: | 481f ldr r0, [pc, #124] @ (8004ff8 ) 8004f7a: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc } 8004f7e: | b003 add sp, #12 8004f80: | e8bd 4030 ldmia.w sp!, {r4, r5, lr} LWIP_ERROR("netif_set_link_up: invalid netif", netif != NULL, return); 8004f84: | f7fc b9b8 b.w 80012f8 <printf_> if (!(netif->flags & NETIF_FLAG_LINK_UP)) { 8004f88: \-> f890 3035 ldrb.w r3, [r0, #53] @ 0x35 8004f8c: 075a lsls r2, r3, #29 8004f8e: /-------------- d42f bmi.n 8004ff0 <netif_set_link_up+0x80> struct dhcp *dhcp = netif_dhcp_data(netif); 8004f90: | 6a45 ldr r5, [r0, #36] @ 0x24 netif_set_flags(netif, NETIF_FLAG_LINK_UP); 8004f92: | f043 0304 orr.w r3, r3, #4 8004f96: | f880 3035 strb.w r3, [r0, #53] @ 0x35 if (!dhcp) { 8004f9a: | /-------- b195 cbz r5, 8004fc2 <netif_set_link_up+0x52> switch (dhcp->state) { 8004f9c: | | 796b ldrb r3, [r5, #5] 8004f9e: | | 2b05 cmp r3, #5 8004fa0: | | /-- d808 bhi.n 8004fb4 <netif_set_link_up+0x44> 8004fa2: | | | 2b02 cmp r3, #2 8004fa4: | | /--|-- d808 bhi.n 8004fb8 <netif_set_link_up+0x48> 8004fa6: | +--|--|-- b163 cbz r3, 8004fc2 <netif_set_link_up+0x52> dhcp->tries = 0; 8004fa8: | /--|--|--|-> 2300 movs r3, #0 8004faa: | | | | | 71ab strb r3, [r5, #6] dhcp_discover(netif); 8004fac: | | | | | 4620 mov r0, r4 8004fae: | | | | | f7ff ff6f bl 8004e90 <dhcp_discover.lto_priv.0> break; 8004fb2: | | +--|--|-- e006 b.n 8004fc2 <netif_set_link_up+0x52> switch (dhcp->state) { 8004fb4: | | | | \-> 2b0a cmp r3, #10 8004fb6: | | | | /-- d10b bne.n 8004fd0 <netif_set_link_up+0x60> dhcp->tries = 0; 8004fb8: | | | \--|-> 2300 movs r3, #0 8004fba: | | | | 71ab strb r3, [r5, #6] dhcp_reboot(netif); 8004fbc: | | | | 4620 mov r0, r4 8004fbe: | | | | f005 fc2f bl 800a820 <dhcp_reboot.isra.0> NETIF_LINK_CALLBACK(netif); 8004fc2: | | \-----|-> 69e3 ldr r3, [r4, #28] 8004fc4: +--|--------|-- b1a3 cbz r3, 8004ff0 <netif_set_link_up+0x80> 8004fc6: | | | 4620 mov r0, r4 } 8004fc8: | | | b003 add sp, #12 8004fca: | | | e8bd 4030 ldmia.w sp!, {r4, r5, lr} NETIF_LINK_CALLBACK(netif); 8004fce: | | | 4718 bx r3 LWIP_ASSERT("invalid dhcp->state", dhcp->state <= DHCP_STATE_BACKING_OFF); 8004fd0: | | \-> 2b0c cmp r3, #12 8004fd2: | +----------- d9e9 bls.n 8004fa8 <netif_set_link_up+0x38> 8004fd4: | | b672 cpsid i 8004fd6: | | 4b07 ldr r3, [pc, #28] @ (8004ff4 ) 8004fd8: | | 4a08 ldr r2, [pc, #32] @ (8004ffc ) 8004fda: | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8004fde: | | 4b08 ldr r3, [pc, #32] @ (8005000 ) 8004fe0: | | 9300 str r3, [sp, #0] 8004fe2: | | 4808 ldr r0, [pc, #32] @ (8005004 ) 8004fe4: | | f240 33bd movw r3, #957 @ 0x3bd 8004fe8: | | f7fc f986 bl 80012f8 <printf_> 8004fec: | | be00 bkpt 0x0000 8004fee: | \----------- e7db b.n 8004fa8 <netif_set_link_up+0x38> } 8004ff0: \-------------> b003 add sp, #12 8004ff2: bd30 pop {r4, r5, pc} 8004ff4: 20000060 .word 0x20000060 8004ff8: 0800c31d .word 0x0800c31d 8004ffc: 0800c346 .word 0x0800c346 8005000: 0800c0f4 .word 0x0800c0f4 8005004: 0800b232 .word 0x0800b232 08005008 : { 8005008: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} struct netif *netif = ip_current_input_netif(); 800500c: 4cb1 ldr r4, [pc, #708] @ (80052d4 ) 800500e: f8d4 511c ldr.w r5, [r4, #284] @ 0x11c struct dhcp *dhcp = netif_dhcp_data(netif); 8005012: f8d5 b024 ldr.w fp, [r5, #36] @ 0x24 { 8005016: 4692 mov sl, r2 8005018: b089 sub sp, #36 @ 0x24 struct dhcp_msg *reply_msg = (struct dhcp_msg *)p->payload; 800501a: 6852 ldr r2, [r2, #4] if ((dhcp == NULL) || (dhcp->pcb_allocated == 0)) { 800501c: f1bb 0f00 cmp.w fp, #0 8005020: /-------------------------------------------------------- f000 8088 beq.w 8005134 <dhcp_recv.lto_priv.0+0x12c> 8005024: | f89b 3004 ldrb.w r3, [fp, #4] 8005028: | 2b00 cmp r3, #0 800502a: +-------------------------------------------------------- f000 8083 beq.w 8005134 <dhcp_recv.lto_priv.0+0x12c> if (p->len < DHCP_MIN_REPLY_LEN) { 800502e: | f8ba 300a ldrh.w r3, [sl, #10] 8005032: | 2b2b cmp r3, #43 @ 0x2b 8005034: +-------------------------------------------------------- d97e bls.n 8005134 <dhcp_recv.lto_priv.0+0x12c> if (reply_msg->op != DHCP_BOOTREPLY) { 8005036: | 7813 ldrb r3, [r2, #0] 8005038: | 2b02 cmp r3, #2 800503a: +-------------------------------------------------------- d17b bne.n 8005134 <dhcp_recv.lto_priv.0+0x12c> for (i = 0; i < netif->hwaddr_len && i < LWIP_MIN(DHCP_CHADDR_LEN, NETIF_MAX_HWADDR_LEN); i++) { 800503c: | f895 6034 ldrb.w r6, [r5, #52] @ 0x34 8005040: | f105 012d add.w r1, r5, #45 @ 0x2d 8005044: | f102 001b add.w r0, r2, #27 8005048: | 2300 movs r3, #0 800504a: | /----------------> b2df uxtb r7, r3 800504c: | | 42be cmp r6, r7 800504e: | | /-- d901 bls.n 8005054 <dhcp_recv.lto_priv.0+0x4c> 8005050: | | | 2b06 cmp r3, #6 8005052: | | /--------|-- d167 bne.n 8005124 <dhcp_recv.lto_priv.0+0x11c> if (lwip_ntohl(reply_msg->xid) != dhcp->xid) { 8005054: | | | \-> 6850 ldr r0, [r2, #4] 8005056: | | | f003 f86d bl 8008134 <lwip_htonl> 800505a: | | | f8db 3000 ldr.w r3, [fp] 800505e: | | | 4298 cmp r0, r3 8005060: +--------------------------------------|-----|----------- d168 bne.n 8005134 <dhcp_recv.lto_priv.0+0x12c> dhcp_clear_all_options(dhcp); 8005062: | | | 4a9d ldr r2, [pc, #628] @ (80052d8 ) 8005064: | | | 2300 movs r3, #0 8005066: | | | f8c4 3130 str.w r3, [r4, #304] @ 0x130 800506a: | | | 6053 str r3, [r2, #4] options_idx_max = p->tot_len; 800506c: | | | f8ba 9008 ldrh.w r9, [sl, #8] int parse_sname_as_options = 0; 8005070: | | | 9303 str r3, [sp, #12] options_idx = DHCP_OPTIONS_OFS; 8005072: | | | 23f0 movs r3, #240 @ 0xf0 options_idx = DHCP_FILE_OFS; 8005074: | /-----------------------------------|-----|----------> 9302 str r3, [sp, #8] while ((q != NULL) && (options_idx >= q->len)) { 8005076: | | | | 9b02 ldr r3, [sp, #8] q = p; 8005078: | | | | 46d0 mov r8, sl while ((q != NULL) && (options_idx >= q->len)) { 800507a: | | | /--|----------> f1b8 0f00 cmp.w r8, #0 800507e: +--|-----------------------------------|--|--|----------- d059 beq.n 8005134 <dhcp_recv.lto_priv.0+0x12c> 8005080: | | | | | f8b8 200a ldrh.w r2, [r8, #10] 8005084: | | | | | 4293 cmp r3, r2 8005086: | | | | | /----- d25b bcs.n 8005140 <dhcp_recv.lto_priv.0+0x138> options = (u8_t *)q->payload; 8005088: | | /-----|--|--|-----|----> f8d8 2004 ldr.w r2, [r8, #4] 800508c: | | | | | | | 9205 str r2, [sp, #20] while ((q != NULL) && (offset < offset_max) && (options[offset] != DHCP_OPTION_END)) { 800508e: | | | /--|--|--|-----|----> 454b cmp r3, r9 8005090: | | | | | | | | /-- d203 bcs.n 800509a <dhcp_recv.lto_priv.0+0x92> 8005092: | | | | | | | | | 9a05 ldr r2, [sp, #20] 8005094: | | | | | | | | | 5cd2 ldrb r2, [r2, r3] 8005096: | | | | | | | | | 2aff cmp r2, #255 @ 0xff 8005098: | | | | | | | /--|--|-- d15b bne.n 8005152 <dhcp_recv.lto_priv.0+0x14a> if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) { 800509a: | | | | | | | | | \-> 4b8e ldr r3, [pc, #568] @ (80052d4 ) 800509c: | | | | | | | | | f893 2130 ldrb.w r2, [r3, #304] @ 0x130 80050a0: | | | | | | | | | 2a00 cmp r2, #0 80050a2: | | /--------|--|--|--|--|--|--|----- f040 80f3 bne.w 800528c <dhcp_recv.lto_priv.0+0x284> } else if (parse_sname_as_options) { 80050a6: | | /--------------|--------|--|--|--|--|--|--|----> 9a03 ldr r2, [sp, #12] 80050a8: | | | | | | | | | | | 2a00 cmp r2, #0 80050aa: | | | /-----------|--------|--|--|--|--|--|--|----- f040 80f8 bne.w 800529e <dhcp_recv.lto_priv.0+0x296> if (!dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE)) { 80050ae: | | | | | | | | | | | | f893 2131 ldrb.w r2, [r3, #305] @ 0x131 80050b2: | | | | | | | | | | | | 2a00 cmp r2, #0 80050b4: +--|-----|--|-----------|--------|--|--|--|--|--|--|----- d03e beq.n 8005134 <dhcp_recv.lto_priv.0+0x12c> msg_type = (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE); 80050b6: | | | | | | | | | | | | f893 213c ldrb.w r2, [r3, #316] @ 0x13c msg_in = (struct dhcp_msg *)p->payload; 80050ba: | | | | | | | | | | | | f8da 6004 ldr.w r6, [sl, #4] if (msg_type == DHCP_ACK) { 80050be: | | | | | | | | | | | | 2a05 cmp r2, #5 80050c0: | | /--|--|-----------|--------|--|--|--|--|--|--|----- f040 8114 bne.w 80052ec <dhcp_recv.lto_priv.0+0x2e4> if ((dhcp->state == DHCP_STATE_REQUESTING) || 80050c4: | | | | | | | | | | | | | f89b 3005 ldrb.w r3, [fp, #5] 80050c8: | | | | | | | | | | | | | f003 04fd and.w r4, r3, #253 @ 0xfd 80050cc: | | | | | | | | | | | | | 2c01 cmp r4, #1 80050ce: | | | | | /--------|--------|--|--|--|--|--|--|----- f040 80f5 bne.w 80052bc <dhcp_recv.lto_priv.0+0x2b4> dhcp_handle_ack(netif, msg_in); 80050d2: | | | | | | | | | | | | | | 6a6f ldr r7, [r5, #36] @ 0x24 80050d4: | | | | | | | | | | | | | | 4631 mov r1, r6 80050d6: | | | | | | | | | | | | | | 4638 mov r0, r7 80050d8: | | | | | | | | | | | | | | f004 fdb6 bl 8009c48 <dhcp_handle_ack.isra.0> if ((netif->flags & NETIF_FLAG_ETHARP) != 0) { 80050dc: | | | | | | | | | | | | | | f895 3035 ldrb.w r3, [r5, #53] @ 0x35 80050e0: | | | | | | | | | | | | | | 071b lsls r3, r3, #28 80050e2: | | | | | | /--|--------|--|--|--|--|--|--|----- f140 80f3 bpl.w 80052cc <dhcp_recv.lto_priv.0+0x2c4> dhcp_set_state(dhcp, DHCP_STATE_CHECKING); 80050e6: | | | | | | | | | | | | | | | 4638 mov r0, r7 80050e8: | | | | | | | | | | | | | | | 2108 movs r1, #8 80050ea: | | | | | | | | | | | | | | | f7ff fc89 bl 8004a00 <dhcp_set_state.lto_priv.0> acd_start(netif, &dhcp->acd, dhcp->offered_ip_addr); 80050ee: | | | | | | | | | | | | | | | f895 3031 ldrb.w r3, [r5, #49] @ 0x31 80050f2: | | | | | | | | | | | | | | | f895 6033 ldrb.w r6, [r5, #51] @ 0x33 80050f6: | | | | | | | | | | | | | | | f895 1032 ldrb.w r1, [r5, #50] @ 0x32 80050fa: | | | | | | | | | | | | | | | f895 2030 ldrb.w r2, [r5, #48] @ 0x30 80050fe: | | | | | | | | | | | | | | | 69fd ldr r5, [r7, #28] acd->lastconflict = 0; 8005100: | | | | | | | | | | | | | | | 9f03 ldr r7, [sp, #12] 8005102: | | | | | | | | | | | | | | | f880 7040 strb.w r7, [r0, #64] @ 0x40 acd->ttw = (u16_t)(ACD_RANDOM_PROBE_WAIT(netif, acd)); 8005106: | | | | | | | | | | | | | | | 041b lsls r3, r3, #16 8005108: | | | | | | | | | | | | | | | ea43 6306 orr.w r3, r3, r6, lsl #24 800510c: | | | | | | | | | | | | | | | 430b orrs r3, r1 800510e: | | | | | | | | | | | | | | | ea43 2302 orr.w r3, r3, r2, lsl #8 8005112: | | | | | | | | | | | | | | | 220a movs r2, #10 8005114: | | | | | | | | | | | | | | | fbb3 f1f2 udiv r1, r3, r2 8005118: | | | | | | | | | | | | | | | fb02 3311 mls r3, r2, r1, r3 ip4_addr_copy(acd->ipaddr, ipaddr); 800511c: | | | | | | | | | | | | | | | 6385 str r5, [r0, #56] @ 0x38 acd->state = ACD_STATE_PROBE_WAIT; 800511e: | | | | | | | | | | | | | | | 8784 strh r4, [r0, #60] @ 0x3c acd->ttw = (u16_t)(ACD_RANDOM_PROBE_WAIT(netif, acd)); 8005120: | | | | | | | | | | | | | | | 87c3 strh r3, [r0, #62] @ 0x3e } 8005122: +--|--|--|--|--|-----|--|--------|--|--|--|--|--|--|----- e007 b.n 8005134 <dhcp_recv.lto_priv.0+0x12c> if (netif->hwaddr[i] != reply_msg->chaddr[i]) { 8005124: | | | | | | | | | | | | \--|--|----> f811 cf01 ldrb.w ip, [r1, #1]! 8005128: | | | | | | | | | | | | | | f810 7f01 ldrb.w r7, [r0, #1]! 800512c: | | | | | | | | | | | | | | 45bc cmp ip, r7 800512e: | | | | | | | | | | | | | | f103 0301 add.w r3, r3, #1 8005132: | | | | | | | | | | \--|-----|--|----- d08a beq.n 800504a <dhcp_recv.lto_priv.0+0x42> pbuf_free(p); 8005134: >--|--|--|--|--|-----|--|--------|--|-----|-----|--|----> 4650 mov r0, sl } 8005136: | | | | | | | | | | | | | b009 add sp, #36 @ 0x24 8005138: | | | | | | | | | | | | | e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} pbuf_free(p); 800513c: | | | | | | | | | | | | | f004 be3e b.w 8009dbc <pbuf_free.isra.0> options_idx = (u16_t)(options_idx - q->len); 8005140: | | | | | | | | | | | | \----> 1a9b subs r3, r3, r2 options_idx_max = (u16_t)(options_idx_max - q->len); 8005142: | | | | | | | | | | | | eba9 0202 sub.w r2, r9, r2 q = q->next; 8005146: | | | | | | | | | | | | f8d8 8000 ldr.w r8, [r8] options_idx = (u16_t)(options_idx - q->len); 800514a: | | | | | | | | | | | | b29b uxth r3, r3 options_idx_max = (u16_t)(options_idx_max - q->len); 800514c: | | | | | | | | | | | | fa1f f982 uxth.w r9, r2 8005150: | | | | | | | | | | \-----|-------- e793 b.n 800507a <dhcp_recv.lto_priv.0+0x72> u16_t val_offset = (u16_t)(offset + 2); 8005152: | | | | | | | | | | \-------> 1c99 adds r1, r3, #2 8005154: | | | | | | | | | | b289 uxth r1, r1 if (val_offset < offset) { 8005156: | | | | | | | | | | 428b cmp r3, r1 u16_t val_offset = (u16_t)(offset + 2); 8005158: | | | | | | | | | | 9104 str r1, [sp, #16] if (val_offset < offset) { 800515a: +--|--|--|--|--|-----|--|--------|--|-------------------- d8eb bhi.n 8005134 <dhcp_recv.lto_priv.0+0x12c> if ((offset + 1) < q->len) { 800515c: | | | | | | | | | | f8b8 000a ldrh.w r0, [r8, #10] 8005160: | | | | | | | | | | 1c59 adds r1, r3, #1 8005162: | | | | | | | | | | 4281 cmp r1, r0 8005164: | | | | | | | | | | /----- da12 bge.n 800518c <dhcp_recv.lto_priv.0+0x184> len = options[offset + 1]; 8005166: | | | | | | | | | | | 9805 ldr r0, [sp, #20] 8005168: | | | | | | | | | | | 4418 add r0, r3 800516a: | | | | | | | | | | | 7844 ldrb r4, [r0, #1] switch (op) { 800516c: | | | | | | | | | | /-----|----> 2a3b cmp r2, #59 @ 0x3b 800516e: | | | | | | /--|--|--------|--|--------|-----|----- d809 bhi.n 8005184 <dhcp_recv.lto_priv.0+0x17c> 8005170: | | | | | | | | | | | | | 2a32 cmp r2, #50 @ 0x32 8005172: | | | | | | | | | /-----|--|--------|-----|----- f200 80f0 bhi.w 8005356 <dhcp_recv.lto_priv.0+0x34e> 8005176: | | | | | | | | | | | | | | 2a01 cmp r2, #1 8005178: | | | | | | | | | | | | | | /-- d00f beq.n 800519a <dhcp_recv.lto_priv.0+0x192> 800517a: | | | | | | | | | | | | | | | 2a03 cmp r2, #3 800517c: | | | | | | | | | | | | | /--|--|-- d012 beq.n 80051a4 <dhcp_recv.lto_priv.0+0x19c> 800517e: | | | | | | | | | | | | | | | | 2a00 cmp r2, #0 8005180: | | | | | | | | | | /--|--|--------|--|--|--|-- f000 80e7 beq.w 8005352 <dhcp_recv.lto_priv.0+0x34a> 8005184: | | | | | | >--|--|--|--|--|--|--------|--|--|--|-> f04f 37ff mov.w r7, #4294967295 @ 0xffffffff 8005188: | | | | | | | | | | | | | | | | | 2600 movs r6, #0 800518a: | | | | | | | | | | | | | /--|--|--|--|-- e00f b.n 80051ac <dhcp_recv.lto_priv.0+0x1a4> len = (q->next != NULL ? ((u8_t *)q->next->payload)[0] : 0); 800518c: | | | | | | | | | | | | | | | | \--|-> f8d8 4000 ldr.w r4, [r8] 8005190: | | | | | | | | | | | | | | | | | 2c00 cmp r4, #0 8005192: | | | | | | | | | | | | | | +--|-----|-- d0eb beq.n 800516c <dhcp_recv.lto_priv.0+0x164> 8005194: | | | | | | | | | | | | | | | | | 6860 ldr r0, [r4, #4] 8005196: | | | | | | | | | | | | | | | | | 7804 ldrb r4, [r0, #0] 8005198: | | | | | | | | | | | | | | \--|-----|-- e7e8 b.n 800516c <dhcp_recv.lto_priv.0+0x164> LWIP_DHCP_INPUT_ERROR("len == 4", len == 4, return ERR_VAL;); 800519a: | | | | | | | | | | | | | | | \-> 2c04 cmp r4, #4 800519c: +--|--|--|--|--|--|--|--|--|--|--|--|-----|-----|-------- d1ca bne.n 8005134 <dhcp_recv.lto_priv.0+0x12c> decode_len = len; 800519e: | | | | | | | | | | | | | | | 4626 mov r6, r4 decode_idx = DHCP_OPTION_IDX_SUBNET_MASK; 80051a0: | | | | | | | | | | | | | | | 2706 movs r7, #6 80051a2: | | | | | | | | | | | | | +-----|-------- e003 b.n 80051ac <dhcp_recv.lto_priv.0+0x1a4> LWIP_DHCP_INPUT_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;); 80051a4: | | | | | | | | | | | | | | \-------> 2c03 cmp r4, #3 80051a6: +--|--|--|--|--|--|--|--|--|--|--|--|-----|-------------- d9c5 bls.n 8005134 <dhcp_recv.lto_priv.0+0x12c> decode_idx = DHCP_OPTION_IDX_ROUTER; 80051a8: | | | | | | | | | | | | | | 2707 movs r7, #7 decode_len = 4; /* only copy the first given router */ 80051aa: | | | | | | | | | | | | | | 2604 movs r6, #4 if (offset + len + 2 > 0xFFFF) { 80051ac: | | | | | | | | | | | | | >-------------> 4423 add r3, r4 80051ae: | | | | | | | | | | | | | | f64f 72fd movw r2, #65533 @ 0xfffd 80051b2: | | | | | | | | | | | | | | 4293 cmp r3, r2 80051b4: +--|--|--|--|--|--|--|--|--|--|--|--|-----|-------------- dcbe bgt.n 8005134 <dhcp_recv.lto_priv.0+0x12c> if (decode_len > 0) { 80051b6: | | | | | | | | | | | | | | /----- b35e cbz r6, 8005210 <dhcp_recv.lto_priv.0+0x208> u32_t value = 0; 80051b8: | | | | | | | | | | | | | | | 2300 movs r3, #0 LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX); 80051ba: | | | | | | | | | | | | | | | 2f07 cmp r7, #7 u32_t value = 0; 80051bc: | | | | | | | | | | | | | | | 9307 str r3, [sp, #28] LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX); 80051be: | | | | | | | | | | | | | | | /-- d90c bls.n 80051da <dhcp_recv.lto_priv.0+0x1d2> 80051c0: | | | | | | | | | | | | | | | | b672 cpsid i 80051c2: | | | | | | | | | | | | | | | | 4b46 ldr r3, [pc, #280] @ (80052dc ) 80051c4: | | | | | | | | | | | | | | | | 4a46 ldr r2, [pc, #280] @ (80052e0 ) 80051c6: | | | | | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80051ca: | | | | | | | | | | | | | | | | 4b46 ldr r3, [pc, #280] @ (80052e4 ) 80051cc: | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 80051ce: | | | | | | | | | | | | | | | | 4846 ldr r0, [pc, #280] @ (80052e8 ) 80051d0: | | | | | | | | | | | | | | | | f44f 63d0 mov.w r3, #1664 @ 0x680 80051d4: | | | | | | | | | | | | | | | | f7fc f890 bl 80012f8 <printf_> 80051d8: | | | | | | | | | | | | | | | | be00 bkpt 0x0000 if (!dhcp_option_given(dhcp, decode_idx)) { 80051da: | | | | | | | | | | | | | | | \-> 4b3e ldr r3, [pc, #248] @ (80052d4 ) 80051dc: | | | | | | | | | | | | | | | 443b add r3, r7 80051de: | | | | | | | | | | | | | | | f893 3130 ldrb.w r3, [r3, #304] @ 0x130 80051e2: | | | | | | | | | | | | | | +----- b9ab cbnz r3, 8005210 <dhcp_recv.lto_priv.0+0x208> if (pbuf_copy_partial(q, &value, copy_len, val_offset) != copy_len) { 80051e4: | | | | | | | | | | | | | | | 9b04 ldr r3, [sp, #16] 80051e6: | | | | | | | | | | | | | | | 4632 mov r2, r6 80051e8: | | | | | | | | | | | | | | | a907 add r1, sp, #28 80051ea: | | | | | | | | | | | | | | | 4640 mov r0, r8 80051ec: | | | | | | | | | | | | | | | f7fc fcb6 bl 8001b5c <pbuf_copy_partial> 80051f0: | | | | | | | | | | | | | | | 4286 cmp r6, r0 80051f2: +--|--|--|--|--|--|--|--|--|--|--|--|-----|--------|----- d19f bne.n 8005134 <dhcp_recv.lto_priv.0+0x12c> } else if (decode_len == 4) { 80051f4: | | | | | | | | | | | | | | | 2e04 cmp r6, #4 80051f6: | | | | | | | | | | | | | | /-----|----- d146 bne.n 8005286 <dhcp_recv.lto_priv.0+0x27e> value = lwip_ntohl(value); 80051f8: | | | | | | | | | | | | | | | | 9807 ldr r0, [sp, #28] 80051fa: | | | | | | | | | | | | | | | | f002 ff9b bl 8008134 <lwip_htonl> dhcp_got_option(dhcp, decode_idx); 80051fe: | | | | | | | | | | | | | | | /--|----> 4b35 ldr r3, [pc, #212] @ (80052d4 ) 8005200: | | | | | | | | | | | | | | | | | 19da adds r2, r3, r7 dhcp_set_option_value(dhcp, decode_idx, value); 8005202: | | | | | | | | | | | | | | | | | eb03 0387 add.w r3, r3, r7, lsl #2 dhcp_got_option(dhcp, decode_idx); 8005206: | | | | | | | | | | | | | | | | | 2101 movs r1, #1 8005208: | | | | | | | | | | | | | | | | | f882 1130 strb.w r1, [r2, #304] @ 0x130 dhcp_set_option_value(dhcp, decode_idx, value); 800520c: | | | | | | | | | | | | | | | | | f8c3 0138 str.w r0, [r3, #312] @ 0x138 offset = (u16_t)(offset + len + 2); 8005210: | | | | | | | | | | | | | | | | \----> 9b04 ldr r3, [sp, #16] 8005212: | | | | | | | | | | | | | | | | 4423 add r3, r4 8005214: | | | | | | | | | | | | | | | | b29b uxth r3, r3 if (offset >= q->len) { 8005216: | | | | | | | | | | | | | /--|--|--|-------> f8b8 200a ldrh.w r2, [r8, #10] 800521a: | | | | | | | | | | | | | | | | | 429a cmp r2, r3 800521c: | | | | | | | | | | | | \--|--|--|--|-------- f63f af37 bhi.w 800508e <dhcp_recv.lto_priv.0+0x86> offset = (u16_t)(offset - q->len); 8005220: | | | | | | | | | | | | | | | | 1a9b subs r3, r3, r2 offset_max = (u16_t)(offset_max - q->len); 8005222: | | | | | | | | | | | | | | | | eba9 0202 sub.w r2, r9, r2 offset = (u16_t)(offset - q->len); 8005226: | | | | | | | | | | | | | | | | b29b uxth r3, r3 offset_max = (u16_t)(offset_max - q->len); 8005228: | | | | | | | | | | | | | | | | fa1f f982 uxth.w r9, r2 if (offset < offset_max) { 800522c: | | | | | | | | | | | | | | | | 454b cmp r3, r9 800522e: +--|--|--|--|--|--|--|--|--|--|--|-----|--|--|--|-------- d281 bcs.n 8005134 <dhcp_recv.lto_priv.0+0x12c> q = q->next; 8005230: | | | | | | | | | | | | | | | | f8d8 8000 ldr.w r8, [r8] LWIP_DHCP_INPUT_ERROR("next pbuf was null", q != NULL, return ERR_VAL;); 8005234: | | | | | | | | | | | | | | | | f1b8 0f00 cmp.w r8, #0 8005238: | | | | | | | | | | | \-----|--|--|--|-------- f47f af26 bne.w 8005088 <dhcp_recv.lto_priv.0+0x80> 800523c: +--|--|--|--|--|--|--|--|--|--|--------|--|--|--|-------- e77a b.n 8005134 <dhcp_recv.lto_priv.0+0x12c> LWIP_DHCP_INPUT_ERROR("len == 4", len == 4, return ERR_VAL;); 800523e: | | | | | | | | | | | | | | | 2c04 cmp r4, #4 8005240: +--|--|--|--|--|--|--|--|--|--|--------|--|--|--|-------- f47f af78 bne.w 8005134 <dhcp_recv.lto_priv.0+0x12c> decode_len = len; 8005244: | | | | | | | | | | | | | | | 4626 mov r6, r4 decode_idx = DHCP_OPTION_IDX_LEASE_TIME; 8005246: | | | | | | | | | | | | | | | 2703 movs r7, #3 8005248: | | | | | | | | | | | | +--|--|-------- e7b0 b.n 80051ac <dhcp_recv.lto_priv.0+0x1a4> LWIP_DHCP_INPUT_ERROR("len == 1", len == 1, return ERR_VAL;); 800524a: | | | | | | | | | | | | | | | 2c01 cmp r4, #1 800524c: +--|--|--|--|--|--|--|--|--|--|--------|--|--|--|-------- f47f af72 bne.w 8005134 <dhcp_recv.lto_priv.0+0x12c> LWIP_DHCP_INPUT_ERROR("overload in file/sname", options_offset == DHCP_OPTIONS_OFS, return ERR_VAL;); 8005250: | | | | | | | | | | | | | | | 9a02 ldr r2, [sp, #8] 8005252: | | | | | | | | | | | | | | | 2af0 cmp r2, #240 @ 0xf0 8005254: +--|--|--|--|--|--|--|--|--|--|--------|--|--|--|-------- f47f af6e bne.w 8005134 <dhcp_recv.lto_priv.0+0x12c> decode_len = len; 8005258: | | | | | | | | | | | | | | | 4626 mov r6, r4 decode_idx = DHCP_OPTION_IDX_OVERLOAD; 800525a: | | | | | | | | | | | | | | | 2700 movs r7, #0 800525c: | | | | | | | | | | | | +--|--|-------- e7a6 b.n 80051ac <dhcp_recv.lto_priv.0+0x1a4> LWIP_DHCP_INPUT_ERROR("len == 1", len == 1, return ERR_VAL;); 800525e: | | | | | | | | | | | | | | | 2c01 cmp r4, #1 LWIP_DHCP_INPUT_ERROR("len == 4", len == 4, return ERR_VAL;); 8005260: +--|--|--|--|--|--|--|--|--|--|--------|--|--|--|-----/-X f47f af68 bne.w 8005134 <dhcp_recv.lto_priv.0+0x12c> decode_len = len; 8005264: | | | | | | | | | | | | | | | | 4626 mov r6, r4 decode_idx = DHCP_OPTION_IDX_T1; 8005266: | | | | | | | | | | | | | | | | 4627 mov r7, r4 8005268: | | | | | | | | | | | | +--|--|-----|-- e7a0 b.n 80051ac <dhcp_recv.lto_priv.0+0x1a4> LWIP_DHCP_INPUT_ERROR("len == 4", len == 4, return ERR_VAL;); 800526a: | | | | | | | | | | | | | | | | 2c04 cmp r4, #4 800526c: +--|--|--|--|--|--|--|--|--|--|--------|--|--|--|-----|-- f47f af62 bne.w 8005134 <dhcp_recv.lto_priv.0+0x12c> decode_len = len; 8005270: | | | | | | | | | | | | | | | | 4626 mov r6, r4 decode_idx = DHCP_OPTION_IDX_SERVER_ID; 8005272: | | | | | | | | | | | | | | | | 2702 movs r7, #2 8005274: | | | | | | | | | | | | +--|--|-----|-- e79a b.n 80051ac <dhcp_recv.lto_priv.0+0x1a4> LWIP_DHCP_INPUT_ERROR("len == 4", len == 4, return ERR_VAL;); 8005276: | | | | | | | | | | | | | | | | 2c04 cmp r4, #4 8005278: | | | | | | | | | | | | | | | \-- e7f2 b.n 8005260 <dhcp_recv.lto_priv.0+0x258> LWIP_DHCP_INPUT_ERROR("len == 4", len == 4, return ERR_VAL;); 800527a: | | | | | | | | | | | | | | | 2c04 cmp r4, #4 800527c: +--|--|--|--|--|--|--|--|--|--|--------|--|--|--|-------- f47f af5a bne.w 8005134 <dhcp_recv.lto_priv.0+0x12c> decode_len = len; 8005280: | | | | | | | | | | | | | | | 4626 mov r6, r4 decode_idx = DHCP_OPTION_IDX_T2; 8005282: | | | | | | | | | | | | | | | 2705 movs r7, #5 8005284: | | | | | | | | | | | | \--|--|-------- e792 b.n 80051ac <dhcp_recv.lto_priv.0+0x1a4> value = ((u8_t *)&value)[0]; 8005286: | | | | | | | | | | | | \--|-------> f89d 001c ldrb.w r0, [sp, #28] 800528a: | | | | | | | | | | | | \-------- e7b8 b.n 80051fe <dhcp_recv.lto_priv.0+0x1f6> u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD); 800528c: | | | | | | | | \--|--|--------|----------------> f8d3 2138 ldr.w r2, [r3, #312] @ 0x138 dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD); 8005290: | | | | | | | | | | | 2100 movs r1, #0 if (overload == DHCP_OVERLOAD_FILE) { 8005292: | | | | | | | | | | | 2a01 cmp r2, #1 dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD); 8005294: | | | | | | | | | | | f883 1130 strb.w r1, [r3, #304] @ 0x130 if (overload == DHCP_OVERLOAD_FILE) { 8005298: | | | | | | | | | | | /----- d00c beq.n 80052b4 <dhcp_recv.lto_priv.0+0x2ac> } else if (overload == DHCP_OVERLOAD_SNAME) { 800529a: | | | | | | | | | | | | 2a02 cmp r2, #2 800529c: | | | | | | | | | | | | /-- d105 bne.n 80052aa <dhcp_recv.lto_priv.0+0x2a2> parse_sname_as_options = 0; 800529e: | | | | \--|--|--|-----|--|--------|-----------|--|-> 2300 movs r3, #0 80052a0: | | | | | | | | | | | | 9303 str r3, [sp, #12] options_idx_max = DHCP_SNAME_OFS + DHCP_SNAME_LEN; 80052a2: | | | | | | | | | | | | f04f 096c mov.w r9, #108 @ 0x6c options_idx = DHCP_SNAME_OFS; 80052a6: | | | | | | | | | | | | 232c movs r3, #44 @ 0x2c 80052a8: | +--|--|-----|--|--|-----|--|--------|-----------|--|-- e6e4 b.n 8005074 <dhcp_recv.lto_priv.0+0x6c> } else if (overload == DHCP_OVERLOAD_SNAME_FILE) { 80052aa: | | | | | | | | | | | \-> 2a03 cmp r2, #3 80052ac: | | | \-----|--|--|-----|--|--------|-----------|----- f47f aefb bne.w 80050a6 <dhcp_recv.lto_priv.0+0x9e> parse_sname_as_options = 1; 80052b0: | | | | | | | | | | 2301 movs r3, #1 80052b2: | | | | | | | | | | 9303 str r3, [sp, #12] options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN; 80052b4: | | | | | | | | | \----> f04f 09ec mov.w r9, #236 @ 0xec options_idx = DHCP_FILE_OFS; 80052b8: | | | | | | | | | 236c movs r3, #108 @ 0x6c 80052ba: | \--|--------|--|--|-----|--|--------|----------------- e6db b.n 8005074 <dhcp_recv.lto_priv.0+0x6c> else if ((dhcp->state == DHCP_STATE_REBINDING) || 80052bc: | | \--|--|-----|--|--------|----------------> 3b04 subs r3, #4 80052be: | | | | | | | 2b01 cmp r3, #1 80052c0: +-----|-----------|--|-----|--|--------|----------------- f63f af38 bhi.w 8005134 <dhcp_recv.lto_priv.0+0x12c> dhcp_handle_ack(netif, msg_in); 80052c4: | | | | | | | 6a68 ldr r0, [r5, #36] @ 0x24 80052c6: | | | | | | | 4631 mov r1, r6 80052c8: | | | | | | | f004 fcbe bl 8009c48 <dhcp_handle_ack.isra.0> dhcp_bind(netif); 80052cc: | | | \-----|--|--------|----------------> 4628 mov r0, r5 80052ce: | | | | | | f7ff fb9f bl 8004a10 <dhcp_bind> 80052d2: +-----|-----------|--------|--|--------|----------------- e72f b.n 8005134 <dhcp_recv.lto_priv.0+0x12c> 80052d4: | | | | | | 20001158 .word 0x20001158 80052d8: | | | | | | 20001288 .word 0x20001288 80052dc: | | | | | | 20000060 .word 0x20000060 80052e0: | | | | | | 0800c35a .word 0x0800c35a 80052e4: | | | | | | 0800c0f4 .word 0x0800c0f4 80052e8: | | | | | | 0800b232 .word 0x0800b232 else if ((msg_type == DHCP_NAK) && 80052ec: | \-----------|--------|--|--------|----------------> 2a06 cmp r2, #6 80052ee: | | | | | /----- d115 bne.n 800531c <dhcp_recv.lto_priv.0+0x314> ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REQUESTING) || 80052f0: | | | | | | f89b 3005 ldrb.w r3, [fp, #5] else if ((msg_type == DHCP_NAK) && 80052f4: | | | | | | 1eda subs r2, r3, #3 80052f6: | | | | | | 2a02 cmp r2, #2 80052f8: | | | | | | /-- d902 bls.n 8005300 <dhcp_recv.lto_priv.0+0x2f8> ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REQUESTING) || 80052fa: | | | | | | | 2b01 cmp r3, #1 80052fc: +-----------------|--------|--|--------|-----------|--|-- f47f af1a bne.w 8005134 <dhcp_recv.lto_priv.0+0x12c> dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF); 8005300: | | | | | | \-> 6a68 ldr r0, [r5, #36] @ 0x24 8005302: | | | | | | 210c movs r1, #12 8005304: | | | | | | f7ff fb7c bl 8004a00 <dhcp_set_state.lto_priv.0> netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4); 8005308: | | | | | | 4b1f ldr r3, [pc, #124] @ (8005388 ) 800530a: | | | | | | 4628 mov r0, r5 800530c: | | | | | | 461a mov r2, r3 800530e: | | | | | | 4619 mov r1, r3 8005310: | | | | | | f7fe fcba bl 8003c88 <netif_set_addr> dhcp_discover(netif); 8005314: | | | | | | 4628 mov r0, r5 8005316: | | | | | | f7ff fdbb bl 8004e90 <dhcp_discover.lto_priv.0> } 800531a: +-----------------|--------|--|--------|-----------|----- e70b b.n 8005134 <dhcp_recv.lto_priv.0+0x12c> else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_STATE_SELECTING)) { 800531c: | | | | | \----> 2a02 cmp r2, #2 800531e: +-----------------|--------|--|--------|----------------- f47f af09 bne.w 8005134 <dhcp_recv.lto_priv.0+0x12c> 8005322: | | | | | f89b 2005 ldrb.w r2, [fp, #5] 8005326: | | | | | 2a06 cmp r2, #6 8005328: +-----------------|--------|--|--------|----------------- f47f af04 bne.w 8005134 <dhcp_recv.lto_priv.0+0x12c> if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) { 800532c: | | | | | f893 2132 ldrb.w r2, [r3, #306] @ 0x132 struct dhcp *dhcp = netif_dhcp_data(netif); 8005330: | | | | | 6a6c ldr r4, [r5, #36] @ 0x24 if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) { 8005332: | | | | | 2a00 cmp r2, #0 8005334: +-----------------|--------|--|--------|----------------- f43f aefe beq.w 8005134 <dhcp_recv.lto_priv.0+0x12c> dhcp->request_timeout = 0; /* stop timer */ 8005338: | | | | | 9a03 ldr r2, [sp, #12] ip_addr_set_ip4_u32(&dhcp->server_ip_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID))); 800533a: | | | | | f8d3 0140 ldr.w r0, [r3, #320] @ 0x140 dhcp->request_timeout = 0; /* stop timer */ 800533e: | | | | | 8122 strh r2, [r4, #8] ip_addr_set_ip4_u32(&dhcp->server_ip_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID))); 8005340: | | | | | f002 fef8 bl 8008134 <lwip_htonl> 8005344: | | | | | 61a0 str r0, [r4, #24] ip4_addr_copy(dhcp->offered_ip_addr, msg_in->yiaddr); 8005346: | | | | | 6933 ldr r3, [r6, #16] 8005348: | | | | | 61e3 str r3, [r4, #28] dhcp_select(netif); 800534a: | | | | | 4628 mov r0, r5 800534c: | | | | | f005 f9c6 bl 800a6dc <dhcp_select.isra.0> 8005350: \-----------------|--------|--|--------|----------------- e6f0 b.n 8005134 <dhcp_recv.lto_priv.0+0x12c> offset++; 8005352: | | \--------|----------------> b28b uxth r3, r1 8005354: | | \----------------- e75f b.n 8005216 <dhcp_recv.lto_priv.0+0x20e> switch (op) { 8005356: | \----------------------------> 3a33 subs r2, #51 @ 0x33 8005358: | 2a08 cmp r2, #8 800535a: \-------------------------------------- f63f af13 bhi.w 8005184 <dhcp_recv.lto_priv.0+0x17c> 800535e: a101 add r1, pc, #4 @ (adr r1, 8005364 ) 8005360: f851 f022 ldr.w pc, [r1, r2, lsl #2] 8005364: 0800523f .word 0x0800523f 8005368: 0800524b .word 0x0800524b 800536c: 0800525f .word 0x0800525f 8005370: 0800526b .word 0x0800526b 8005374: 08005185 .word 0x08005185 8005378: 08005185 .word 0x08005185 800537c: 08005185 .word 0x08005185 8005380: 08005277 .word 0x08005277 8005384: 0800527b .word 0x0800527b 8005388: 0800d32c .word 0x0800d32c 0800538c : { 800538c: e92d 41ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, lr} struct dhcp *dhcp = netif_dhcp_data(netif); 8005390: 6a44 ldr r4, [r0, #36] @ 0x24 { 8005392: 4605 mov r5, r0 if (dhcp == NULL) { 8005394: 2c00 cmp r4, #0 8005396: /----------------- d069 beq.n 800546c <dhcp_release_and_stop+0xe0> if (dhcp->state == DHCP_STATE_OFF) { 8005398: | 7963 ldrb r3, [r4, #5] 800539a: | 2b00 cmp r3, #0 800539c: +----------------- d066 beq.n 800546c <dhcp_release_and_stop+0xe0> ip_addr_set_zero_ip4(&dhcp->server_ip_addr); 800539e: | 2100 movs r1, #0 ip_addr_copy(server_ip_addr, dhcp->server_ip_addr); 80053a0: | 69a2 ldr r2, [r4, #24] 80053a2: | 9203 str r2, [sp, #12] u8_t dhcp_supplied_address(const struct netif *netif) { if ((netif != NULL) && (netif_dhcp_data(netif) != NULL)) { struct dhcp *dhcp = netif_dhcp_data(netif); return (dhcp->state == DHCP_STATE_BOUND) || (dhcp->state == DHCP_STATE_RENEWING) || 80053a4: | 2b0a cmp r3, #10 ip4_addr_set_zero(&dhcp->offered_ip_addr); 80053a6: | e9c4 1106 strd r1, r1, [r4, #24] ip4_addr_set_zero(&dhcp->offered_gw_addr); 80053aa: | e9c4 1108 strd r1, r1, [r4, #32] dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0; 80053ae: | e9c4 110b strd r1, r1, [r4, #44] @ 0x2c 80053b2: | 62a1 str r1, [r4, #40] @ 0x28 dhcp->t1_renew_time = dhcp->t2_rebind_time = dhcp->lease_used = dhcp->t0_timeout = 0; 80053b4: | 81e1 strh r1, [r4, #14] 80053b6: | 6121 str r1, [r4, #16] 80053b8: | 82a1 strh r1, [r4, #20] return (dhcp->state == DHCP_STATE_BOUND) || (dhcp->state == DHCP_STATE_RENEWING) || 80053ba: | /-- d002 beq.n 80053c2 <dhcp_release_and_stop+0x36> 80053bc: | | 3b04 subs r3, #4 80053be: | | 2b01 cmp r3, #1 80053c0: | /-----------|-- d845 bhi.n 800544e <dhcp_release_and_stop+0xc2> dhcp_set_state(dhcp, DHCP_STATE_OFF); 80053c2: | | \-> 2100 movs r1, #0 80053c4: | | 4620 mov r0, r4 80053c6: | | f7ff fb1b bl 8004a00 <dhcp_set_state.lto_priv.0> p_out = dhcp_create_msg(netif, dhcp, DHCP_RELEASE, &options_out_len); 80053ca: | | 2207 movs r2, #7 80053cc: | | f10d 030a add.w r3, sp, #10 80053d0: | | 4621 mov r1, r4 80053d2: | | 4628 mov r0, r5 80053d4: | | f7ff fc32 bl 8004c3c <dhcp_create_msg.lto_priv.0> if (p_out != NULL) { 80053d8: | | 4606 mov r6, r0 80053da: | | /-- b300 cbz r0, 800541e <dhcp_release_and_stop+0x92> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_SERVER_ID, 4); 80053dc: | | | 6847 ldr r7, [r0, #4] 80053de: | | | f8bd 000a ldrh.w r0, [sp, #10] 80053e2: | | | 37f0 adds r7, #240 @ 0xf0 80053e4: | | | 2304 movs r3, #4 80053e6: | | | 2236 movs r2, #54 @ 0x36 80053e8: | | | 4639 mov r1, r7 80053ea: | | | f7ff fb8f bl 8004b0c <dhcp_option.lto_priv.0> 80053ee: | | | 4680 mov r8, r0 options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&server_ip_addr)))); 80053f0: | | | 9803 ldr r0, [sp, #12] 80053f2: | | | f002 fe9f bl 8008134 <lwip_htonl> 80053f6: | | | 4639 mov r1, r7 80053f8: | | | 4602 mov r2, r0 80053fa: | | | 4640 mov r0, r8 80053fc: | | | f7ff fbf2 bl 8004be4 <dhcp_option_long.lto_priv.0> dhcp_option_trailer(options_out_len, msg_out->options, p_out); 8005400: | | | 4632 mov r2, r6 8005402: | | | 4639 mov r1, r7 8005404: | | | f7ff fcac bl 8004d60 <dhcp_option_trailer.lto_priv.0> udp_sendto_if(dhcp_pcb, p_out, &server_ip_addr, LWIP_IANA_PORT_DHCP_SERVER, netif); 8005408: | | | 481c ldr r0, [pc, #112] @ (800547c ) 800540a: | | | 462b mov r3, r5 800540c: | | | f8d0 0114 ldr.w r0, [r0, #276] @ 0x114 8005410: | | | aa03 add r2, sp, #12 8005412: | | | 4631 mov r1, r6 8005414: | | | f005 f932 bl 800a67c <udp_sendto_if.constprop.0.isra.0> pbuf_free(p_out); 8005418: | | | 4630 mov r0, r6 800541a: | | | f004 fccf bl 8009dbc <pbuf_free.isra.0> netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4); 800541e: | | \-> 4b18 ldr r3, [pc, #96] @ (8005480 ) 8005420: | | 4628 mov r0, r5 8005422: | | 461a mov r2, r3 8005424: | | 4619 mov r1, r3 8005426: | | f7fe fc2f bl 8003c88 <netif_set_addr> for (acd2 = netif->acd_list; acd2 != NULL; acd2 = acd2->next) { 800542a: | | /----> 6beb ldr r3, [r5, #60] @ 0x3c acd_remove(netif, &dhcp->acd); 800542c: | | | f104 0134 add.w r1, r4, #52 @ 0x34 struct acd *acd2, *prev = NULL; 8005430: | | | 2200 movs r2, #0 for (acd2 = netif->acd_list; acd2 != NULL; acd2 = acd2->next) { 8005432: | | /-----|--/-X b983 cbnz r3, 8005456 <dhcp_release_and_stop+0xca> LWIP_ASSERT(("acd_remove(): acd not on list\n"), 0); 8005434: | | | | | b672 cpsid i 8005436: | | | | | 4b13 ldr r3, [pc, #76] @ (8005484 ) 8005438: | | | | | 4a13 ldr r2, [pc, #76] @ (8005488 ) 800543a: | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 800543e: | | | | | 4b13 ldr r3, [pc, #76] @ (800548c ) 8005440: | | | | | 9300 str r3, [sp, #0] 8005442: | | | | | 4813 ldr r0, [pc, #76] @ (8005490 ) 8005444: | | | | | 23a9 movs r3, #169 @ 0xa9 8005446: | | | | | f7fb ff57 bl 80012f8 <printf_> 800544a: | | | | | be00 bkpt 0x0000 800544c: | | | /--|--|-- e008 b.n 8005460 <dhcp_release_and_stop+0xd4> dhcp_set_state(dhcp, DHCP_STATE_OFF); 800544e: | \--|--|--|--|-> 4620 mov r0, r4 8005450: | | | | | f7ff fad6 bl 8004a00 <dhcp_set_state.lto_priv.0> 8005454: | | | \--|-- e7e9 b.n 800542a <dhcp_release_and_stop+0x9e> if (acd2 == acd) { 8005456: | | | \-> 4299 cmp r1, r3 8005458: | | | /----- d10d bne.n 8005476 <dhcp_release_and_stop+0xea> prev->next = acd->next; 800545a: | | | | 6b63 ldr r3, [r4, #52] @ 0x34 if (prev) { 800545c: | | | | /-- b14a cbz r2, 8005472 <dhcp_release_and_stop+0xe6> prev->next = acd->next; 800545e: | | | | | 6013 str r3, [r2, #0] if (dhcp->pcb_allocated != 0) { 8005460: | | >--|--|-> 7923 ldrb r3, [r4, #4] 8005462: +-----|--|--|--|-- b11b cbz r3, 800546c <dhcp_release_and_stop+0xe0> dhcp_dec_pcb_refcount(); /* free DHCP PCB if not needed any more */ 8005464: | | | | | f7ff fa82 bl 800496c <dhcp_dec_pcb_refcount.lto_priv.0> dhcp->pcb_allocated = 0; 8005468: | | | | | 2300 movs r3, #0 800546a: | | | | | 7123 strb r3, [r4, #4] } 800546c: \-----|--|--|--|-> b004 add sp, #16 800546e: | | | | e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} netif->acd_list = acd->next; 8005472: | | | \-> 63eb str r3, [r5, #60] @ 0x3c 8005474: | \--|----- e7f4 b.n 8005460 <dhcp_release_and_stop+0xd4> prev = acd2; 8005476: | \----> 461a mov r2, r3 for (acd2 = netif->acd_list; acd2 != NULL; acd2 = acd2->next) { 8005478: | 681b ldr r3, [r3, #0] 800547a: \----------- e7da b.n 8005432 <dhcp_release_and_stop+0xa6> 800547c: 20001158 .word 0x20001158 8005480: 0800d32c .word 0x0800d32c 8005484: 20000060 .word 0x20000060 8005488: 0800c36b .word 0x0800c36b 800548c: 0800c38a .word 0x0800c38a 8005490: 0800b232 .word 0x0800b232 08005494 : { 8005494: e92d 47f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, r9, sl, lr} NETIF_FOREACH(netif) { 8005498: 4e86 ldr r6, [pc, #536] @ (80056b4 ) 800549a: f8d6 510c ldr.w r5, [r6, #268] @ 0x10c 800549e: 2d00 cmp r5, #0 80054a0: /----------- f000 808e beq.w 80055c0 <dhcp_coarse_tmr+0x12c> struct dhcp *dhcp = netif_dhcp_data(netif); 80054a4: | 6a6c ldr r4, [r5, #36] @ 0x24 if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF)) { 80054a6: | 2c00 cmp r4, #0 80054a8: +----------- f000 808a beq.w 80055c0 <dhcp_coarse_tmr+0x12c> 80054ac: | 7963 ldrb r3, [r4, #5] 80054ae: | 2b00 cmp r3, #0 80054b0: +----------- f000 8086 beq.w 80055c0 <dhcp_coarse_tmr+0x12c> if (dhcp->t0_timeout && (++dhcp->lease_used == dhcp->t0_timeout)) { 80054b4: | 8aa1 ldrh r1, [r4, #20] 80054b6: | /-- b171 cbz r1, 80054d6 <dhcp_coarse_tmr+0x42> 80054b8: | | 8a62 ldrh r2, [r4, #18] 80054ba: | | 3201 adds r2, #1 80054bc: | | b292 uxth r2, r2 80054be: | | 4291 cmp r1, r2 80054c0: | | 8262 strh r2, [r4, #18] 80054c2: | +-- d108 bne.n 80054d6 <dhcp_coarse_tmr+0x42> dhcp_release_and_stop(netif); 80054c4: | | 4628 mov r0, r5 80054c6: | | f7ff ff61 bl 800538c <dhcp_release_and_stop> dhcp_start(netif); 80054ca: | | 4628 mov r0, r5 } 80054cc: | | b002 add sp, #8 80054ce: | | e8bd 47f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, lr} dhcp_start(netif); 80054d2: | | f004 bae3 b.w 8009a9c <dhcp_start.isra.0> } else if (dhcp->t2_rebind_time && (dhcp->t2_rebind_time-- == 1)) { 80054d6: | \-> 8a22 ldrh r2, [r4, #16] 80054d8: | 2a00 cmp r2, #0 80054da: | /-------- d074 beq.n 80055c6 <dhcp_coarse_tmr+0x132> 80054dc: | | 1e51 subs r1, r2, #1 80054de: | | 2a01 cmp r2, #1 80054e0: | | 8221 strh r1, [r4, #16] 80054e2: | +-------- d170 bne.n 80055c6 <dhcp_coarse_tmr+0x132> if ((dhcp->state == DHCP_STATE_REQUESTING) || (dhcp->state == DHCP_STATE_BOUND) || 80054e4: | | 3b01 subs r3, #1 80054e6: | | b2db uxtb r3, r3 80054e8: | | 2b09 cmp r3, #9 80054ea: +--|-------- d869 bhi.n 80055c0 <dhcp_coarse_tmr+0x12c> 80054ec: | | f240 2219 movw r2, #537 @ 0x219 80054f0: | | fa22 f303 lsr.w r3, r2, r3 80054f4: | | 07da lsls r2, r3, #31 80054f6: +--|-------- d563 bpl.n 80055c0 <dhcp_coarse_tmr+0x12c> dhcp_set_state(dhcp, DHCP_STATE_REBINDING); 80054f8: | | 2104 movs r1, #4 80054fa: | | 4620 mov r0, r4 80054fc: | | f7ff fa80 bl 8004a00 <dhcp_set_state.lto_priv.0> p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len); 8005500: | | 2203 movs r2, #3 8005502: | | f10d 0306 add.w r3, sp, #6 8005506: | | 4621 mov r1, r4 8005508: | | 4628 mov r0, r5 800550a: | | f7ff fb97 bl 8004c3c <dhcp_create_msg.lto_priv.0> if (p_out != NULL) { 800550e: | | 4607 mov r7, r0 8005510: | | /----- b3b0 cbz r0, 8005580 <dhcp_coarse_tmr+0xec> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); 8005512: | | | 6843 ldr r3, [r0, #4] 8005514: | | | f8bd 0006 ldrh.w r0, [sp, #6] 8005518: | | | f8df a1a0 ldr.w sl, [pc, #416] @ 80056bc 800551c: | | | f103 08f0 add.w r8, r3, #240 @ 0xf0 8005520: | | | 2239 movs r2, #57 @ 0x39 8005522: | | | 2302 movs r3, #2 8005524: | | | 4641 mov r1, r8 8005526: | | | f7ff faf1 bl 8004b0c <dhcp_option.lto_priv.0> options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif)); 800552a: | | | 8daa ldrh r2, [r5, #44] @ 0x2c 800552c: | | | 4641 mov r1, r8 800552e: | | | f7ff fb35 bl 8004b9c <dhcp_option_short.lto_priv.0> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); 8005532: | | | 2303 movs r3, #3 8005534: | | | 2237 movs r2, #55 @ 0x37 8005536: | | | 4641 mov r1, r8 8005538: | | | f7ff fae8 bl 8004b0c <dhcp_option.lto_priv.0> for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { 800553c: | | | f04f 0900 mov.w r9, #0 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); 8005540: | | | f8ad 0006 strh.w r0, [sp, #6] options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); 8005544: | | | /-> f81a 2b01 ldrb.w r2, [sl], #1 8005548: | | | | f8bd 0006 ldrh.w r0, [sp, #6] 800554c: | | | | 4641 mov r1, r8 800554e: | | | | f7ff fb05 bl 8004b5c <dhcp_option_byte.lto_priv.0> for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { 8005552: | | | | f109 0901 add.w r9, r9, #1 8005556: | | | | fa5f f989 uxtb.w r9, r9 800555a: | | | | f1b9 0f03 cmp.w r9, #3 options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); 800555e: | | | | f8ad 0006 strh.w r0, [sp, #6] for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { 8005562: | | | \-- d1ef bne.n 8005544 <dhcp_coarse_tmr+0xb0> dhcp_option_trailer(options_out_len, msg_out->options, p_out); 8005564: | | | 463a mov r2, r7 8005566: | | | 4641 mov r1, r8 8005568: | | | f7ff fbfa bl 8004d60 <dhcp_option_trailer.lto_priv.0> result = udp_sendto_if(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif); 800556c: | | | f8d6 0114 ldr.w r0, [r6, #276] @ 0x114 8005570: | | | 4a51 ldr r2, [pc, #324] @ (80056b8 ) 8005572: | | | 462b mov r3, r5 8005574: | | | 4639 mov r1, r7 8005576: | | | f005 f881 bl 800a67c <udp_sendto_if.constprop.0.isra.0> pbuf_free(p_out); 800557a: | | | 4638 mov r0, r7 800557c: | | | f004 fc1e bl 8009dbc <pbuf_free.isra.0> if (dhcp->tries < 255) { 8005580: | | \----> 79a3 ldrb r3, [r4, #6] 8005582: | | 2bff cmp r3, #255 @ 0xff dhcp->tries++; 8005584: | | bf1c itt ne 8005586: | | 3301 addne r3, #1 8005588: | | 71a3 strbne r3, [r4, #6] msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000); 800558a: | | 79a3 ldrb r3, [r4, #6] 800558c: | | 2b09 cmp r3, #9 800558e: | | bf9f itttt ls 8005590: | | ebc3 1243 rsbls r2, r3, r3, lsl #5 8005594: | | eb03 0382 addls.w r3, r3, r2, lsl #2 8005598: | | 00db lslls r3, r3, #3 800559a: | | b29b uxthls r3, r3 800559c: | | bf88 it hi 800559e: | | f242 7310 movwhi r3, #10000 @ 0x2710 dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); 80055a2: | | f203 13f3 addw r3, r3, #499 @ 0x1f3 80055a6: | | f44f 72fa mov.w r2, #500 @ 0x1f4 80055aa: | | b29b uxth r3, r3 80055ac: | | fbb3 f3f2 udiv r3, r3, r2 if (((dhcp->t0_timeout - dhcp->lease_used) / 2) >= DHCP_NEXT_TIMEOUT_THRESHOLD) { 80055b0: | | 8a62 ldrh r2, [r4, #18] dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); 80055b2: | | 8123 strh r3, [r4, #8] if (((dhcp->t0_timeout - dhcp->lease_used) / 2) >= DHCP_NEXT_TIMEOUT_THRESHOLD) { 80055b4: | | 8aa3 ldrh r3, [r4, #20] 80055b6: | | 1a9b subs r3, r3, r2 80055b8: | | 2b01 cmp r3, #1 80055ba: +--|-------- dd01 ble.n 80055c0 <dhcp_coarse_tmr+0x12c> dhcp->t2_rebind_time = (dhcp_timeout_t)((dhcp->t0_timeout - dhcp->lease_used) / 2); 80055bc: | | 105b asrs r3, r3, #1 80055be: | | 8223 strh r3, [r4, #16] } 80055c0: >--|-------> b002 add sp, #8 80055c2: | | e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} } else if (dhcp->t1_renew_time && (dhcp->t1_renew_time-- == 1)) { 80055c6: | \-------> 89e2 ldrh r2, [r4, #14] 80055c8: | 2a00 cmp r2, #0 80055ca: +----------- d0f9 beq.n 80055c0 <dhcp_coarse_tmr+0x12c> 80055cc: | 1e51 subs r1, r2, #1 80055ce: | 2a01 cmp r2, #1 80055d0: | 81e1 strh r1, [r4, #14] 80055d2: +----------- d1f5 bne.n 80055c0 <dhcp_coarse_tmr+0x12c> if ((dhcp->state == DHCP_STATE_REQUESTING) || (dhcp->state == DHCP_STATE_BOUND) || 80055d4: | 3b01 subs r3, #1 80055d6: | b2db uxtb r3, r3 80055d8: | 2b09 cmp r3, #9 80055da: +----------- d8f1 bhi.n 80055c0 <dhcp_coarse_tmr+0x12c> 80055dc: | f240 2211 movw r2, #529 @ 0x211 80055e0: | fa22 f303 lsr.w r3, r2, r3 80055e4: | 07db lsls r3, r3, #31 80055e6: +----------- d5eb bpl.n 80055c0 <dhcp_coarse_tmr+0x12c> dhcp_set_state(dhcp, DHCP_STATE_RENEWING); 80055e8: | 2105 movs r1, #5 80055ea: | 4620 mov r0, r4 80055ec: | f7ff fa08 bl 8004a00 <dhcp_set_state.lto_priv.0> p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len); 80055f0: | 2203 movs r2, #3 80055f2: | f10d 0306 add.w r3, sp, #6 80055f6: | 4621 mov r1, r4 80055f8: | 4628 mov r0, r5 80055fa: | f7ff fb1f bl 8004c3c <dhcp_create_msg.lto_priv.0> if (p_out != NULL) { 80055fe: | 4607 mov r7, r0 8005600: | /----- b3b8 cbz r0, 8005672 <dhcp_coarse_tmr+0x1de> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); 8005602: | | 6843 ldr r3, [r0, #4] 8005604: | | f8bd 0006 ldrh.w r0, [sp, #6] 8005608: | | f8df a0b0 ldr.w sl, [pc, #176] @ 80056bc 800560c: | | f103 08f0 add.w r8, r3, #240 @ 0xf0 8005610: | | 2239 movs r2, #57 @ 0x39 8005612: | | 2302 movs r3, #2 8005614: | | 4641 mov r1, r8 8005616: | | f7ff fa79 bl 8004b0c <dhcp_option.lto_priv.0> options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif)); 800561a: | | 8daa ldrh r2, [r5, #44] @ 0x2c 800561c: | | 4641 mov r1, r8 800561e: | | f7ff fabd bl 8004b9c <dhcp_option_short.lto_priv.0> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); 8005622: | | 2303 movs r3, #3 8005624: | | 2237 movs r2, #55 @ 0x37 8005626: | | 4641 mov r1, r8 8005628: | | f7ff fa70 bl 8004b0c <dhcp_option.lto_priv.0> for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { 800562c: | | f04f 0900 mov.w r9, #0 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); 8005630: | | f8ad 0006 strh.w r0, [sp, #6] options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); 8005634: | | /-> f81a 2b01 ldrb.w r2, [sl], #1 8005638: | | | f8bd 0006 ldrh.w r0, [sp, #6] 800563c: | | | 4641 mov r1, r8 800563e: | | | f7ff fa8d bl 8004b5c <dhcp_option_byte.lto_priv.0> for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { 8005642: | | | f109 0901 add.w r9, r9, #1 8005646: | | | fa5f f989 uxtb.w r9, r9 800564a: | | | f1b9 0f03 cmp.w r9, #3 options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); 800564e: | | | f8ad 0006 strh.w r0, [sp, #6] for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { 8005652: | | \-- d1ef bne.n 8005634 <dhcp_coarse_tmr+0x1a0> dhcp_option_trailer(options_out_len, msg_out->options, p_out); 8005654: | | 463a mov r2, r7 8005656: | | 4641 mov r1, r8 8005658: | | f7ff fb82 bl 8004d60 <dhcp_option_trailer.lto_priv.0> result = udp_sendto_if(dhcp_pcb, p_out, &dhcp->server_ip_addr, LWIP_IANA_PORT_DHCP_SERVER, netif); 800565c: | | f8d6 0114 ldr.w r0, [r6, #276] @ 0x114 8005660: | | 462b mov r3, r5 8005662: | | f104 0218 add.w r2, r4, #24 8005666: | | 4639 mov r1, r7 8005668: | | f005 f808 bl 800a67c <udp_sendto_if.constprop.0.isra.0> pbuf_free(p_out); 800566c: | | 4638 mov r0, r7 800566e: | | f004 fba5 bl 8009dbc <pbuf_free.isra.0> if (dhcp->tries < 255) { 8005672: | \----> 79a3 ldrb r3, [r4, #6] 8005674: | 2bff cmp r3, #255 @ 0xff dhcp->tries++; 8005676: | bf1c itt ne 8005678: | 3301 addne r3, #1 800567a: | 71a3 strbne r3, [r4, #6] msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000); 800567c: | 79a3 ldrb r3, [r4, #6] 800567e: | 2b09 cmp r3, #9 8005680: | bf9f itttt ls 8005682: | ebc3 1243 rsbls r2, r3, r3, lsl #5 8005686: | eb03 0382 addls.w r3, r3, r2, lsl #2 800568a: | 011b lslls r3, r3, #4 800568c: | b29b uxthls r3, r3 800568e: | bf88 it hi 8005690: | f644 6320 movwhi r3, #20000 @ 0x4e20 dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); 8005694: | f203 13f3 addw r3, r3, #499 @ 0x1f3 8005698: | f44f 72fa mov.w r2, #500 @ 0x1f4 800569c: | b29b uxth r3, r3 800569e: | fbb3 f3f2 udiv r3, r3, r2 if (((dhcp->t2_timeout - dhcp->lease_used) / 2) >= DHCP_NEXT_TIMEOUT_THRESHOLD) { 80056a2: | 8a62 ldrh r2, [r4, #18] dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); 80056a4: | 8123 strh r3, [r4, #8] if (((dhcp->t2_timeout - dhcp->lease_used) / 2) >= DHCP_NEXT_TIMEOUT_THRESHOLD) { 80056a6: | 89a3 ldrh r3, [r4, #12] 80056a8: | 1a9b subs r3, r3, r2 80056aa: | 2b01 cmp r3, #1 dhcp->t1_renew_time = (dhcp_timeout_t)((dhcp->t2_timeout - dhcp->lease_used) / 2); 80056ac: | bfc4 itt gt 80056ae: | 105b asrgt r3, r3, #1 80056b0: | 81e3 strhgt r3, [r4, #14] } 80056b2: \----------- e785 b.n 80055c0 <dhcp_coarse_tmr+0x12c> 80056b4: 20001158 .word 0x20001158 80056b8: 0800d354 .word 0x0800d354 80056bc: 0800d358 .word 0x0800d358 080056c0 : NETIF_FOREACH(netif) { 80056c0: 4b27 ldr r3, [pc, #156] @ (8005760 ) { 80056c2: b507 push {r0, r1, r2, lr} NETIF_FOREACH(netif) { 80056c4: f8d3 010c ldr.w r0, [r3, #268] @ 0x10c 80056c8: /----- b130 cbz r0, 80056d8 <dhcp_fine_tmr+0x18> struct dhcp *dhcp = netif_dhcp_data(netif); 80056ca: | 6a43 ldr r3, [r0, #36] @ 0x24 if (dhcp != NULL) { 80056cc: +----- b123 cbz r3, 80056d8 <dhcp_fine_tmr+0x18> if (dhcp->request_timeout > 1) { 80056ce: | 891a ldrh r2, [r3, #8] 80056d0: | 2a01 cmp r2, #1 80056d2: | /-- d904 bls.n 80056de <dhcp_fine_tmr+0x1e> dhcp->request_timeout--; 80056d4: | | 3a01 subs r2, #1 80056d6: | | 811a strh r2, [r3, #8] } 80056d8: >--|-> b003 add sp, #12 80056da: | | f85d fb04 ldr.w pc, [sp], #4 } else if (dhcp->request_timeout == 1) { 80056de: +--\-X d1fb bne.n 80056d8 <dhcp_fine_tmr+0x18> dhcp->request_timeout--; 80056e0: | 2200 movs r2, #0 80056e2: | 811a strh r2, [r3, #8] if ((dhcp->state == DHCP_STATE_BACKING_OFF) || (dhcp->state == DHCP_STATE_SELECTING)) { 80056e4: | 795a ldrb r2, [r3, #5] 80056e6: | 3a01 subs r2, #1 80056e8: | 2a0b cmp r2, #11 80056ea: \----- d8f5 bhi.n 80056d8 <dhcp_fine_tmr+0x18> 80056ec: a101 add r1, pc, #4 @ (adr r1, 80056f4 ) 80056ee: f851 f022 ldr.w pc, [r1, r2, lsl #2] 80056f2: bf00 nop 80056f4: 08005725 .word 0x08005725 80056f8: 080056d9 .word 0x080056d9 80056fc: 08005747 .word 0x08005747 8005700: 080056d9 .word 0x080056d9 8005704: 080056d9 .word 0x080056d9 8005708: 08005757 .word 0x08005757 800570c: 080056d9 .word 0x080056d9 8005710: 080056d9 .word 0x080056d9 8005714: 080056d9 .word 0x080056d9 8005718: 080056d9 .word 0x080056d9 800571c: 080056d9 .word 0x080056d9 8005720: 08005757 .word 0x08005757 if (dhcp->tries <= 5) { 8005724: 799b ldrb r3, [r3, #6] 8005726: 2b05 cmp r3, #5 8005728: /-- d804 bhi.n 8005734 <dhcp_fine_tmr+0x74> } 800572a: | b003 add sp, #12 800572c: | f85d eb04 ldr.w lr, [sp], #4 dhcp_select(netif); 8005730: | f004 bfd4 b.w 800a6dc <dhcp_select.isra.0> dhcp_release_and_stop(netif); 8005734: \-> 9001 str r0, [sp, #4] 8005736: f7ff fe29 bl 800538c <dhcp_release_and_stop> dhcp_start(netif); 800573a: 9801 ldr r0, [sp, #4] } 800573c: b003 add sp, #12 800573e: f85d eb04 ldr.w lr, [sp], #4 dhcp_start(netif); 8005742: f004 b9ab b.w 8009a9c <dhcp_start.isra.0> if (dhcp->tries < REBOOT_TRIES) { 8005746: 799b ldrb r3, [r3, #6] 8005748: 2b01 cmp r3, #1 800574a: /-- d804 bhi.n 8005756 <dhcp_fine_tmr+0x96> } 800574c: | b003 add sp, #12 800574e: | f85d eb04 ldr.w lr, [sp], #4 dhcp_reboot(netif); 8005752: | f005 b865 b.w 800a820 <dhcp_reboot.isra.0> } 8005756: \-> b003 add sp, #12 8005758: f85d eb04 ldr.w lr, [sp], #4 dhcp_discover(netif); 800575c: f7ff bb98 b.w 8004e90 <dhcp_discover.lto_priv.0> 8005760: 20001158 .word 0x20001158 08005764 : #endif /* ARP_QUEUEING */ /** Clean up ARP table entries */ static void etharp_free_entry(int i) { 8005764: b570 push {r4, r5, r6, lr} /* remove from SNMP ARP index tree */ mib2_remove_arp_entry(arp_table[i].netif, &arp_table[i].ipaddr); /* and empty packet queue */ if (arp_table[i].q != NULL) { 8005766: 4c10 ldr r4, [pc, #64] @ (80057a8 ) 8005768: 2618 movs r6, #24 800576a: fb06 4600 mla r6, r6, r0, r4 { 800576e: 4605 mov r5, r0 if (arp_table[i].q != NULL) { 8005770: f8d6 0158 ldr.w r0, [r6, #344] @ 0x158 8005774: /-- b120 cbz r0, 8005780 <etharp_free_entry.lto_priv.0+0x1c> /* remove all queued packets */ LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_free_entry: freeing entry %"U16_F", packet queue %p.\n", (u16_t)i, (void *)(arp_table[i].q))); free_etharp_q(arp_table[i].q); 8005776: | f004 fb21 bl 8009dbc <pbuf_free.isra.0> arp_table[i].q = NULL; 800577a: | 2300 movs r3, #0 800577c: | f8c6 3158 str.w r3, [r6, #344] @ 0x158 } /* recycle entry for re-use */ arp_table[i].state = ETHARP_STATE_EMPTY; 8005780: \-> 2318 movs r3, #24 8005782: fb03 4305 mla r3, r3, r5, r4 8005786: 2200 movs r2, #0 #ifdef LWIP_DEBUG /* for debugging, clean out the complete entry */ arp_table[i].ctime = 0; arp_table[i].netif = NULL; ip4_addr_set_zero(&arp_table[i].ipaddr); 8005788: e9c3 2257 strd r2, r2, [r3, #348] @ 0x15c arp_table[i].state = ETHARP_STATE_EMPTY; 800578c: f883 216c strb.w r2, [r3, #364] @ 0x16c arp_table[i].ctime = 0; 8005790: f8a3 216a strh.w r2, [r3, #362] @ 0x16a arp_table[i].ethaddr = ethzero; 8005794: 4a05 ldr r2, [pc, #20] @ (80057ac ) 8005796: f8d2 00f7 ldr.w r0, [r2, #247] @ 0xf7 800579a: f8b2 20fb ldrh.w r2, [r2, #251] @ 0xfb 800579e: f8c3 0164 str.w r0, [r3, #356] @ 0x164 80057a2: f8a3 2168 strh.w r2, [r3, #360] @ 0x168 #endif /* LWIP_DEBUG */ } 80057a6: bd70 pop {r4, r5, r6, pc} 80057a8: 20001158 .word 0x20001158 80057ac: 0800d264 .word 0x0800d264 080057b0 : etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, const struct eth_addr *ethdst_addr, const struct eth_addr *hwsrc_addr, const ip4_addr_t *ipsrc_addr, const struct eth_addr *hwdst_addr, const ip4_addr_t *ipdst_addr, const u16_t opcode) { 80057b0: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr} 80057b4: f8dd b034 ldr.w fp, [sp, #52] @ 0x34 80057b8: 4689 mov r9, r1 80057ba: 4692 mov sl, r2 80057bc: 461e mov r6, r3 struct pbuf *p; err_t result = ERR_OK; struct etharp_hdr *hdr; LWIP_ASSERT("netif != NULL", netif != NULL); 80057be: 4607 mov r7, r0 80057c0: /-- b960 cbnz r0, 80057dc <etharp_raw.lto_priv.0+0x2c> 80057c2: | b672 cpsid i 80057c4: | 4b39 ldr r3, [pc, #228] @ (80058ac ) 80057c6: | 4a3a ldr r2, [pc, #232] @ (80058b0 ) 80057c8: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80057cc: | 4b39 ldr r3, [pc, #228] @ (80058b4 ) 80057ce: | 9300 str r3, [sp, #0] 80057d0: | 4839 ldr r0, [pc, #228] @ (80058b8 ) 80057d2: | f44f 638c mov.w r3, #1120 @ 0x460 80057d6: | f7fb fd8f bl 80012f8 <printf_> 80057da: | be00 bkpt 0x0000 /* allocate a pbuf for the outgoing ARP request packet */ p = pbuf_alloc(PBUF_LINK, SIZEOF_ETHARP_HDR, PBUF_RAM); 80057dc: \-> 211c movs r1, #28 80057de: 200e movs r0, #14 80057e0: f003 fd4a bl 8009278 <pbuf_alloc.constprop.0> /* could allocate a pbuf for an ARP request? */ if (p == NULL) { 80057e4: f8df 80dc ldr.w r8, [pc, #220] @ 80058c4 80057e8: 4605 mov r5, r0 80057ea: /-- b948 cbnz r0, 8005800 <etharp_raw.lto_priv.0+0x50> LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("etharp_raw: could not allocate pbuf for ARP request.\n")); ETHARP_STATS_INC(etharp.memerr); 80057ec: | f838 3c30 ldrh.w r3, [r8, #-48] 80057f0: | 3301 adds r3, #1 80057f2: | f828 3c30 strh.w r3, [r8, #-48] return ERR_MEM; 80057f6: | f04f 30ff mov.w r0, #4294967295 @ 0xffffffff pbuf_free(p); p = NULL; /* could not allocate pbuf for ARP request */ return result; } 80057fa: /--|-> b003 add sp, #12 80057fc: | | e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} LWIP_ASSERT("check that first pbuf can hold struct etharp_hdr", 8005800: | \-> 8943 ldrh r3, [r0, #10] 8005802: | 2b1b cmp r3, #27 8005804: | /-- d80c bhi.n 8005820 <etharp_raw.lto_priv.0+0x70> 8005806: | | b672 cpsid i 8005808: | | 4b28 ldr r3, [pc, #160] @ (80058ac ) 800580a: | | 4a2c ldr r2, [pc, #176] @ (80058bc ) 800580c: | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8005810: | | 4b28 ldr r3, [pc, #160] @ (80058b4 ) 8005812: | | 9300 str r3, [sp, #0] 8005814: | | 4828 ldr r0, [pc, #160] @ (80058b8 ) 8005816: | | f240 436b movw r3, #1131 @ 0x46b 800581a: | | f7fb fd6d bl 80012f8 <printf_> 800581e: | | be00 bkpt 0x0000 hdr->opcode = lwip_htons(opcode); 8005820: | \-> f8bd 303c ldrh.w r3, [sp, #60] @ 0x3c hdr = (struct etharp_hdr *)p->payload; 8005824: | 686c ldr r4, [r5, #4] hdr->opcode = lwip_htons(opcode); 8005826: | 021b lsls r3, r3, #8 8005828: | 80e3 strh r3, [r4, #6] LWIP_ASSERT("netif->hwaddr_len must be the same as ETH_HWADDR_LEN for etharp!", 800582a: | f897 3034 ldrb.w r3, [r7, #52] @ 0x34 800582e: | 2b06 cmp r3, #6 8005830: | /-- d00c beq.n 800584c <etharp_raw.lto_priv.0+0x9c> 8005832: | | b672 cpsid i 8005834: | | 4b1d ldr r3, [pc, #116] @ (80058ac ) 8005836: | | 4a22 ldr r2, [pc, #136] @ (80058c0 ) 8005838: | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 800583c: | | 4b1d ldr r3, [pc, #116] @ (80058b4 ) 800583e: | | 9300 str r3, [sp, #0] 8005840: | | 481d ldr r0, [pc, #116] @ (80058b8 ) 8005842: | | f240 4372 movw r3, #1138 @ 0x472 8005846: | | f7fb fd57 bl 80012f8 <printf_> 800584a: | | be00 bkpt 0x0000 SMEMCPY(&hdr->shwaddr, hwsrc_addr, ETH_HWADDR_LEN); 800584c: | \-> 6833 ldr r3, [r6, #0] 800584e: | 60a3 str r3, [r4, #8] 8005850: | 88b3 ldrh r3, [r6, #4] 8005852: | 81a3 strh r3, [r4, #12] SMEMCPY(&hdr->dhwaddr, hwdst_addr, ETH_HWADDR_LEN); 8005854: | f8db 3000 ldr.w r3, [fp] 8005858: | f8c4 3012 str.w r3, [r4, #18] 800585c: | f8bb 3004 ldrh.w r3, [fp, #4] 8005860: | 82e3 strh r3, [r4, #22] IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->sipaddr, ipsrc_addr); 8005862: | 9b0c ldr r3, [sp, #48] @ 0x30 8005864: | 681b ldr r3, [r3, #0] 8005866: | f8c4 300e str.w r3, [r4, #14] IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->dipaddr, ipdst_addr); 800586a: | 9b0e ldr r3, [sp, #56] @ 0x38 800586c: | 681b ldr r3, [r3, #0] 800586e: | 61a3 str r3, [r4, #24] hdr->hwtype = PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET); 8005870: | 2301 movs r3, #1 8005872: | 7063 strb r3, [r4, #1] hdr->proto = PP_HTONS(ETHTYPE_IP); 8005874: | 2308 movs r3, #8 8005876: | 70a3 strb r3, [r4, #2] hdr->hwlen = ETH_HWADDR_LEN; 8005878: | 2306 movs r3, #6 800587a: | 7123 strb r3, [r4, #4] hdr->protolen = sizeof(ip4_addr_t); 800587c: | 2304 movs r3, #4 hdr->hwtype = PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET); 800587e: | 2600 movs r6, #0 hdr->protolen = sizeof(ip4_addr_t); 8005880: | 7163 strb r3, [r4, #5] ethernet_output(netif, p, ethsrc_addr, ethdst_addr, ETHTYPE_ARP); 8005882: | f640 0306 movw r3, #2054 @ 0x806 hdr->hwtype = PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET); 8005886: | 7026 strb r6, [r4, #0] hdr->proto = PP_HTONS(ETHTYPE_IP); 8005888: | 70e6 strb r6, [r4, #3] ethernet_output(netif, p, ethsrc_addr, ethdst_addr, ETHTYPE_ARP); 800588a: | 464a mov r2, r9 800588c: | 9300 str r3, [sp, #0] 800588e: | 4629 mov r1, r5 8005890: | 4653 mov r3, sl 8005892: | 4638 mov r0, r7 8005894: | f002 fc04 bl 80080a0 <ethernet_output> ETHARP_STATS_INC(etharp.xmit); 8005898: | f838 3c3c ldrh.w r3, [r8, #-60] pbuf_free(p); 800589c: | 4628 mov r0, r5 ETHARP_STATS_INC(etharp.xmit); 800589e: | 3301 adds r3, #1 80058a0: | f828 3c3c strh.w r3, [r8, #-60] pbuf_free(p); 80058a4: | f004 fa8a bl 8009dbc <pbuf_free.isra.0> return result; 80058a8: | 4630 mov r0, r6 80058aa: \----- e7a6 b.n 80057fa <etharp_raw.lto_priv.0+0x4a> 80058ac: 20000060 .word 0x20000060 80058b0: 0800c141 .word 0x0800c141 80058b4: 0800c3a3 .word 0x0800c3a3 80058b8: 0800b232 .word 0x0800b232 80058bc: 0800c3bf .word 0x0800c3bf 80058c0: 0800c3f0 .word 0x0800c3f0 80058c4: 20001158 .word 0x20001158 080058c8 : { 80058c8: b57f push {r0, r1, r2, r3, r4, r5, r6, lr} NETIF_FOREACH(netif) { 80058ca: 4b39 ldr r3, [pc, #228] @ (80059b0 ) 80058cc: f8d3 510c ldr.w r5, [r3, #268] @ 0x10c 80058d0: /----- b115 cbz r5, 80058d8 <acd_tmr+0x10> ACD_FOREACH(acd, netif->acd_list) { 80058d2: | 6bec ldr r4, [r5, #60] @ 0x3c acd->ttw = ANNOUNCE_INTERVAL * ACD_TICKS_PER_SECOND; 80058d4: | 2614 movs r6, #20 ACD_FOREACH(acd, netif->acd_list) { 80058d6: /--|--/-X b90c cbnz r4, 80058dc <acd_tmr+0x14> } 80058d8: | \--|-> b004 add sp, #16 80058da: | | bd70 pop {r4, r5, r6, pc} if (acd->lastconflict > 0) { 80058dc: | \-> 7b23 ldrb r3, [r4, #12] 80058de: | /-- b10b cbz r3, 80058e4 <acd_tmr+0x1c> acd->lastconflict--; 80058e0: | | 3b01 subs r3, #1 80058e2: | | 7323 strb r3, [r4, #12] if (acd->ttw > 0) { 80058e4: | \-> 8963 ldrh r3, [r4, #10] 80058e6: | /-- b10b cbz r3, 80058ec <acd_tmr+0x24> acd->ttw--; 80058e8: | | 3b01 subs r3, #1 80058ea: | | 8163 strh r3, [r4, #10] switch (acd->state) { 80058ec: | \-> 7a23 ldrb r3, [r4, #8] 80058ee: | 2b04 cmp r3, #4 80058f0: | /-- d806 bhi.n 8005900 <acd_tmr+0x38> 80058f2: | | 2b02 cmp r3, #2 80058f4: /--|-----|-- d842 bhi.n 800597c <acd_tmr+0xb4> 80058f6: | | | 3b01 subs r3, #1 80058f8: | | | 2b01 cmp r3, #1 80058fa: | | /--|-- d90a bls.n 8005912 <acd_tmr+0x4a> ACD_FOREACH(acd, netif->acd_list) { 80058fc: /--|--|--|--|-> 6824 ldr r4, [r4, #0] 80058fe: | | \--|--|-- e7ea b.n 80058d6 <acd_tmr+0xe> switch (acd->state) { 8005900: | | | \-> 2b07 cmp r3, #7 8005902: +--|-----|----- d1fb bne.n 80058fc <acd_tmr+0x34> if (acd->ttw == 0) { 8005904: | | | 8963 ldrh r3, [r4, #10] 8005906: | | | 2b00 cmp r3, #0 8005908: +--|-----|----- d1f8 bne.n 80058fc <acd_tmr+0x34> acd->state = ACD_STATE_OFF; 800590a: | | | 7223 strb r3, [r4, #8] acd->acd_conflict_callback(netif, ACD_RESTART_CLIENT); 800590c: | | | 2101 movs r1, #1 800590e: | | | 6923 ldr r3, [r4, #16] 8005910: | | /--|----- e04b b.n 80059aa <acd_tmr+0xe2> if (acd->ttw == 0) { 8005912: | | | \----> 8963 ldrh r3, [r4, #10] 8005914: | | | 2b00 cmp r3, #0 8005916: +--|--|-------- d1f1 bne.n 80058fc <acd_tmr+0x34> acd->state = ACD_STATE_PROBING; 8005918: | | | 2302 movs r3, #2 * any other err_t on failure */ err_t etharp_acd_probe(struct netif *netif, const ip4_addr_t *ipaddr) { return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, 800591a: | | | 2201 movs r2, #1 800591c: | | | 7223 strb r3, [r4, #8] 800591e: | | | 9203 str r2, [sp, #12] etharp_acd_probe(netif, &acd->ipaddr); 8005920: | | | 1d22 adds r2, r4, #4 8005922: | | | 9202 str r2, [sp, #8] 8005924: | | | 4a23 ldr r2, [pc, #140] @ (80059b4 ) 8005926: | | | 9201 str r2, [sp, #4] 8005928: | | | f1a2 012f sub.w r1, r2, #47 @ 0x2f 800592c: | | | f105 032e add.w r3, r5, #46 @ 0x2e 8005930: | | | 9100 str r1, [sp, #0] 8005932: | | | 3206 adds r2, #6 8005934: | | | 4619 mov r1, r3 8005936: | | | 4628 mov r0, r5 8005938: | | | f7ff ff3a bl 80057b0 <etharp_raw.lto_priv.0> acd->sent_num++; 800593c: | | | 7a62 ldrb r2, [r4, #9] 800593e: | | | 3201 adds r2, #1 8005940: | | | b2d2 uxtb r2, r2 if (acd->sent_num >= PROBE_NUM) { 8005942: | | | 2a02 cmp r2, #2 acd->sent_num++; 8005944: | | | 7262 strb r2, [r4, #9] if (acd->sent_num >= PROBE_NUM) { 8005946: | | | /-- d902 bls.n 800594e <acd_tmr+0x86> acd->state = ACD_STATE_ANNOUNCE_WAIT; 8005948: | | | | 4b1b ldr r3, [pc, #108] @ (80059b8 ) 800594a: | | | | 60a3 str r3, [r4, #8] 800594c: +--|--|-----|-- e7d6 b.n 80058fc <acd_tmr+0x34> acd->ttw = (u16_t)(ACD_RANDOM_PROBE_INTERVAL(netif, acd)); 800594e: | | | \-> f895 3031 ldrb.w r3, [r5, #49] @ 0x31 8005952: | | | f895 1033 ldrb.w r1, [r5, #51] @ 0x33 8005956: | | | 041b lsls r3, r3, #16 8005958: | | | ea43 6301 orr.w r3, r3, r1, lsl #24 800595c: | | | f895 1032 ldrb.w r1, [r5, #50] @ 0x32 8005960: | | | 430b orrs r3, r1 8005962: | | | f895 1030 ldrb.w r1, [r5, #48] @ 0x30 8005966: | | | ea43 2301 orr.w r3, r3, r1, lsl #8 800596a: | | | 4413 add r3, r2 800596c: | | | 220a movs r2, #10 800596e: | | | fbb3 f1f2 udiv r1, r3, r2 8005972: | | | fb02 3311 mls r3, r2, r1, r3 8005976: | | | 4413 add r3, r2 8005978: | | | 8163 strh r3, [r4, #10] 800597a: +--|--|-------- e7bf b.n 80058fc <acd_tmr+0x34> if (acd->ttw == 0) { 800597c: | \--|-------> 8963 ldrh r3, [r4, #10] 800597e: | | 2b00 cmp r3, #0 8005980: +-----|-------- d1bc bne.n 80058fc <acd_tmr+0x34> if (acd->sent_num == 0) { 8005982: | | 7a63 ldrb r3, [r4, #9] 8005984: | | /-- b913 cbnz r3, 800598c <acd_tmr+0xc4> acd->state = ACD_STATE_ANNOUNCING; 8005986: | | | 2204 movs r2, #4 8005988: | | | 7222 strb r2, [r4, #8] acd->num_conflicts = 0; 800598a: | | | 7363 strb r3, [r4, #13] etharp_acd_announce(netif, &acd->ipaddr); 800598c: | | \-> 1d21 adds r1, r4, #4 800598e: | | 4628 mov r0, r5 8005990: | | f003 ffdd bl 800994e <etharp_acd_announce.isra.0> acd->sent_num++; 8005994: | | 7a63 ldrb r3, [r4, #9] acd->ttw = ANNOUNCE_INTERVAL * ACD_TICKS_PER_SECOND; 8005996: | | 8166 strh r6, [r4, #10] acd->sent_num++; 8005998: | | 3301 adds r3, #1 800599a: | | b2db uxtb r3, r3 if (acd->sent_num >= ANNOUNCE_NUM) { 800599c: | | 2b01 cmp r3, #1 acd->sent_num++; 800599e: | | 7263 strb r3, [r4, #9] if (acd->sent_num >= ANNOUNCE_NUM) { 80059a0: +-----|-------- d9ac bls.n 80058fc <acd_tmr+0x34> acd->state = ACD_STATE_ONGOING; 80059a2: | | 2305 movs r3, #5 80059a4: | | 60a3 str r3, [r4, #8] acd->acd_conflict_callback(netif, ACD_IP_OK); 80059a6: | | 6923 ldr r3, [r4, #16] 80059a8: | | 2100 movs r1, #0 acd->acd_conflict_callback(netif, ACD_RESTART_CLIENT); 80059aa: | \-------> 4628 mov r0, r5 80059ac: | 4798 blx r3 80059ae: \-------------- e7a5 b.n 80058fc <acd_tmr+0x34> 80059b0: 20001158 .word 0x20001158 80059b4: 0800d35b .word 0x0800d35b 80059b8: 00140003 .word 0x00140003 080059bc : { 80059bc: b530 push {r4, r5, lr} return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, hw_dst_addr, 80059be: 2501 movs r5, #1 { 80059c0: b085 sub sp, #20 return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, hw_dst_addr, 80059c2: e9cd 1502 strd r1, r5, [sp, #8] 80059c6: 4905 ldr r1, [pc, #20] @ (80059dc ) 80059c8: f100 032e add.w r3, r0, #46 @ 0x2e 80059cc: e9cd 0100 strd r0, r1, [sp] 80059d0: 4619 mov r1, r3 80059d2: f7ff feed bl 80057b0 <etharp_raw.lto_priv.0> } 80059d6: b005 add sp, #20 80059d8: bd30 pop {r4, r5, pc} 80059da: bf00 nop 80059dc: 0800d35b .word 0x0800d35b 080059e0 : { 80059e0: b538 push {r3, r4, r5, lr} 80059e2: 4c13 ldr r4, [pc, #76] @ (8005a30 ) for (i = 0; i < ARP_TABLE_SIZE; ++i) { 80059e4: 2500 movs r5, #0 u8_t state = arp_table[i].state; 80059e6: /----------> 7d22 ldrb r2, [r4, #20] if (state != ETHARP_STATE_EMPTY 80059e8: /--|----------- b16a cbz r2, 8005a06 <etharp_tmr+0x26> arp_table[i].ctime++; 80059ea: | | 8a63 ldrh r3, [r4, #18] 80059ec: | | 3301 adds r3, #1 80059ee: | | b29b uxth r3, r3 if ((arp_table[i].ctime >= ARP_MAXAGE) || 80059f0: | | f5b3 7f96 cmp.w r3, #300 @ 0x12c arp_table[i].ctime++; 80059f4: | | 8263 strh r3, [r4, #18] if ((arp_table[i].ctime >= ARP_MAXAGE) || 80059f6: | | /-- d203 bcs.n 8005a00 <etharp_tmr+0x20> 80059f8: | | | 2a01 cmp r2, #1 80059fa: | | /--|-- d10a bne.n 8005a12 <etharp_tmr+0x32> ((arp_table[i].state == ETHARP_STATE_PENDING) && 80059fc: | | | | 2b04 cmp r3, #4 80059fe: | | /--|--|-- d90d bls.n 8005a1c <etharp_tmr+0x3c> etharp_free_entry(i); 8005a00: | | | | \-> 4628 mov r0, r5 8005a02: | | | | f7ff feaf bl 8005764 <etharp_free_entry.lto_priv.0> for (i = 0; i < ARP_TABLE_SIZE; ++i) { 8005a06: >--|--|--|----> 3501 adds r5, #1 8005a08: | | | | 2d0a cmp r5, #10 8005a0a: | | | | f104 0418 add.w r4, r4, #24 8005a0e: | \--|--|----- d1ea bne.n 80059e6 <etharp_tmr+0x6> } 8005a10: | | | bd38 pop {r3, r4, r5, pc} } else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_1) { 8005a12: | | \----> 2a03 cmp r2, #3 8005a14: | | /-- d108 bne.n 8005a28 <etharp_tmr+0x48> arp_table[i].state = ETHARP_STATE_STABLE_REREQUESTING_2; 8005a16: | | | 2304 movs r3, #4 arp_table[i].state = ETHARP_STATE_STABLE; 8005a18: | | /--|-> 7523 strb r3, [r4, #20] 8005a1a: +-----|--|--|-- e7f4 b.n 8005a06 <etharp_tmr+0x26> return etharp_request_dst(netif, ipaddr, ðbroadcast); 8005a1c: | \--|--|-> 4a05 ldr r2, [pc, #20] @ (8005a34 ) 8005a1e: | | | 68a0 ldr r0, [r4, #8] 8005a20: | | | 1d21 adds r1, r4, #4 8005a22: | | | f7ff ffcb bl 80059bc <etharp_request_dst> 8005a26: +--------|--|-- e7ee b.n 8005a06 <etharp_tmr+0x26> } else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_2) { 8005a28: | | \-> 2a04 cmp r2, #4 8005a2a: \--------|----- d1ec bne.n 8005a06 <etharp_tmr+0x26> arp_table[i].state = ETHARP_STATE_STABLE; 8005a2c: | 2302 movs r3, #2 8005a2e: \----- e7f3 b.n 8005a18 <etharp_tmr+0x38> 8005a30: 200012b0 .word 0x200012b0 8005a34: 0800d361 .word 0x0800d361 08005a38 : { 8005a38: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr} LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE", 8005a3c: 4e23 ldr r6, [pc, #140] @ (8005acc ) 8005a3e: 2318 movs r3, #24 8005a40: fb03 6302 mla r3, r3, r2, r6 { 8005a44: 4605 mov r5, r0 LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE", 8005a46: f893 316c ldrb.w r3, [r3, #364] @ 0x16c 8005a4a: 2b01 cmp r3, #1 { 8005a4c: 4688 mov r8, r1 8005a4e: 4617 mov r7, r2 LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE", 8005a50: /-- d80c bhi.n 8005a6c <etharp_output_to_arp_index+0x34> 8005a52: | b672 cpsid i 8005a54: | 4b1e ldr r3, [pc, #120] @ (8005ad0 ) 8005a56: | 4a1f ldr r2, [pc, #124] @ (8005ad4 ) 8005a58: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8005a5c: | 4b1e ldr r3, [pc, #120] @ (8005ad8 ) 8005a5e: | 9300 str r3, [sp, #0] 8005a60: | 481e ldr r0, [pc, #120] @ (8005adc ) 8005a62: | f240 23ef movw r3, #751 @ 0x2ef 8005a66: | f7fb fc47 bl 80012f8 <printf_> 8005a6a: | be00 bkpt 0x0000 if (arp_table[arp_idx].state == ETHARP_STATE_STABLE) { 8005a6c: \-> 2318 movs r3, #24 8005a6e: fb03 6607 mla r6, r3, r7, r6 8005a72: eb07 0447 add.w r4, r7, r7, lsl #1 8005a76: f896 316c ldrb.w r3, [r6, #364] @ 0x16c if (etharp_request_dst(netif, &arp_table[arp_idx].ipaddr, &arp_table[arp_idx].ethaddr) == ERR_OK) { 8005a7a: 4919 ldr r1, [pc, #100] @ (8005ae0 ) 8005a7c: 00e4 lsls r4, r4, #3 8005a7e: f104 090c add.w r9, r4, #12 if (arp_table[arp_idx].state == ETHARP_STATE_STABLE) { 8005a82: 2b02 cmp r3, #2 if (etharp_request_dst(netif, &arp_table[arp_idx].ipaddr, &arp_table[arp_idx].ethaddr) == ERR_OK) { 8005a84: 4489 add r9, r1 if (arp_table[arp_idx].state == ETHARP_STATE_STABLE) { 8005a86: /-------- d10e bne.n 8005aa6 <etharp_output_to_arp_index+0x6e> if (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED_BROADCAST) { 8005a88: | f8b6 316a ldrh.w r3, [r6, #362] @ 0x16a 8005a8c: | f5b3 7f8e cmp.w r3, #284 @ 0x11c 8005a90: | /-- d916 bls.n 8005ac0 <etharp_output_to_arp_index+0x88> return etharp_request_dst(netif, ipaddr, ðbroadcast); 8005a92: | | 4a14 ldr r2, [pc, #80] @ (8005ae4 ) if (etharp_request(netif, &arp_table[arp_idx].ipaddr) == ERR_OK) { 8005a94: | | 3404 adds r4, #4 if (etharp_request_dst(netif, &arp_table[arp_idx].ipaddr, &arp_table[arp_idx].ethaddr) == ERR_OK) { 8005a96: | /--|-> 4421 add r1, r4 8005a98: | | | 4628 mov r0, r5 8005a9a: | | | f7ff ff8f bl 80059bc <etharp_request_dst> 8005a9e: +--|--|-- b910 cbnz r0, 8005aa6 <etharp_output_to_arp_index+0x6e> arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING_1; 8005aa0: | | | 2303 movs r3, #3 8005aa2: | | | f886 316c strb.w r3, [r6, #364] @ 0x16c return ethernet_output(netif, q, (struct eth_addr *)(netif->hwaddr), &arp_table[arp_idx].ethaddr, ETHTYPE_IP); 8005aa6: >--|--|-> f44f 6300 mov.w r3, #2048 @ 0x800 8005aaa: | | | 9300 str r3, [sp, #0] 8005aac: | | | f105 022e add.w r2, r5, #46 @ 0x2e 8005ab0: | | | 464b mov r3, r9 8005ab2: | | | 4641 mov r1, r8 8005ab4: | | | 4628 mov r0, r5 8005ab6: | | | f002 faf3 bl 80080a0 <ethernet_output> } 8005aba: | | | b003 add sp, #12 8005abc: | | | e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} } else if (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED_UNICAST) { 8005ac0: | | \-> f5b3 7f87 cmp.w r3, #270 @ 0x10e 8005ac4: \--|----- d3ef bcc.n 8005aa6 <etharp_output_to_arp_index+0x6e> if (etharp_request_dst(netif, &arp_table[arp_idx].ipaddr, &arp_table[arp_idx].ethaddr) == ERR_OK) { 8005ac6: | 3404 adds r4, #4 8005ac8: | 464a mov r2, r9 8005aca: \----- e7e4 b.n 8005a96 <etharp_output_to_arp_index+0x5e> 8005acc: 20001158 .word 0x20001158 8005ad0: 20000060 .word 0x20000060 8005ad4: 0800c431 .word 0x0800c431 8005ad8: 0800c3a3 .word 0x0800c3a3 8005adc: 0800b232 .word 0x0800b232 8005ae0: 200012b0 .word 0x200012b0 8005ae4: 0800d361 .word 0x0800d361 08005ae8 : { 8005ae8: e92d 47ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, lr} 8005aec: 460d mov r5, r1 8005aee: 4690 mov r8, r2 LWIP_ASSERT("netif != NULL", netif != NULL); 8005af0: 4606 mov r6, r0 8005af2: /-- b960 cbnz r0, 8005b0e <etharp_output+0x26> 8005af4: | b672 cpsid i 8005af6: | 4ba1 ldr r3, [pc, #644] @ (8005d7c ) 8005af8: | 4aa1 ldr r2, [pc, #644] @ (8005d80 ) 8005afa: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8005afe: | 4ba1 ldr r3, [pc, #644] @ (8005d84 ) 8005b00: | 9300 str r3, [sp, #0] 8005b02: | 48a1 ldr r0, [pc, #644] @ (8005d88 ) 8005b04: | f240 331f movw r3, #799 @ 0x31f 8005b08: | f7fb fbf6 bl 80012f8 <printf_> 8005b0c: | be00 bkpt 0x0000 LWIP_ASSERT("q != NULL", q != NULL); 8005b0e: /--\-X b965 cbnz r5, 8005b2a <etharp_output+0x42> 8005b10: | b672 cpsid i 8005b12: | 4b9a ldr r3, [pc, #616] @ (8005d7c ) 8005b14: | 4a9d ldr r2, [pc, #628] @ (8005d8c ) 8005b16: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8005b1a: | 4b9a ldr r3, [pc, #616] @ (8005d84 ) 8005b1c: | 9300 str r3, [sp, #0] 8005b1e: | 489a ldr r0, [pc, #616] @ (8005d88 ) 8005b20: | f44f 7348 mov.w r3, #800 @ 0x320 8005b24: | f7fb fbe8 bl 80012f8 <printf_> 8005b28: | be00 bkpt 0x0000 LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL); 8005b2a: \----> f1b8 0f00 cmp.w r8, #0 8005b2e: /-- d10c bne.n 8005b4a <etharp_output+0x62> 8005b30: | b672 cpsid i 8005b32: | 4b92 ldr r3, [pc, #584] @ (8005d7c ) 8005b34: | 4a96 ldr r2, [pc, #600] @ (8005d90 ) 8005b36: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8005b3a: | 4b92 ldr r3, [pc, #584] @ (8005d84 ) 8005b3c: | 9300 str r3, [sp, #0] 8005b3e: | 4892 ldr r0, [pc, #584] @ (8005d88 ) 8005b40: | f240 3321 movw r3, #801 @ 0x321 8005b44: | f7fb fbd8 bl 80012f8 <printf_> 8005b48: | be00 bkpt 0x0000 if (ip4_addr_isbroadcast(ipaddr, netif)) { 8005b4a: \-> f8d8 4000 ldr.w r4, [r8] 8005b4e: 4631 mov r1, r6 8005b50: 4620 mov r0, r4 8005b52: f002 fa7d bl 8008050 <ip4_addr_isbroadcast_u32> 8005b56: 2800 cmp r0, #0 8005b58: /-------------------------------- f040 80f4 bne.w 8005d44 <etharp_output+0x25c> } else if (ip4_addr_ismulticast(ipaddr)) { 8005b5c: | f004 03f0 and.w r3, r4, #240 @ 0xf0 8005b60: | 2be0 cmp r3, #224 @ 0xe0 8005b62: | /-- d118 bne.n 8005b96 <etharp_output+0xae> mcastaddr.addr[0] = LL_IP4_MULTICAST_ADDR_0; 8005b64: | | 2301 movs r3, #1 8005b66: | | f8ad 3008 strh.w r3, [sp, #8] mcastaddr.addr[2] = LL_IP4_MULTICAST_ADDR_2; 8005b6a: | | 235e movs r3, #94 @ 0x5e 8005b6c: | | f88d 300a strb.w r3, [sp, #10] mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f; 8005b70: | | f898 3001 ldrb.w r3, [r8, #1] 8005b74: | | f003 037f and.w r3, r3, #127 @ 0x7f 8005b78: | | f88d 300b strb.w r3, [sp, #11] mcastaddr.addr[4] = ip4_addr3(ipaddr); 8005b7c: | | f898 3002 ldrb.w r3, [r8, #2] 8005b80: | | f88d 300c strb.w r3, [sp, #12] mcastaddr.addr[5] = ip4_addr4(ipaddr); 8005b84: | | f898 3003 ldrb.w r3, [r8, #3] 8005b88: | | f88d 300d strb.w r3, [sp, #13] dest = &mcastaddr; 8005b8c: | | ab02 add r3, sp, #8 return ethernet_output(netif, q, (struct eth_addr *)(netif->hwaddr), dest, ETHTYPE_IP); 8005b8e: | /--------------------------|-> f44f 6200 mov.w r2, #2048 @ 0x800 8005b92: | | | 9200 str r2, [sp, #0] 8005b94: | | /--------|-- e09c b.n 8005cd0 <etharp_output+0x1e8> if (!ip4_addr_net_eq(ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif)) && 8005b96: | | | \-> 6833 ldr r3, [r6, #0] 8005b98: | | | 6872 ldr r2, [r6, #4] 8005b9a: | | | 4063 eors r3, r4 8005b9c: | | | 4213 tst r3, r2 8005b9e: | | | /-- d00a beq.n 8005bb6 <etharp_output+0xce> !ip4_addr_islinklocal(ipaddr)) { 8005ba0: | | | | b2a4 uxth r4, r4 if (!ip4_addr_net_eq(ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif)) && 8005ba2: | | | | f64f 63a9 movw r3, #65193 @ 0xfea9 8005ba6: | | | | 429c cmp r4, r3 8005ba8: | | | +-- d005 beq.n 8005bb6 <etharp_output+0xce> if (!ip4_addr_isany_val(*netif_ip4_gw(netif))) { 8005baa: | | | | 68b3 ldr r3, [r6, #8] 8005bac: | | | | 2b00 cmp r3, #0 8005bae: | | /--------------|--------|-- f000 80cb beq.w 8005d48 <etharp_output+0x260> dst_addr = netif_ip4_gw(netif); 8005bb2: | | | | | f106 0808 add.w r8, r6, #8 if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) && 8005bb6: | | | | \-> 4f77 ldr r7, [pc, #476] @ (8005d94 ) (ip4_addr_eq(dst_addr, &arp_table[etharp_cached_entry].ipaddr))) { 8005bb8: | | | | f8d8 4000 ldr.w r4, [r8] if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) && 8005bbc: | | | | f897 2248 ldrb.w r2, [r7, #584] @ 0x248 8005bc0: | | | | 2318 movs r3, #24 8005bc2: | | | | fb03 7302 mla r3, r3, r2, r7 8005bc6: | | | | f893 116c ldrb.w r1, [r3, #364] @ 0x16c 8005bca: | | | | 2901 cmp r1, #1 8005bcc: | | | | /-- d90e bls.n 8005bec <etharp_output+0x104> 8005bce: | | | | | f8d3 315c ldr.w r3, [r3, #348] @ 0x15c 8005bd2: | | | | | 42a3 cmp r3, r4 8005bd4: | | | | +-- d10a bne.n 8005bec <etharp_output+0x104> ETHARP_STATS_INC(etharp.cachehit); 8005bd6: | | | | | f837 3c26 ldrh.w r3, [r7, #-38] 8005bda: | | | | | 3301 adds r3, #1 8005bdc: | | | | | f827 3c26 strh.w r3, [r7, #-38] return etharp_output_to_arp_index(netif, q, i); 8005be0: | | | | /-----|-> 4629 mov r1, r5 8005be2: | | | | | | 4630 mov r0, r6 } 8005be4: | | | | | | b004 add sp, #16 8005be6: | | | | | | e8bd 47f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, lr} return etharp_output_to_arp_index(netif, q, i); 8005bea: | | | | | | e725 b.n 8005a38 <etharp_output_to_arp_index> 8005bec: | | | | | \-> 4b6a ldr r3, [pc, #424] @ (8005d98 ) { 8005bee: | | | | | 2200 movs r2, #0 8005bf0: | | | | | 4699 mov r9, r3 if ((arp_table[i].state >= ETHARP_STATE_STABLE) && 8005bf2: | | | | | /----> 7d19 ldrb r1, [r3, #20] 8005bf4: | | | | | | 2901 cmp r1, #1 8005bf6: | | | | | | /-- d906 bls.n 8005c06 <etharp_output+0x11e> 8005bf8: | | | | | | | 6859 ldr r1, [r3, #4] 8005bfa: | | | | | | | 42a1 cmp r1, r4 8005bfc: | | | | | | +-- d103 bne.n 8005c06 <etharp_output+0x11e> 8005bfe: | | | | | | | b2d2 uxtb r2, r2 ETHARP_SET_ADDRHINT(netif, i); 8005c00: | | | | | | | f887 2248 strb.w r2, [r7, #584] @ 0x248 8005c04: | | | | \--|--|-- e7ec b.n 8005be0 <etharp_output+0xf8> for (i = 0; i < ARP_TABLE_SIZE; i++) { 8005c06: | | | | | \-> 3201 adds r2, #1 8005c08: | | | | | 2a0a cmp r2, #10 8005c0a: | | | | | f103 0318 add.w r3, r3, #24 8005c0e: | | | | \----- d1f0 bne.n 8005bf2 <etharp_output+0x10a> if (ip4_addr_isbroadcast(ipaddr, netif) || 8005c10: | | | | 4631 mov r1, r6 8005c12: | | | | 4620 mov r0, r4 8005c14: | | | | f002 fa1c bl 8008050 <ip4_addr_isbroadcast_u32> 8005c18: | | | | 2800 cmp r0, #0 8005c1a: | | | /-----------|----------- f040 8098 bne.w 8005d4e <etharp_output+0x266> ip4_addr_ismulticast(ipaddr) || 8005c1e: | | | | | f004 03f0 and.w r3, r4, #240 @ 0xf0 if (ip4_addr_isbroadcast(ipaddr, netif) || 8005c22: | | | | | 2be0 cmp r3, #224 @ 0xe0 8005c24: | | | +-----------|----------- f000 8093 beq.w 8005d4e <etharp_output+0x266> ip4_addr_isany(ipaddr)) { 8005c28: | | | | | 2c00 cmp r4, #0 8005c2a: | | | +-----------|----------- f000 8090 beq.w 8005d4e <etharp_output+0x266> i_err = etharp_find_entry(ipaddr, ETHARP_FLAG_TRY_HARD, netif); 8005c2e: | | | | | 2101 movs r1, #1 8005c30: | | | | | 4640 mov r0, r8 8005c32: | | | | | f003 fea1 bl 8009978 <etharp_find_entry.isra.0> if (i_err < 0) { 8005c36: | | | | | 1e04 subs r4, r0, #0 8005c38: | | | | | /----- da09 bge.n 8005c4e <etharp_output+0x166> if (q) { 8005c3a: | | | | | | /-- b125 cbz r5, 8005c46 <etharp_output+0x15e> ETHARP_STATS_INC(etharp.memerr); 8005c3c: | | | | | | | f837 3c30 ldrh.w r3, [r7, #-48] 8005c40: | | | | | | | 3301 adds r3, #1 8005c42: | | | | | | | f827 3c30 strh.w r3, [r7, #-48] return (err_t)i_err; 8005c46: | | | | | | \-> b260 sxtb r0, r4 } 8005c48: | | | | /--------|-----|----> b004 add sp, #16 8005c4a: | | | | | | | e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} LWIP_ASSERT("type overflow", (size_t)i_err < NETIF_ADDR_IDX_MAX); 8005c4e: | | | | | | \----> b2a3 uxth r3, r4 8005c50: | | | | | | 2b7e cmp r3, #126 @ 0x7e 8005c52: | | | | | | /-- d90c bls.n 8005c6e <etharp_output+0x186> 8005c54: | | | | | | | b672 cpsid i 8005c56: | | | | | | | 4b49 ldr r3, [pc, #292] @ (8005d7c ) 8005c58: | | | | | | | 4a50 ldr r2, [pc, #320] @ (8005d9c ) 8005c5a: | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8005c5e: | | | | | | | 4b49 ldr r3, [pc, #292] @ (8005d84 ) 8005c60: | | | | | | | 9300 str r3, [sp, #0] 8005c62: | | | | | | | 4849 ldr r0, [pc, #292] @ (8005d88 ) 8005c64: | | | | | | | f240 33c2 movw r3, #962 @ 0x3c2 8005c68: | | | | | | | f7fb fb46 bl 80012f8 <printf_> 8005c6c: | | | | | | | be00 bkpt 0x0000 i = (netif_addr_idx_t)i_err; 8005c6e: | | | | | | \-> b2e4 uxtb r4, r4 if (arp_table[i].state == ETHARP_STATE_EMPTY) { 8005c70: | | | | | | 2318 movs r3, #24 8005c72: | | | | | | fb03 7304 mla r3, r3, r4, r7 8005c76: | | | | | | f893 216c ldrb.w r2, [r3, #364] @ 0x16c 8005c7a: | | | | | | 2a00 cmp r2, #0 8005c7c: | | | | | /-----|----------- d16a bne.n 8005d54 <etharp_output+0x26c> arp_table[i].state = ETHARP_STATE_PENDING; 8005c7e: | | | | | | | f04f 0a01 mov.w sl, #1 8005c82: | | | | | | | f883 a16c strb.w sl, [r3, #364] @ 0x16c arp_table[i].netif = netif; 8005c86: | | | | | | | f8c3 6160 str.w r6, [r3, #352] @ 0x160 return etharp_request_dst(netif, ipaddr, ðbroadcast); 8005c8a: | | | | | | | /----> 4a45 ldr r2, [pc, #276] @ (8005da0 ) 8005c8c: | | | | | | | | 4641 mov r1, r8 8005c8e: | | | | | | | | 4630 mov r0, r6 8005c90: | | | | | | | | f7ff fe94 bl 80059bc <etharp_request_dst> if (result != ERR_OK) { 8005c94: | | | | | | | | /-- b958 cbnz r0, 8005cae <etharp_output+0x1c6> if ((arp_table[i].state == ETHARP_STATE_PENDING) && !is_new_entry) { 8005c96: | | | | | | | | | 2318 movs r3, #24 8005c98: | | | | | | | | | fb03 7304 mla r3, r3, r4, r7 8005c9c: | | | | | | | | | f893 216c ldrb.w r2, [r3, #364] @ 0x16c 8005ca0: | | | | | | | | | 2a01 cmp r2, #1 8005ca2: | | | | | | | | +-- d104 bne.n 8005cae <etharp_output+0x1c6> 8005ca4: | | | | | | | | | f1ba 0f00 cmp.w sl, #0 8005ca8: | | | | | | | | +-- d101 bne.n 8005cae <etharp_output+0x1c6> arp_table[i].ctime = 0; 8005caa: | | | | | | | | | f8a3 016a strh.w r0, [r3, #362] @ 0x16a if (q == NULL) { 8005cae: | | | | | | | | \-> 2d00 cmp r5, #0 8005cb0: | | | | +--|-----|-----|----- d0ca beq.n 8005c48 <etharp_output+0x160> if (arp_table[i].state >= ETHARP_STATE_STABLE) { 8005cb2: | | | | | | /--|-----|----> 2318 movs r3, #24 8005cb4: | | | | | | | | | fb03 7204 mla r2, r3, r4, r7 8005cb8: | | | | | | | | | f892 216c ldrb.w r2, [r2, #364] @ 0x16c 8005cbc: | | | | | | | | | 2a01 cmp r2, #1 8005cbe: | | | | | | | | | /-- d910 bls.n 8005ce2 <etharp_output+0x1fa> result = ethernet_output(netif, q, srcaddr, &(arp_table[i].ethaddr), ETHTYPE_IP); 8005cc0: | | | | | | | | | | fb03 9304 mla r3, r3, r4, r9 8005cc4: | | | | | | | | | | f44f 6200 mov.w r2, #2048 @ 0x800 ETHARP_SET_ADDRHINT(netif, i); 8005cc8: | | | | | | | | | | f887 4248 strb.w r4, [r7, #584] @ 0x248 result = ethernet_output(netif, q, srcaddr, &(arp_table[i].ethaddr), ETHTYPE_IP); 8005ccc: | | | | | | | | | | 330c adds r3, #12 8005cce: | | | | | | | | | | 9200 str r2, [sp, #0] return ethernet_output(netif, q, (struct eth_addr *)(netif->hwaddr), dest, ETHTYPE_IP); 8005cd0: | | | | | | | \-----|--|-> f106 022e add.w r2, r6, #46 @ 0x2e 8005cd4: | | | | | | | | | 4629 mov r1, r5 8005cd6: | | | | | | | | | 4630 mov r0, r6 8005cd8: | | | | | | | | | f002 f9e2 bl 80080a0 <ethernet_output> 8005cdc: | | | | +--|--|--------|--|-- e7b4 b.n 8005c48 <etharp_output+0x160> int is_new_entry = 0; 8005cde: | | | | | | | /-----|--|-> 46aa mov sl, r5 8005ce0: | | | | | | | | \--|-- e7d3 b.n 8005c8a <etharp_output+0x1a2> } else if (arp_table[i].state == ETHARP_STATE_PENDING) { 8005ce2: | | | | +--|--|--|--------\-X d1b1 bne.n 8005c48 <etharp_output+0x160> 8005ce4: | | | | | | | | f8df 8094 ldr.w r8, [pc, #148] @ 8005d7c LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == NULL)); 8005ce8: | | | | | | | | f8df 9098 ldr.w r9, [pc, #152] @ 8005d84 8005cec: | | | | | | | | f8df a0b4 ldr.w sl, [pc, #180] @ 8005da4 p = q; 8005cf0: | | | | | | | | 462e mov r6, r5 LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == NULL)); 8005cf2: | | | | | | | | /----> 8972 ldrh r2, [r6, #10] 8005cf4: | | | | | | | | | 8933 ldrh r3, [r6, #8] 8005cf6: | | | | | | | | | 429a cmp r2, r3 8005cf8: | | | | | | | | | /-- d10d bne.n 8005d16 <etharp_output+0x22e> 8005cfa: | | | | | | | | | | 6833 ldr r3, [r6, #0] 8005cfc: | | | | | | | | | +-- b15b cbz r3, 8005d16 <etharp_output+0x22e> 8005cfe: | | | | | | | | | | b672 cpsid i 8005d00: | | | | | | | | | | f240 33fa movw r3, #1018 @ 0x3fa 8005d04: | | | | | | | | | | f8d8 12fc ldr.w r1, [r8, #764] @ 0x2fc 8005d08: | | | | | | | | | | 481f ldr r0, [pc, #124] @ (8005d88 ) 8005d0a: | | | | | | | | | | f8cd 9000 str.w r9, [sp] 8005d0e: | | | | | | | | | | 4652 mov r2, sl 8005d10: | | | | | | | | | | f7fb faf2 bl 80012f8 <printf_> 8005d14: | | | | | | | | | | be00 bkpt 0x0000 if (PBUF_NEEDS_COPY(p)) { 8005d16: | | | | | | | | | \-> 7b33 ldrb r3, [r6, #12] 8005d18: | | | | | | | | | 065b lsls r3, r3, #25 8005d1a: | | | | | | | | /--|----- d420 bmi.n 8005d5e <etharp_output+0x276> p = p->next; 8005d1c: | | | | | | | | | | 6836 ldr r6, [r6, #0] while (p) { 8005d1e: | | | | | | | | | | 2e00 cmp r6, #0 8005d20: | | | | | | | | | \----- d1e7 bne.n 8005cf2 <etharp_output+0x20a> pbuf_ref(p); 8005d22: | | | | | | | | | 4628 mov r0, r5 8005d24: | | | | | | | | | f7fc fc86 bl 8002634 <pbuf_ref> if (arp_table[i].q != NULL) { 8005d28: | | | | | | | | | /----> 2618 movs r6, #24 8005d2a: | | | | | | | | | | fb06 7304 mla r3, r6, r4, r7 8005d2e: | | | | | | | | | | f8d3 0158 ldr.w r0, [r3, #344] @ 0x158 8005d32: | | | | | | | | | | /-- b108 cbz r0, 8005d38 <etharp_output+0x250> pbuf_free(arp_table[i].q); 8005d34: | | | | | | | | | | | f004 f842 bl 8009dbc <pbuf_free.isra.0> arp_table[i].q = p; 8005d38: | | | | | | | | | | \-> fb06 7604 mla r6, r6, r4, r7 result = ERR_OK; 8005d3c: | | | | | | | | | | 2000 movs r0, #0 arp_table[i].q = p; 8005d3e: | | | | | | | | | | f8c6 5158 str.w r5, [r6, #344] @ 0x158 LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"U16_F"\n", (void *)q, (u16_t)i)); 8005d42: | | | | +--|--|--|--|--|----- e781 b.n 8005c48 <etharp_output+0x160> dest = (const struct eth_addr *)ðbroadcast; 8005d44: \--|--|--|--|--|--|--|--|--|----> 4b16 ldr r3, [pc, #88] @ (8005da0 ) 8005d46: \--|--|--|--|--|--|--|--|----- e722 b.n 8005b8e <etharp_output+0xa6> return ERR_RTE; 8005d48: \--|--|--|--|--|--|--|----> f06f 0003 mvn.w r0, #3 8005d4c: | +--|--|--|--|--|----- e77c b.n 8005c48 <etharp_output+0x160> return ERR_ARG; 8005d4e: \--|--|--|--|--|--|----> f06f 000f mvn.w r0, #15 8005d52: +--|--|--|--|--|----- e779 b.n 8005c48 <etharp_output+0x160> if (is_new_entry || (q == NULL)) { 8005d54: | \--|--|--|--|----> 2d00 cmp r5, #0 8005d56: | | \--|--|----- d0c2 beq.n 8005cde <etharp_output+0x1f6> err_t result = ERR_MEM; 8005d58: | | | | f04f 30ff mov.w r0, #4294967295 @ 0xffffffff 8005d5c: | \-----|--|----- e7a9 b.n 8005cb2 <etharp_output+0x1ca> p = pbuf_clone(PBUF_LINK, PBUF_RAM, q); 8005d5e: | \--|----> 4629 mov r1, r5 8005d60: | | 200e movs r0, #14 8005d62: | | f003 fb43 bl 80093ec <pbuf_clone.constprop.0> if (p != NULL) { 8005d66: | | 4605 mov r5, r0 8005d68: | | 2800 cmp r0, #0 8005d6a: | \----- d1dd bne.n 8005d28 <etharp_output+0x240> ETHARP_STATS_INC(etharp.memerr); 8005d6c: | f837 3c30 ldrh.w r3, [r7, #-48] 8005d70: | 3301 adds r3, #1 8005d72: | f827 3c30 strh.w r3, [r7, #-48] result = ERR_MEM; 8005d76: | f04f 30ff mov.w r0, #4294967295 @ 0xffffffff 8005d7a: \-------------------- e765 b.n 8005c48 <etharp_output+0x160> 8005d7c: 20000060 .word 0x20000060 8005d80: 0800c141 .word 0x0800c141 8005d84: 0800c3a3 .word 0x0800c3a3 8005d88: 0800b232 .word 0x0800b232 8005d8c: 0800b3aa .word 0x0800b3aa 8005d90: 0800c461 .word 0x0800c461 8005d94: 20001158 .word 0x20001158 8005d98: 200012b0 .word 0x200012b0 8005d9c: 0800c470 .word 0x0800c470 8005da0: 0800d361 .word 0x0800d361 8005da4: 0800c47e .word 0x0800c47e 08005da8 : if ((netif_default == NULL) || !netif_is_up(netif_default) || !netif_is_link_up(netif_default) || 8005da8: 4b0a ldr r3, [pc, #40] @ (8005dd4 ) { 8005daa: 4602 mov r2, r0 if ((netif_default == NULL) || !netif_is_up(netif_default) || !netif_is_link_up(netif_default) || 8005dac: f8d3 010c ldr.w r0, [r3, #268] @ 0x10c 8005db0: /----- b150 cbz r0, 8005dc8 <ip4_route+0x20> 8005db2: | f890 1035 ldrb.w r1, [r0, #53] @ 0x35 8005db6: | f001 0105 and.w r1, r1, #5 8005dba: | 2905 cmp r1, #5 8005dbc: +----- d104 bne.n 8005dc8 <ip4_route+0x20> 8005dbe: | 6801 ldr r1, [r0, #0] 8005dc0: +----- b111 cbz r1, 8005dc8 <ip4_route+0x20> ip4_addr_isany_val(*netif_ip4_addr(netif_default)) || ip4_addr_isloopback(dest)) { 8005dc2: | 7812 ldrb r2, [r2, #0] 8005dc4: | 2a7f cmp r2, #127 @ 0x7f 8005dc6: | /-- d103 bne.n 8005dd0 <ip4_route+0x28> IP_STATS_INC(ip.rterr); 8005dc8: \--|-> 885a ldrh r2, [r3, #2] 8005dca: | 3201 adds r2, #1 8005dcc: | 805a strh r2, [r3, #2] 8005dce: | 2000 movs r0, #0 } 8005dd0: \-> 4770 bx lr 8005dd2: bf00 nop 8005dd4: 20001158 .word 0x20001158 08005dd8 : * @param type Type of the ICMP header * @param code Code of the ICMP header */ static void icmp_send_response(struct pbuf *p, u8_t type, u8_t code) { 8005dd8: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} /* increase number of messages attempted to send */ MIB2_STATS_INC(mib2.icmpoutmsgs); /* Keep IP header + up to 8 bytes */ response_pkt_len = IP_HLEN + ICMP_DEST_UNREACH_DATASIZE; if (p->tot_len < response_pkt_len) { 8005ddc: f8b0 8008 ldrh.w r8, [r0, #8] 8005de0: f1b8 0f1c cmp.w r8, #28 8005de4: bf28 it cs 8005de6: f04f 081c movcs.w r8, #28 response_pkt_len = p->tot_len; } /* ICMP header + part of original packet */ q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_hdr) + response_pkt_len, PBUF_RAM); 8005dea: f108 0408 add.w r4, r8, #8 8005dee: b2a4 uxth r4, r4 { 8005df0: b086 sub sp, #24 8005df2: 4607 mov r7, r0 8005df4: 4689 mov r9, r1 q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_hdr) + response_pkt_len, PBUF_RAM); 8005df6: 2022 movs r0, #34 @ 0x22 8005df8: 4621 mov r1, r4 { 8005dfa: 4616 mov r6, r2 q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_hdr) + response_pkt_len, PBUF_RAM); 8005dfc: f003 fa3c bl 8009278 <pbuf_alloc.constprop.0> if (q == NULL) { 8005e00: 4605 mov r5, r0 8005e02: 2800 cmp r0, #0 8005e04: /----- d041 beq.n 8005e8a <icmp_send_response+0xb2> LWIP_DEBUGF(ICMP_DEBUG, ("icmp_send_response: failed to allocate pbuf for ICMP packet.\n")); MIB2_STATS_INC(mib2.icmpouterrors); return; } LWIP_ASSERT("check that first pbuf can hold icmp message", 8005e06: | 8943 ldrh r3, [r0, #10] 8005e08: | 42a3 cmp r3, r4 8005e0a: | /-- d20c bcs.n 8005e26 <icmp_send_response+0x4e> 8005e0c: | | b672 cpsid i 8005e0e: | | 4b20 ldr r3, [pc, #128] @ (8005e90 ) 8005e10: | | 4a20 ldr r2, [pc, #128] @ (8005e94 ) 8005e12: | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8005e16: | | 4b20 ldr r3, [pc, #128] @ (8005e98 ) 8005e18: | | 9300 str r3, [sp, #0] 8005e1a: | | 4820 ldr r0, [pc, #128] @ (8005e9c ) 8005e1c: | | f240 136d movw r3, #365 @ 0x16d 8005e20: | | f7fb fa6a bl 80012f8 <printf_> 8005e24: | | be00 bkpt 0x0000 ip4_addr_debug_print_val(ICMP_DEBUG, iphdr->src); LWIP_DEBUGF(ICMP_DEBUG, (" to ")); ip4_addr_debug_print_val(ICMP_DEBUG, iphdr->dest); LWIP_DEBUGF(ICMP_DEBUG, ("\n")); icmphdr = (struct icmp_hdr *)q->payload; 8005e26: | \-> 686c ldr r4, [r5, #4] iphdr = (struct ip_hdr *)p->payload; 8005e28: | f8d7 a004 ldr.w sl, [r7, #4] icmphdr->type = type; icmphdr->code = code; 8005e2c: | 7066 strb r6, [r4, #1] icmphdr->data = 0; 8005e2e: | 2600 movs r6, #0 /* copy fields from original packet */ pbuf_copy_partial_pbuf(q, p, response_pkt_len, sizeof(struct icmp_hdr)); 8005e30: | 4639 mov r1, r7 8005e32: | 2308 movs r3, #8 8005e34: | 4642 mov r2, r8 icmphdr->type = type; 8005e36: | f884 9000 strb.w r9, [r4] icmphdr->data = 0; 8005e3a: | 7126 strb r6, [r4, #4] 8005e3c: | 7166 strb r6, [r4, #5] 8005e3e: | 71a6 strb r6, [r4, #6] 8005e40: | 71e6 strb r6, [r4, #7] pbuf_copy_partial_pbuf(q, p, response_pkt_len, sizeof(struct icmp_hdr)); 8005e42: | 4628 mov r0, r5 8005e44: | f7fb fdda bl 80019fc <pbuf_copy_partial_pbuf> ip4_addr_copy(iphdr_src, iphdr->src); 8005e48: | f8da 300c ldr.w r3, [sl, #12] 8005e4c: | 9305 str r3, [sp, #20] ip4_addr_t iphdr_dst; ip4_addr_copy(iphdr_dst, iphdr->dest); netif = ip4_route_src(&iphdr_dst, &iphdr_src); } #else netif = ip4_route(&iphdr_src); 8005e4e: | a805 add r0, sp, #20 8005e50: | f7ff ffaa bl 8005da8 <ip4_route> #endif if (netif != NULL) { 8005e54: | 4607 mov r7, r0 8005e56: | /-- b1a8 cbz r0, 8005e84 <icmp_send_response+0xac> */ u16_t inet_chksum(const void *dataptr, u16_t len) { return (u16_t)~(unsigned int)LWIP_CHKSUM(dataptr, len); 8005e58: | | 8969 ldrh r1, [r5, #10] /* calculate checksum */ icmphdr->chksum = 0; 8005e5a: | | 70a6 strb r6, [r4, #2] 8005e5c: | | 70e6 strb r6, [r4, #3] 8005e5e: | | 4620 mov r0, r4 8005e60: | | f002 f96a bl 8008138 <lwip_standard_chksum> #if CHECKSUM_GEN_ICMP IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP) { icmphdr->chksum = inet_chksum(icmphdr, q->len); } #endif ICMP_STATS_INC(icmp.xmit); 8005e64: | | 4a0e ldr r2, [pc, #56] @ (8005ea0 ) 8005e66: | | 8993 ldrh r3, [r2, #12] 8005e68: | | 43c0 mvns r0, r0 8005e6a: | | 3301 adds r3, #1 icmphdr->chksum = inet_chksum(icmphdr, q->len); 8005e6c: | | 8060 strh r0, [r4, #2] ICMP_STATS_INC(icmp.xmit); 8005e6e: | | 8193 strh r3, [r2, #12] return ip4_output_if_src(p, src_used, dest, ttl, tos, proto, netif); 8005e70: | | 2301 movs r3, #1 8005e72: | | e9cd 6300 strd r6, r3, [sp] 8005e76: | | 9702 str r7, [sp, #8] 8005e78: | | 23ff movs r3, #255 @ 0xff 8005e7a: | | aa05 add r2, sp, #20 8005e7c: | | 4639 mov r1, r7 8005e7e: | | 4628 mov r0, r5 8005e80: | | f004 f85a bl 8009f38 <ip4_output_if_src> ip4_output_if(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP, netif); } pbuf_free(q); 8005e84: | \-> 4628 mov r0, r5 8005e86: | f003 ff99 bl 8009dbc <pbuf_free.isra.0> } 8005e8a: \----> b006 add sp, #24 8005e8c: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} 8005e90: 20000060 .word 0x20000060 8005e94: 0800c498 .word 0x0800c498 8005e98: 0800c4c4 .word 0x0800c4c4 8005e9c: 0800b232 .word 0x0800b232 8005ea0: 20001158 .word 0x20001158 08005ea4 : LWIP_ASSERT("prev != ipr", prev != ipr); 8005ea4: 4281 cmp r1, r0 { 8005ea6: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr} 8005eaa: 4604 mov r4, r0 8005eac: 460e mov r6, r1 LWIP_ASSERT("prev != ipr", prev != ipr); 8005eae: /-- d10b bne.n 8005ec8 <ip_reass_free_complete_datagram+0x24> 8005eb0: | b672 cpsid i 8005eb2: | 4b3d ldr r3, [pc, #244] @ (8005fa8 ) 8005eb4: | 4a3d ldr r2, [pc, #244] @ (8005fac ) 8005eb6: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8005eba: | 4b3d ldr r3, [pc, #244] @ (8005fb0 ) 8005ebc: | 9300 str r3, [sp, #0] 8005ebe: | 483d ldr r0, [pc, #244] @ (8005fb4 ) 8005ec0: | 23ab movs r3, #171 @ 0xab 8005ec2: | f7fb fa19 bl 80012f8 <printf_> 8005ec6: | be00 bkpt 0x0000 if (prev != NULL) { 8005ec8: /--\-X b176 cbz r6, 8005ee8 <ip_reass_free_complete_datagram+0x44> LWIP_ASSERT("prev->next == ipr", prev->next == ipr); 8005eca: | 6833 ldr r3, [r6, #0] 8005ecc: | 42a3 cmp r3, r4 8005ece: +----- d00b beq.n 8005ee8 <ip_reass_free_complete_datagram+0x44> 8005ed0: | b672 cpsid i 8005ed2: | 4b35 ldr r3, [pc, #212] @ (8005fa8 ) 8005ed4: | 4a38 ldr r2, [pc, #224] @ (8005fb8 ) 8005ed6: | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8005eda: | 4b35 ldr r3, [pc, #212] @ (8005fb0 ) 8005edc: | 9300 str r3, [sp, #0] 8005ede: | 4835 ldr r0, [pc, #212] @ (8005fb4 ) 8005ee0: | 23ad movs r3, #173 @ 0xad 8005ee2: | f7fb fa09 bl 80012f8 <printf_> 8005ee6: | be00 bkpt 0x0000 iprh = (struct ip_reass_helper *)ipr->p->payload; 8005ee8: \----> 6867 ldr r7, [r4, #4] 8005eea: 687b ldr r3, [r7, #4] if (iprh->start == 0) { 8005eec: 889a ldrh r2, [r3, #4] 8005eee: 2a00 cmp r2, #0 8005ef0: /-------------- d13d bne.n 8005f6e <ip_reass_free_complete_datagram+0xca> ipr->p = iprh->next_pbuf; 8005ef2: | 681a ldr r2, [r3, #0] 8005ef4: | 6062 str r2, [r4, #4] SMEMCPY(p->payload, &ipr->iphdr, IP_HLEN); 8005ef6: | f104 011c add.w r1, r4, #28 8005efa: | f104 0208 add.w r2, r4, #8 8005efe: | /-> f852 0b04 ldr.w r0, [r2], #4 8005f02: | | f843 0b04 str.w r0, [r3], #4 8005f06: | | 428a cmp r2, r1 8005f08: | \-- d1f9 bne.n 8005efe <ip_reass_free_complete_datagram+0x5a> icmp_send_response(p, ICMP_TE, t); 8005f0a: | 2201 movs r2, #1 8005f0c: | 4638 mov r0, r7 8005f0e: | 210b movs r1, #11 8005f10: | f7ff ff62 bl 8005dd8 <icmp_send_response> clen = pbuf_clen(p); 8005f14: | 4638 mov r0, r7 8005f16: | f7fc fb85 bl 8002624 <pbuf_clen> 8005f1a: | 4605 mov r5, r0 pbuf_free(p); 8005f1c: | 4638 mov r0, r7 8005f1e: | f003 ff4d bl 8009dbc <pbuf_free.isra.0> p = ipr->p; 8005f22: | /-------> 6867 ldr r7, [r4, #4] 8005f24: | | f8df 8080 ldr.w r8, [pc, #128] @ 8005fa8 LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); 8005f28: | | f8df 9084 ldr.w r9, [pc, #132] @ 8005fb0 8005f2c: | | f8df a094 ldr.w sl, [pc, #148] @ 8005fc4 while (p != NULL) { 8005f30: | /--|--/----X b9ff cbnz r7, 8005f72 <ip_reass_free_complete_datagram+0xce> ip_reass_dequeue_datagram(ipr, prev); 8005f32: | | | | 4620 mov r0, r4 LWIP_ASSERT("ip_reass_pbufcount >= pbufs_freed", ip_reass_pbufcount >= pbufs_freed); 8005f34: | | | | 4c21 ldr r4, [pc, #132] @ (8005fbc ) ip_reass_dequeue_datagram(ipr, prev); 8005f36: | | | | 4631 mov r1, r6 8005f38: | | | | f7fc fabc bl 80024b4 <ip_reass_dequeue_datagram> LWIP_ASSERT("ip_reass_pbufcount >= pbufs_freed", ip_reass_pbufcount >= pbufs_freed); 8005f3c: | | | | f8b4 324a ldrh.w r3, [r4, #586] @ 0x24a 8005f40: | | | | 42ab cmp r3, r5 8005f42: | | | | /-- d20b bcs.n 8005f5c <ip_reass_free_complete_datagram+0xb8> 8005f44: | | | | | b672 cpsid i 8005f46: | | | | | 4b18 ldr r3, [pc, #96] @ (8005fa8 ) 8005f48: | | | | | 4a1d ldr r2, [pc, #116] @ (8005fc0 ) 8005f4a: | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8005f4e: | | | | | 4b18 ldr r3, [pc, #96] @ (8005fb0 ) 8005f50: | | | | | 9300 str r3, [sp, #0] 8005f52: | | | | | 4818 ldr r0, [pc, #96] @ (8005fb4 ) 8005f54: | | | | | 23d2 movs r3, #210 @ 0xd2 8005f56: | | | | | f7fb f9cf bl 80012f8 <printf_> 8005f5a: | | | | | be00 bkpt 0x0000 ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount - pbufs_freed); 8005f5c: | | | | \-> f8b4 324a ldrh.w r3, [r4, #586] @ 0x24a } 8005f60: | | | | 4628 mov r0, r5 ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount - pbufs_freed); 8005f62: | | | | 1b5b subs r3, r3, r5 8005f64: | | | | f8a4 324a strh.w r3, [r4, #586] @ 0x24a } 8005f68: | | | | b003 add sp, #12 8005f6a: | | | | e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} u16_t pbufs_freed = 0; 8005f6e: \--|--|--|----> 2500 movs r5, #0 8005f70: | \--|----- e7d7 b.n 8005f22 <ip_reass_free_complete_datagram+0x7e> iprh = (struct ip_reass_helper *)p->payload; 8005f72: | \----> 687b ldr r3, [r7, #4] clen = pbuf_clen(pcur); 8005f74: | 4638 mov r0, r7 p = iprh->next_pbuf; 8005f76: | f8d3 b000 ldr.w fp, [r3] clen = pbuf_clen(pcur); 8005f7a: | f7fc fb53 bl 8002624 <pbuf_clen> LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); 8005f7e: | 4405 add r5, r0 8005f80: | f5b5 3f80 cmp.w r5, #65536 @ 0x10000 8005f84: | /-- db0a blt.n 8005f9c <ip_reass_free_complete_datagram+0xf8> 8005f86: | | b672 cpsid i 8005f88: | | 23cc movs r3, #204 @ 0xcc 8005f8a: | | f8d8 12fc ldr.w r1, [r8, #764] @ 0x2fc 8005f8e: | | 4809 ldr r0, [pc, #36] @ (8005fb4 ) 8005f90: | | f8cd 9000 str.w r9, [sp] 8005f94: | | 4652 mov r2, sl 8005f96: | | f7fb f9af bl 80012f8 <printf_> 8005f9a: | | be00 bkpt 0x0000 pbuf_free(pcur); 8005f9c: | \-> 4638 mov r0, r7 8005f9e: | f003 ff0d bl 8009dbc <pbuf_free.isra.0> pbufs_freed = (u16_t)(pbufs_freed + clen); 8005fa2: | b2ad uxth r5, r5 p = iprh->next_pbuf; 8005fa4: | 465f mov r7, fp 8005fa6: \----------- e7c3 b.n 8005f30 <ip_reass_free_complete_datagram+0x8c> 8005fa8: 20000060 .word 0x20000060 8005fac: 0800c4de .word 0x0800c4de 8005fb0: 0800b87f .word 0x0800b87f 8005fb4: 0800b232 .word 0x0800b232 8005fb8: 0800c4ea .word 0x0800c4ea 8005fbc: 20001158 .word 0x20001158 8005fc0: 0800c519 .word 0x0800c519 8005fc4: 0800c4fc .word 0x0800c4fc 08005fc8 : { 8005fc8: b538 push {r3, r4, r5, lr} r = reassdatagrams; 8005fca: 4b09 ldr r3, [pc, #36] @ (8005ff0 ) 8005fcc: f8d3 00c4 ldr.w r0, [r3, #196] @ 0xc4 struct ip_reassdata *r, *prev = NULL; 8005fd0: 2400 movs r4, #0 while (r != NULL) { 8005fd2: /-----/-X b900 cbnz r0, 8005fd6 <ip_reass_tmr+0xe> } 8005fd4: | | bd38 pop {r3, r4, r5, pc} if (r->timer > 0) { 8005fd6: | \-> 7fc3 ldrb r3, [r0, #31] r = r->next; 8005fd8: | 6805 ldr r5, [r0, #0] if (r->timer > 0) { 8005fda: | /----- b123 cbz r3, 8005fe6 <ip_reass_tmr+0x1e> r->timer--; 8005fdc: | | 3b01 subs r3, #1 8005fde: | | 77c3 strb r3, [r0, #31] prev = r; 8005fe0: | | 4604 mov r4, r0 8005fe2: | | /-> 4628 mov r0, r5 8005fe4: \--|--|-- e7f5 b.n 8005fd2 <ip_reass_tmr+0xa> ip_reass_free_complete_datagram(tmp, prev); 8005fe6: \--|-> 4621 mov r1, r4 8005fe8: | f7ff ff5c bl 8005ea4 <ip_reass_free_complete_datagram> 8005fec: \-- e7f9 b.n 8005fe2 <ip_reass_tmr+0x1a> 8005fee: bf00 nop 8005ff0: 20001158 .word 0x20001158 08005ff4 : { 8005ff4: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} r = reassdatagrams; 8005ff8: f8df 806c ldr.w r8, [pc, #108] @ 8006068 { 8005ffc: 4605 mov r5, r0 8005ffe: 460f mov r7, r1 int pbufs_freed = 0, pbufs_freed_current; 8006000: 2600 movs r6, #0 other_datagrams = 0; 8006002: /-------> 2400 movs r4, #0 r = reassdatagrams; 8006004: | f8d8 30c4 ldr.w r3, [r8, #196] @ 0xc4 oldest_prev = NULL; 8006008: | 4621 mov r1, r4 prev = NULL; 800600a: | 46a4 mov ip, r4 oldest = NULL; 800600c: | 4620 mov r0, r4 while (r != NULL) { 800600e: /--|--/----X b953 cbnz r3, 8006026 <ip_reass_remove_oldest_datagram+0x32> if (oldest != NULL) { 8006010: | | | /-- b110 cbz r0, 8006018 <ip_reass_remove_oldest_datagram+0x24> pbufs_freed_current = ip_reass_free_complete_datagram(oldest, oldest_prev); 8006012: | | | | f7ff ff47 bl 8005ea4 <ip_reass_free_complete_datagram> pbufs_freed += pbufs_freed_current; 8006016: | | | | 4406 add r6, r0 } while ((pbufs_freed < pbufs_needed) && (other_datagrams > 1)); 8006018: | | | \-> 42be cmp r6, r7 800601a: | | | /-- da01 bge.n 8006020 <ip_reass_remove_oldest_datagram+0x2c> 800601c: | | | | 2c01 cmp r4, #1 800601e: | \--|--|-- dcf0 bgt.n 8006002 <ip_reass_remove_oldest_datagram+0xe> } 8006020: | | \-> 4630 mov r0, r6 8006022: | | e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (!IP_ADDRESSES_AND_ID_MATCH(&r->iphdr, fraghdr)) { 8006026: | \----> f8d5 e00c ldr.w lr, [r5, #12] 800602a: | 695a ldr r2, [r3, #20] 800602c: | 4572 cmp r2, lr 800602e: | /-- d109 bne.n 8006044 <ip_reass_remove_oldest_datagram+0x50> 8006030: | | f8d5 e010 ldr.w lr, [r5, #16] 8006034: | | 699a ldr r2, [r3, #24] 8006036: | | 4572 cmp r2, lr 8006038: | +-- d104 bne.n 8006044 <ip_reass_remove_oldest_datagram+0x50> 800603a: | | f8b3 e00c ldrh.w lr, [r3, #12] 800603e: | | 88aa ldrh r2, [r5, #4] 8006040: | | 4596 cmp lr, r2 8006042: | /--|-- d008 beq.n 8006056 <ip_reass_remove_oldest_datagram+0x62> other_datagrams++; 8006044: | | \-> 3401 adds r4, #1 if (oldest == NULL) { 8006046: | | /-- b160 cbz r0, 8006062 <ip_reass_remove_oldest_datagram+0x6e> } else if (r->timer <= oldest->timer) { 8006048: | | | 7fc2 ldrb r2, [r0, #31] 800604a: | | | f893 e01f ldrb.w lr, [r3, #31] oldest = r; 800604e: | | | 4596 cmp lr, r2 8006050: | | | bf9c itt ls 8006052: | | | 4661 movls r1, ip 8006054: | | | 4618 movls r0, r3 if (r->next != NULL) { 8006056: | >--|-> 681a ldr r2, [r3, #0] 8006058: | | | 2a00 cmp r2, #0 800605a: | | | bf18 it ne 800605c: | | | 469c movne ip, r3 800605e: | | | 4613 mov r3, r2 8006060: \-----|--|-- e7d5 b.n 800600e <ip_reass_remove_oldest_datagram+0x1a> oldest_prev = prev; 8006062: | \-> 4661 mov r1, ip oldest = r; 8006064: | 4618 mov r0, r3 8006066: \----- e7f6 b.n 8006056 <ip_reass_remove_oldest_datagram+0x62> 8006068: 20001158 .word 0x20001158 0800606c : { 800606c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} IP_STATS_INC(ip.recv); 8006070: f8df b2ec ldr.w fp, [pc, #748] @ 8006360 iphdr = (struct ip_hdr *)p->payload; 8006074: 6845 ldr r5, [r0, #4] IP_STATS_INC(ip.recv); 8006076: f83b 3c0a ldrh.w r3, [fp, #-10] 800607a: 3301 adds r3, #1 800607c: f82b 3c0a strh.w r3, [fp, #-10] if (IPH_V(iphdr) != 4) { 8006080: 782b ldrb r3, [r5, #0] 8006082: 091a lsrs r2, r3, #4 8006084: 2a04 cmp r2, #4 { 8006086: b08b sub sp, #44 @ 0x2c 8006088: 4606 mov r6, r0 800608a: 468a mov sl, r1 if (IPH_V(iphdr) != 4) { 800608c: /-- d00f beq.n 80060ae <ip4_input+0x42> pbuf_free(p); 800608e: | f003 fe95 bl 8009dbc <pbuf_free.isra.0> IP_STATS_INC(ip.err); 8006092: | f8bb 3008 ldrh.w r3, [fp, #8] 8006096: | 3301 adds r3, #1 8006098: | f8ab 3008 strh.w r3, [fp, #8] IP_STATS_INC(ip.drop); 800609c: /-----------------------------------------------------------------------------------|-> f83b 3c06 ldrh.w r3, [fp, #-6] 80060a0: | | 3301 adds r3, #1 80060a2: | | f82b 3c06 strh.w r3, [fp, #-6] } 80060a6: | /-----------------------------------------------------|-> 2000 movs r0, #0 80060a8: | | | b00b add sp, #44 @ 0x2c 80060aa: | | | e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} iphdr_hlen = IPH_HL_BYTES(iphdr); 80060ae: | | \-> f003 030f and.w r3, r3, #15 80060b2: | | 009b lsls r3, r3, #2 80060b4: | | 9305 str r3, [sp, #20] iphdr_len = lwip_ntohs(IPH_LEN(iphdr)); 80060b6: | | 886c ldrh r4, [r5, #2] if (iphdr_len < p->tot_len) { 80060b8: | | 8903 ldrh r3, [r0, #8] 80060ba: | | ba64 rev16 r4, r4 80060bc: | | b2a4 uxth r4, r4 80060be: | | 42a3 cmp r3, r4 80060c0: | | /-- d902 bls.n 80060c8 <ip4_input+0x5c> pbuf_realloc(p, iphdr_len); 80060c2: | | | 4621 mov r1, r4 80060c4: | | | f7fb fc4e bl 8001964 <pbuf_realloc> if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len) || (iphdr_hlen < IP_HLEN)) { 80060c8: | | \-> 8973 ldrh r3, [r6, #10] 80060ca: | | 9a05 ldr r2, [sp, #20] 80060cc: | | 4293 cmp r3, r2 80060ce: | | /-- d304 bcc.n 80060da <ip4_input+0x6e> 80060d0: | | | 8933 ldrh r3, [r6, #8] 80060d2: | | | 42a3 cmp r3, r4 80060d4: | | +-- d301 bcc.n 80060da <ip4_input+0x6e> 80060d6: | | | 2a13 cmp r2, #19 80060d8: | | /--|-- d808 bhi.n 80060ec <ip4_input+0x80> pbuf_free(p); 80060da: | | | \-> 4630 mov r0, r6 80060dc: | | | f003 fe6e bl 8009dbc <pbuf_free.isra.0> IP_STATS_INC(ip.lenerr); 80060e0: | | | f83b 3c02 ldrh.w r3, [fp, #-2] 80060e4: | | | 3301 adds r3, #1 80060e6: | | | f82b 3c02 strh.w r3, [fp, #-2] 80060ea: +-----------------------------|--------------------------------------------------|----- e7d7 b.n 800609c <ip4_input+0x30> 80060ec: | | \----> 9905 ldr r1, [sp, #20] 80060ee: | | 4628 mov r0, r5 80060f0: | | f002 f822 bl 8008138 <lwip_standard_chksum> if (inet_chksum(iphdr, iphdr_hlen) != 0) { 80060f4: | | f64f 73ff movw r3, #65535 @ 0xffff 80060f8: | | 4298 cmp r0, r3 80060fa: | | /-- d008 beq.n 800610e <ip4_input+0xa2> pbuf_free(p); 80060fc: | | | 4630 mov r0, r6 80060fe: | | | f003 fe5d bl 8009dbc <pbuf_free.isra.0> IP_STATS_INC(ip.chkerr); 8006102: | | | f83b 3c04 ldrh.w r3, [fp, #-4] 8006106: | | | 3301 adds r3, #1 8006108: | | | f82b 3c04 strh.w r3, [fp, #-4] IP_STATS_INC(ip.drop); 800610c: +-----------------------------|-----------------------------------------------------|-- e7c6 b.n 800609c <ip4_input+0x30> ip_addr_copy_from_ip4(ip_data.current_iphdr_dest, iphdr->dest); 800610e: | | \-> 6928 ldr r0, [r5, #16] if ((netif_is_up(inp)) && (!ip4_addr_isany_val(*netif_ip4_addr(inp)))) { 8006110: | | f89a 3035 ldrb.w r3, [sl, #53] @ 0x35 ip_addr_copy_from_ip4(ip_data.current_iphdr_dest, iphdr->dest); 8006114: | | f8cb 012c str.w r0, [fp, #300] @ 0x12c if (ip4_addr_ismulticast(ip4_current_dest_addr())) { 8006118: | | f000 02f0 and.w r2, r0, #240 @ 0xf0 ip_addr_copy_from_ip4(ip_data.current_iphdr_src, iphdr->src); 800611c: | | 68ec ldr r4, [r5, #12] 800611e: | | f8cb 4128 str.w r4, [fp, #296] @ 0x128 if (ip4_addr_ismulticast(ip4_current_dest_addr())) { 8006122: | | 2ae0 cmp r2, #224 @ 0xe0 if ((netif_is_up(inp)) && (!ip4_addr_isany_val(*netif_ip4_addr(inp)))) { 8006124: | | f003 0301 and.w r3, r3, #1 if (ip4_addr_ismulticast(ip4_current_dest_addr())) { 8006128: | | /----------- d12d bne.n 8006186 <ip4_input+0x11a> if ((netif_is_up(inp)) && (!ip4_addr_isany_val(*netif_ip4_addr(inp)))) { 800612a: | | /--------|----------- b11b cbz r3, 8006134 <ip4_input+0xc8> 800612c: | | | | f8da 3000 ldr.w r3, [sl] 8006130: | | | | 2b00 cmp r3, #0 8006132: | | | /-----|----------- d135 bne.n 80061a0 <ip4_input+0x134> if (IPH_PROTO(iphdr) == IP_PROTO_UDP) { 8006134: | | >--|-----|----------> 7a6b ldrb r3, [r5, #9] 8006136: | | | | | 2b11 cmp r3, #17 8006138: | /--------------------------|-----------------------------------|--|-----|----------- f041 8302 bne.w 8007740 <ip4_input+0x16d4> if (IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(udphdr->dest)) { 800613c: | | | | | | 9b05 ldr r3, [sp, #20] 800613e: | | | | | | 18eb adds r3, r5, r3 8006140: | | | | | | 885b ldrh r3, [r3, #2] 8006142: | | | | | | f5b3 4f88 cmp.w r3, #17408 @ 0x4400 8006146: | +--------------------------|-----------------------------------|--|-----|----------- f041 82fb bne.w 8007740 <ip4_input+0x16d4> 800614a: | | | | | | /-------> 46d0 mov r8, sl if ((IPH_OFFSET(iphdr) & PP_HTONS(IP_OFFMASK | IP_MF)) != 0) { 800614c: | | | | | /--|--|-------> 88eb ldrh r3, [r5, #6] 800614e: | | | | | | | | f023 03c0 bic.w r3, r3, #192 @ 0xc0 8006152: | | | | | | | | 2b00 cmp r3, #0 8006154: | | | /--------------------------|--|--|--|--|-------- f000 81bb beq.w 80064ce <ip4_input+0x462> IPFRAG_STATS_INC(ip_frag.recv); 8006158: | | | | | | | | | f83b 3c22 ldrh.w r3, [fp, #-34] fraghdr = (struct ip_hdr *)p->payload; 800615c: | | | | | | | | | 6877 ldr r7, [r6, #4] IPFRAG_STATS_INC(ip_frag.recv); 800615e: | | | | | | | | | 3301 adds r3, #1 8006160: | | | | | | | | | f82b 3c22 strh.w r3, [fp, #-34] if (IPH_HL_BYTES(fraghdr) != IP_HLEN) { 8006164: | | | | | | | | | 783b ldrb r3, [r7, #0] 8006166: | | | | | | | | | f003 030f and.w r3, r3, #15 800616a: | | | | | | | | | 2b05 cmp r3, #5 800616c: | | | | | | | | | /----- d029 beq.n 80061c2 <ip4_input+0x156> IPFRAG_STATS_INC(ip_frag.err); 800616e: | | | | | | | | | | f83b 3c10 ldrh.w r3, [fp, #-16] 8006172: | | | | | | | | | | 3301 adds r3, #1 8006174: | | | | | | | | | | f82b 3c10 strh.w r3, [fp, #-16] IPFRAG_STATS_INC(ip_frag.drop); 8006178: | | | /-----|--------------------------|--|--|--|--|--|----> 4a79 ldr r2, [pc, #484] @ (8006360 ) 800617a: | | | | | | | | | | | f832 3c1e ldrh.w r3, [r2, #-30] 800617e: | | | | | | | | | | | 3301 adds r3, #1 8006180: | | | | | | | | | | | f822 3c1e strh.w r3, [r2, #-30] 8006184: | | | | | | | | | | | /-- e019 b.n 80061ba <ip4_input+0x14e> if ((netif_is_up(netif)) && (!ip4_addr_isany_val(*netif_ip4_addr(netif)))) { 8006186: | | | | | | | | \--|--|--|-> 2b00 cmp r3, #0 8006188: | | | | | +--|--|-----|--|--|-- d0d4 beq.n 8006134 <ip4_input+0xc8> 800618a: | | | | | | | | | | | f8da 3000 ldr.w r3, [sl] 800618e: | | | | | | | | | | | 2b00 cmp r3, #0 8006190: | | | | | +--|--|-----|--|--|-- d0d0 beq.n 8006134 <ip4_input+0xc8> if (ip4_addr_eq(ip4_current_dest_addr(), netif_ip4_addr(netif)) || 8006192: | | | | | | | | | | | 4298 cmp r0, r3 8006194: | | | | | | +--|-----|--|--|-- d004 beq.n 80061a0 <ip4_input+0x134> ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) 8006196: | | | | | | | | | | | 4651 mov r1, sl 8006198: | | | | | | | | | | | f001 ff5a bl 8008050 <ip4_addr_isbroadcast_u32> if (ip4_addr_eq(ip4_current_dest_addr(), netif_ip4_addr(netif)) || 800619c: | | | | | | | | | | | 2800 cmp r0, #0 800619e: | | | | | \--|--|-----|--|--|-- d0c9 beq.n 8006134 <ip4_input+0xc8> && !ip4_addr_isany_val(*ip4_current_src_addr()) 80061a0: | | | | | \--|-----|--|--|-> 2c00 cmp r4, #0 80061a2: | | | | | | \--|--|-- d0d2 beq.n 800614a <ip4_input+0xde> 80061a4: | | | | | | | | 46d0 mov r8, sl 80061a6: | | /--------------------|--|-----|--------------------------------|--------|--|-- f001 bad0 b.w 800774a <ip4_input+0x16de> if (netif == NULL) { 80061aa: | | /--|--------------------|--|-----|--------------------------------|--------|--|-> f1b8 0f00 cmp.w r8, #0 80061ae: | | | | | | | \--------|--|-- d1cd bne.n 800614c <ip4_input+0xe0> IP_STATS_INC(ip.drop); 80061b0: | | | | /-----------------|--|-----|-----------------------------------------|--|-> f83b 3c06 ldrh.w r3, [fp, #-6] 80061b4: | | | | | | | | | | 3301 adds r3, #1 80061b6: | | | | | | | | | | f82b 3c06 strh.w r3, [fp, #-6] pbuf_free(p); 80061ba: | | | | | | | | | \-> 4630 mov r0, r6 80061bc: | | | | | | | | | f003 fdfe bl 8009dbc <pbuf_free.isra.0> if (p == NULL) { 80061c0: | | | | | +--|-----|-----------------------------------------|----- e771 b.n 80060a6 <ip4_input+0x3a> len = lwip_ntohs(IPH_LEN(fraghdr)); 80061c2: | | | | | | | | \----> 887b ldrh r3, [r7, #2] offset = IPH_OFFSET_BYTES(fraghdr); 80061c4: | | | | | | | | 88fd ldrh r5, [r7, #6] 80061c6: | | | | | | | | ba5b rev16 r3, r3 80061c8: | | | | | | | | b29b uxth r3, r3 if (hlen > len) { 80061ca: | | | | | | | | 2b13 cmp r3, #19 80061cc: | | | | | | +-----|----------------------------------------------- d9d4 bls.n 8006178 <ip4_input+0x10c> len = (u16_t)(len - hlen); 80061ce: | | | | | | | | 3b14 subs r3, #20 80061d0: | | | | | | | | b29b uxth r3, r3 clen = pbuf_clen(p); 80061d2: | | | | | | | | 4630 mov r0, r6 len = (u16_t)(len - hlen); 80061d4: | | | | | | | | 9308 str r3, [sp, #32] clen = pbuf_clen(p); 80061d6: | | | | | | | | f7fc fa25 bl 8002624 <pbuf_clen> if ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) { 80061da: | | | | | | | | f8bb 324a ldrh.w r3, [fp, #586] @ 0x24a clen = pbuf_clen(p); 80061de: | | | | | | | | 9006 str r0, [sp, #24] if ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) { 80061e0: | | | | | | | | 4403 add r3, r0 80061e2: | | | | | | | | 2b0a cmp r3, #10 80061e4: | | | | | | | | /-- dd10 ble.n 8006208 <ip4_input+0x19c> if (!ip_reass_remove_oldest_datagram(fraghdr, clen) || 80061e6: | | | | | | | | | 4601 mov r1, r0 80061e8: | | | | | | | | | 4638 mov r0, r7 80061ea: | | | | | | | | | f7ff ff03 bl 8005ff4 <ip_reass_remove_oldest_datagram> 80061ee: | | | | | | | | /--|-- b128 cbz r0, 80061fc <ip4_input+0x190> ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS)) 80061f0: | | | | | | | | | | f8bb 324a ldrh.w r3, [fp, #586] @ 0x24a 80061f4: | | | | | | | | | | 9a06 ldr r2, [sp, #24] 80061f6: | | | | | | | | | | 4413 add r3, r2 if (!ip_reass_remove_oldest_datagram(fraghdr, clen) || 80061f8: | | | | | | | | | | 2b0a cmp r3, #10 80061fa: | | | | | | | | | +-- dd05 ble.n 8006208 <ip4_input+0x19c> IPFRAG_STATS_INC(ip_frag.memerr); 80061fc: | | | | | | | | >--|-> f83b 3c18 ldrh.w r3, [fp, #-24] 8006200: | | | | | | | | | | 3301 adds r3, #1 8006202: | | | | | | | | | | f82b 3c18 strh.w r3, [fp, #-24] if (ipr == NULL) { 8006206: | | | | | | +-----|-----------------------------------------|--|-- e7b7 b.n 8006178 <ip4_input+0x10c> for (ipr = reassdatagrams; ipr != NULL; ipr = ipr->next) { 8006208: | | | | | | | | | \-> f8db 40c4 ldr.w r4, [fp, #196] @ 0xc4 800620c: | | | | | | | | /--------------|----> 2c00 cmp r4, #0 800620e: | | | | | | | | | /-----------|----- d17c bne.n 800630a <ip4_input+0x29e> ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA); 8006210: | | | | | | | | | | | 2004 movs r0, #4 8006212: | | | | | | | | | | | f7fb ff6b bl 80020ec <memp_malloc> if (ipr == NULL) { 8006216: | | | | | | | | | | | 4604 mov r4, r0 8006218: | | | | | | | | | | | /-- b960 cbnz r0, 8006234 <ip4_input+0x1c8> if (ip_reass_remove_oldest_datagram(fraghdr, clen) >= clen) { 800621a: | | | | | | | | | | | | 9906 ldr r1, [sp, #24] 800621c: | | | | | | | | | | | | 4638 mov r0, r7 800621e: | | | | | | | | | | | | f7ff fee9 bl 8005ff4 <ip_reass_remove_oldest_datagram> 8006222: | | | | | | | | | | | | 9b06 ldr r3, [sp, #24] 8006224: | | | | | | | | | | | | 4283 cmp r3, r0 8006226: | | | | | | | | | | +--|-- dce9 bgt.n 80061fc <ip4_input+0x190> ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA); 8006228: | | | | | | | | | | | | 2004 movs r0, #4 800622a: | | | | | | | | | | | | f7fb ff5f bl 80020ec <memp_malloc> if (ipr == NULL) 800622e: | | | | | | | | | | | | 4604 mov r4, r0 8006230: | | | | | | | | | | | | 2800 cmp r0, #0 8006232: | | | | | | | | | | \--|-- d0e3 beq.n 80061fc <ip4_input+0x190> memset(ipr, 0, sizeof(struct ip_reassdata)); 8006234: | | | | | | | | | | \-> 221c movs r2, #28 8006236: | | | | | | | | | | 2100 movs r1, #0 8006238: | | | | | | | | | | 1d20 adds r0, r4, #4 800623a: | | | | | | | | | | f004 fe4b bl 800aed4 <memset> ipr->timer = IP_REASS_MAXAGE; 800623e: | | | | | | | | | | 230f movs r3, #15 8006240: | | | | | | | | | | 77e3 strb r3, [r4, #31] ipr->next = reassdatagrams; 8006242: | | | | | | | | | | f8db 30c4 ldr.w r3, [fp, #196] @ 0xc4 8006246: | | | | | | | | | | 6023 str r3, [r4, #0] reassdatagrams = ipr; 8006248: | | | | | | | | | | f8cb 40c4 str.w r4, [fp, #196] @ 0xc4 SMEMCPY(&(ipr->iphdr), fraghdr, IP_HLEN); 800624c: | | | | | | | | | | 463b mov r3, r7 800624e: | | | | | | | | | | f104 0208 add.w r2, r4, #8 8006252: | | | | | | | | | | f107 0114 add.w r1, r7, #20 8006256: | | | | | | | | | | /-> f853 0b04 ldr.w r0, [r3], #4 800625a: | | | | | | | | | | | f842 0b04 str.w r0, [r2], #4 800625e: | | | | | | | | | | | 428b cmp r3, r1 8006260: | | | | | | | | | | \-- d1f9 bne.n 8006256 <ip4_input+0x1ea> 8006262: | | | | | | | | | | /-------------> ba6d rev16 r5, r5 offset = IPH_OFFSET_BYTES(fraghdr); 8006264: | | | | | | | | | | | f3c5 050c ubfx r5, r5, #0, #13 8006268: | | | | | | | | | | | 00eb lsls r3, r5, #3 800626a: | | | | | | | | | | | 9307 str r3, [sp, #28] is_last = (IPH_OFFSET(fraghdr) & PP_NTOHS(IP_MF)) == 0; 800626c: | | | | | | | | | | | 88fb ldrh r3, [r7, #6] if (is_last) { 800626e: | | | | | | | | | | | f013 0320 ands.w r3, r3, #32 8006272: | | | | | | | | | | | 9309 str r3, [sp, #36] @ 0x24 8006274: | | | | | | | | | | | /-- d10c bne.n 8006290 <ip4_input+0x224> u16_t datagram_len = (u16_t)(offset + len); 8006276: | | | | | | | | | | | | e9dd 3207 ldrd r3, r2, [sp, #28] 800627a: | | | | | | | | | | | | 4413 add r3, r2 if ((datagram_len < offset) || (datagram_len > (0xFFFF - IP_HLEN))) { 800627c: | | | | | | | | | | | | 9a07 ldr r2, [sp, #28] u16_t datagram_len = (u16_t)(offset + len); 800627e: | | | | | | | | | | | | b29b uxth r3, r3 if ((datagram_len < offset) || (datagram_len > (0xFFFF - IP_HLEN))) { 8006280: | | | | | | | | | | | | 429a cmp r2, r3 8006282: | | | | | | | /--|--------------------------|--|--|-----------|-- f200 8197 bhi.w 80065b4 <ip4_input+0x548> 8006286: | | | | | | | | | | | | | f64f 72eb movw r2, #65515 @ 0xffeb 800628a: | | | | | | | | | | | | | 4293 cmp r3, r2 800628c: | | | | | | | +--|--------------------------|--|--|-----------|-- f200 8192 bhi.w 80065b4 <ip4_input+0x548> fraghdr = (struct ip_hdr *)new_p->payload; 8006290: | | | | | | | | | | | | \-> 6875 ldr r5, [r6, #4] for (q = ipr->p; q != NULL;) { 8006292: | | | | | | | | | | | | 6861 ldr r1, [r4, #4] len = lwip_ntohs(IPH_LEN(fraghdr)); 8006294: | | | | | | | | | | | | 886a ldrh r2, [r5, #2] hlen = IPH_HL_BYTES(fraghdr); 8006296: | | | | | | | | | | | | 782b ldrb r3, [r5, #0] 8006298: | | | | | | | | | | | | ba52 rev16 r2, r2 800629a: | | | | | | | | | | | | f003 030f and.w r3, r3, #15 800629e: | | | | | | | | | | | | b292 uxth r2, r2 if (hlen > len) { 80062a0: | | | | | | | | | | | | ebb2 0f83 cmp.w r2, r3, lsl #2 80062a4: | | | | | | | | | | | | ea4f 0083 mov.w r0, r3, lsl #2 80062a8: | | | | | | | +--|--------------------------|--|--|-------------- f0c0 8184 bcc.w 80065b4 <ip4_input+0x548> offset = IPH_OFFSET_BYTES(fraghdr); 80062ac: | | | | | | | | | | | | 88eb ldrh r3, [r5, #6] 80062ae: | | | | | | | | | | | | ba5b rev16 r3, r3 80062b0: | | | | | | | | | | | | f3c3 030c ubfx r3, r3, #0, #13 80062b4: | | | | | | | | | | | | 00db lsls r3, r3, #3 iprh->end = (u16_t)(offset + len); 80062b6: | | | | | | | | | | | | 441a add r2, r3 80062b8: | | | | | | | | | | | | 1a12 subs r2, r2, r0 80062ba: | | | | | | | | | | | | b290 uxth r0, r2 iprh->next_pbuf = NULL; 80062bc: | | | | | | | | | | | | 2700 movs r7, #0 if (iprh->end < offset) { 80062be: | | | | | | | | | | | | 4283 cmp r3, r0 iprh->next_pbuf = NULL; 80062c0: | | | | | | | | | | | | 702f strb r7, [r5, #0] 80062c2: | | | | | | | | | | | | 706f strb r7, [r5, #1] 80062c4: | | | | | | | | | | | | 70af strb r7, [r5, #2] 80062c6: | | | | | | | | | | | | 70ef strb r7, [r5, #3] iprh->start = offset; 80062c8: | | | | | | | | | | | | 80ab strh r3, [r5, #4] iprh->end = (u16_t)(offset + len); 80062ca: | | | | | | | | | | | | 80ea strh r2, [r5, #6] if (iprh->end < offset) { 80062cc: | | | | | | | +--|--------------------------|--|--|-------------- f200 8172 bhi.w 80065b4 <ip4_input+0x548> for (q = ipr->p; q != NULL;) { 80062d0: | | | | | | | | | | | | 460a mov r2, r1 int valid = 1; 80062d2: | | | | | | | | | | | | f04f 0901 mov.w r9, #1 for (q = ipr->p; q != NULL;) { 80062d6: | | | | | | | | | /-----------------------|--|--|-------------> 2a00 cmp r2, #0 80062d8: | | | | | | | | | | | | | /----------- d14c bne.n 8006374 <ip4_input+0x308> if (iprh_prev != NULL) { 80062da: | | | | | | | | | | | | | | 2f00 cmp r7, #0 80062dc: | | | | | | | | | | /--------------------|--|--|--|----------- f000 8140 beq.w 8006560 <ip4_input+0x4f4> LWIP_ASSERT("check fragments don't overlap", iprh_prev->end <= iprh->start); 80062e0: | | | | | | | | | | | | | | | 88fa ldrh r2, [r7, #6] 80062e2: | | | | | | | | | | | | | | | 429a cmp r2, r3 80062e4: | | | | | | | | | | | | | | | /-- d90c bls.n 8006300 <ip4_input+0x294> 80062e6: | | | | | | | | | | | | | | | | b672 cpsid i 80062e8: | | | | | | | | | | | | | | | | 4b1e ldr r3, [pc, #120] @ (8006364 ) 80062ea: | | | | | | | | | | | | | | | | 4a1f ldr r2, [pc, #124] @ (8006368 ) 80062ec: | | | | | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80062f0: | | | | | | | | | | | | | | | | 4b1e ldr r3, [pc, #120] @ (800636c ) 80062f2: | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 80062f4: | | | | | | | | | | | | | | | | 481e ldr r0, [pc, #120] @ (8006370 ) 80062f6: | | | | | | | | | | | | | | | | f44f 73db mov.w r3, #438 @ 0x1b6 80062fa: | | | | | | | | | | | | | | | | f7fa fffd bl 80012f8 <printf_> 80062fe: | | | | | | | | | | | | | | | | be00 bkpt 0x0000 iprh_prev->next_pbuf = new_p; 8006300: | | | | | | | | | | | | | | | \-> 603e str r6, [r7, #0] if (iprh_prev->end != iprh->start) { 8006302: | | | | | | | | | | | | | | | 88fa ldrh r2, [r7, #6] 8006304: | | | | | | | | | | | | | | | 88ab ldrh r3, [r5, #4] 8006306: | | | | | | | | | | | | | | | 429a cmp r2, r3 8006308: | | | | | | | | | | | | | | | /-------- e048 b.n 800639c <ip4_input+0x330> if (IP_ADDRESSES_AND_ID_MATCH(&ipr->iphdr, fraghdr)) { 800630a: | | | | | | | | | | | | \--|--|--|-------> 68fb ldr r3, [r7, #12] 800630c: | | | | | | | | | | | | | | | 6962 ldr r2, [r4, #20] 800630e: | | | | | | | | | | | | | | | 429a cmp r2, r3 8006310: | | | | | | | | | | | | | | | /----- d124 bne.n 800635c <ip4_input+0x2f0> 8006312: | | | | | | | | | | | | | | | | 693b ldr r3, [r7, #16] 8006314: | | | | | | | | | | | | | | | | 69a2 ldr r2, [r4, #24] 8006316: | | | | | | | | | | | | | | | | 429a cmp r2, r3 8006318: | | | | | | | | | | | | | | | +----- d120 bne.n 800635c <ip4_input+0x2f0> 800631a: | | | | | | | | | | | | | | | | 89a2 ldrh r2, [r4, #12] 800631c: | | | | | | | | | | | | | | | | 88bb ldrh r3, [r7, #4] 800631e: | | | | | | | | | | | | | | | | 429a cmp r2, r3 8006320: | | | | | | | | | | | | | | | +----- d11c bne.n 800635c <ip4_input+0x2f0> IPFRAG_STATS_INC(ip_frag.cachehit); 8006322: | | | | | | | | | | | | | | | | f83b 3c0e ldrh.w r3, [fp, #-14] 8006326: | | | | | | | | | | | | | | | | 3301 adds r3, #1 8006328: | | | | | | | | | | | | | | | | f82b 3c0e strh.w r3, [fp, #-14] if (((lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) && 800632c: | | | | | | | | | | | | | | | | 88fb ldrh r3, [r7, #6] 800632e: | | | | | | | | | | | | | | | | ba5b rev16 r3, r3 8006330: | | | | | | | | | | | | | | | | f3c3 030c ubfx r3, r3, #0, #13 8006334: | | | | | | | | | | | | | | | | 2b00 cmp r3, #0 8006336: | | | | | | | | | | | | +--|--|--|----- d194 bne.n 8006262 <ip4_input+0x1f6> 8006338: | | | | | | | | | | | | | | | | 89e3 ldrh r3, [r4, #14] 800633a: | | | | | | | | | | | | | | | | ba5b rev16 r3, r3 800633c: | | | | | | | | | | | | | | | | f3c3 030c ubfx r3, r3, #0, #13 8006340: | | | | | | | | | | | | | | | | 2b00 cmp r3, #0 8006342: | | | | | | | | | | | | +--|--|--|----- d08e beq.n 8006262 <ip4_input+0x1f6> SMEMCPY(&ipr->iphdr, fraghdr, IP_HLEN); 8006344: | | | | | | | | | | | | | | | | 463b mov r3, r7 8006346: | | | | | | | | | | | | | | | | f104 0208 add.w r2, r4, #8 800634a: | | | | | | | | | | | | | | | | f107 0114 add.w r1, r7, #20 800634e: | | | | | | | | | | | | | | | | /-> f853 0b04 ldr.w r0, [r3], #4 8006352: | | | | | | | | | | | | | | | | | f842 0b04 str.w r0, [r2], #4 8006356: | | | | | | | | | | | | | | | | | 428b cmp r3, r1 8006358: | | | | | | | | | | | | | | | | \-- d1f9 bne.n 800634e <ip4_input+0x2e2> 800635a: | | | | | | | | | | | | \--|--|--|----- e782 b.n 8006262 <ip4_input+0x1f6> for (ipr = reassdatagrams; ipr != NULL; ipr = ipr->next) { 800635c: | | | | | | | | | | | | | | \----> 6824 ldr r4, [r4, #0] 800635e: | | | | | | | | | | | \--------|--|-------- e755 b.n 800620c <ip4_input+0x1a0> 8006360: | | | | | | | | | | | | | 20001158 .word 0x20001158 8006364: | | | | | | | | | | | | | 20000060 .word 0x20000060 8006368: | | | | | | | | | | | | | 0800c53b .word 0x0800c53b 800636c: | | | | | | | | | | | | | 0800b87f .word 0x0800b87f 8006370: | | | | | | | | | | | | | 0800b232 .word 0x0800b232 iprh_tmp = (struct ip_reass_helper *)q->payload; 8006374: | | | | | | | | | | | \--|-------> f8d2 c004 ldr.w ip, [r2, #4] if (iprh->start < iprh_tmp->start) { 8006378: | | | | | | | | | | | | f8bc e004 ldrh.w lr, [ip, #4] 800637c: | | | | | | | | | | | | 4573 cmp r3, lr 800637e: | | | | | | | | | | | /--------------------|-------- f080 80e0 bcs.w 8006542 <ip4_input+0x4d6> iprh->next_pbuf = q; 8006382: | | | | | | | | | | | | | 602a str r2, [r5, #0] if (iprh_prev != NULL) { 8006384: | | | | | | | | | | | | | 2f00 cmp r7, #0 8006386: | | | | | | | | | | | | | /----- f000 80d8 beq.w 800653a <ip4_input+0x4ce> if ((iprh->start < iprh_prev->end) || (iprh->end > iprh_tmp->start)) { 800638a: | | | | | | | | | | | | | | 88fa ldrh r2, [r7, #6] 800638c: | | | | | | | | | | | | | | 4293 cmp r3, r2 800638e: | | | | | | | +--|--|--|-----------|--------------------|--|----- f0c0 8111 bcc.w 80065b4 <ip4_input+0x548> 8006392: | | | | | | | | | | | | | | 4570 cmp r0, lr 8006394: | | | | | | | +--|--|--|-----------|--------------------|--|----- f200 810e bhi.w 80065b4 <ip4_input+0x548> iprh_prev->next_pbuf = new_p; 8006398: | | | | | | | | | | | | | | 603e str r6, [r7, #0] if (iprh_prev->end != iprh->start) { 800639a: | | | | | | | | | | | | | | 4293 cmp r3, r2 800639c: | | | | | | | | | | | | /--------------\--|----X d001 beq.n 80063a2 <ip4_input+0x336> valid = 0; 800639e: | | | | | | | | | | | | | | f04f 0900 mov.w r9, #0 if (is_last || ((ipr->flags & IP_REASS_FLAG_LASTFRAG) != 0)) { 80063a2: | | | | | | | | | | | | >-----------------|----> 9b09 ldr r3, [sp, #36] @ 0x24 80063a4: | | | | | | | | | | | | | | /-- b123 cbz r3, 80063b0 <ip4_input+0x344> 80063a6: | | | | | | | | | | | | | | | 7fa3 ldrb r3, [r4, #30] 80063a8: | | | | | | | | | | | | | | | f013 0301 ands.w r3, r3, #1 80063ac: | | | | | | | | | | | /--------|-----|-----------------|--|-- f000 80f0 beq.w 8006590 <ip4_input+0x524> if (valid) { 80063b0: | | | | | | | | | | | | | | | \-> f1b9 0f00 cmp.w r9, #0 80063b4: | | | | | | | | | | | | /-----|-----|-----------------|----- d02a beq.n 800640c <ip4_input+0x3a0> if ((ipr->p == NULL) || (((struct ip_reass_helper *)ipr->p->payload)->start != 0)) { 80063b6: | | | | | | | | | | | | | | | | 6863 ldr r3, [r4, #4] 80063b8: | | | | | | | | | | | | | | | | 2b00 cmp r3, #0 80063ba: | | | | | | | | | | | +--|-----|-----|-----------------|----- f000 80e9 beq.w 8006590 <ip4_input+0x524> 80063be: | | | | | | | | | | | | | | | | 6859 ldr r1, [r3, #4] 80063c0: | | | | | | | | | | | | | | | | 888b ldrh r3, [r1, #4] 80063c2: | | | | | | | | | | | | | | | | 2b00 cmp r3, #0 80063c4: | | | | | | | | | | | +--|-----|-----|-----------------|----- f040 80e4 bne.w 8006590 <ip4_input+0x524> q = iprh->next_pbuf; 80063c8: | | | | | | | | | | | | | | | | 682b ldr r3, [r5, #0] while (q != NULL) { 80063ca: | | | | | | | | | | | | | /--|-----|-----------------|----> 2b00 cmp r3, #0 80063cc: | | | | | | | | | | | | | | | /--|-----------------|----- f040 80d8 bne.w 8006580 <ip4_input+0x514> LWIP_ASSERT("sanity check", 80063d0: | | | | | | | | | | | | | | | | | | 42a9 cmp r1, r5 80063d2: | | | | | | | | | | | | | | | | | | /-- d10c bne.n 80063ee <ip4_input+0x382> 80063d4: | | | | | | | | | | | | | | | | | | | b672 cpsid i 80063d6: | | | | | | | | | | | | | | | | | | | 4b9e ldr r3, [pc, #632] @ (8006650 ) 80063d8: | | | | | | | | | | | | | | | | | | | 4a9e ldr r2, [pc, #632] @ (8006654 ) 80063da: | | | | | | | | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80063de: | | | | | | | | | | | | | | | | | | | 4b9e ldr r3, [pc, #632] @ (8006658 ) 80063e0: | | | | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 80063e2: | | | | | | | | | | | | | | | | | | | 489e ldr r0, [pc, #632] @ (800665c ) 80063e4: | | | | | | | | | | | | | | | | | | | f44f 73f0 mov.w r3, #480 @ 0x1e0 80063e8: | | | | | | | | | | | | | | | | | | | f7fa ff86 bl 80012f8 <printf_> 80063ec: | | | | | | | | | | | | | | | | | | | be00 bkpt 0x0000 LWIP_ASSERT("validate_datagram:next_pbuf!=NULL", 80063ee: | | | | | | | | | | | | | | | | | | \-> 682b ldr r3, [r5, #0] 80063f0: | | | | | | | | | | | | +--|--|--|--|-----------------|----- b163 cbz r3, 800640c <ip4_input+0x3a0> 80063f2: | | | | | | | | | | | | | | | | | | b672 cpsid i 80063f4: | | | | | | | | | | | | | | | | | | 4b96 ldr r3, [pc, #600] @ (8006650 ) 80063f6: | | | | | | | | | | | | | | | | | | 4a9a ldr r2, [pc, #616] @ (8006660 ) 80063f8: | | | | | | | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80063fc: | | | | | | | | | | | | | | | | | | 4b96 ldr r3, [pc, #600] @ (8006658 ) 80063fe: | | | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 8006400: | | | | | | | | | | | | | | | | | | 4896 ldr r0, [pc, #600] @ (800665c ) 8006402: | | | | | | | | | | | | | | | | | | f44f 73f1 mov.w r3, #482 @ 0x1e2 8006406: | | | | | | | | | | | | | | | | | | f7fa ff77 bl 80012f8 <printf_> 800640a: | | | | | | | | | | | | | | | | | | be00 bkpt 0x0000 ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount + clen); 800640c: | | | | | | | | | | | | >--|--|--|--|-----------------|----> 4d95 ldr r5, [pc, #596] @ (8006664 ) 800640e: | | | | | | | | | | | | | | | | | | 9a06 ldr r2, [sp, #24] 8006410: | | | | | | | | | | | | | | | | | | f8b5 324a ldrh.w r3, [r5, #586] @ 0x24a 8006414: | | | | | | | | | | | | | | | | | | 441a add r2, r3 if (is_last) { 8006416: | | | | | | | | | | | | | | | | | | 9b09 ldr r3, [sp, #36] @ 0x24 ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount + clen); 8006418: | | | | | | | | | | | | | | | | | | f8a5 224a strh.w r2, [r5, #586] @ 0x24a if (is_last) { 800641c: | | | | | | | | | | | | | | | | | | /-- b93b cbnz r3, 800642e <ip4_input+0x3c2> u16_t datagram_len = (u16_t)(offset + len); 800641e: | | | | | | | | | | | | | | | | | | | e9dd 3207 ldrd r3, r2, [sp, #28] 8006422: | | | | | | | | | | | | | | | | | | | 4413 add r3, r2 ipr->datagram_len = datagram_len; 8006424: | | | | | | | | | | | | | | | | | | | 83a3 strh r3, [r4, #28] ipr->flags |= IP_REASS_FLAG_LASTFRAG; 8006426: | | | | | | | | | | | | | | | | | | | 7fa3 ldrb r3, [r4, #30] 8006428: | | | | | | | | | | | | | | | | | | | f043 0301 orr.w r3, r3, #1 800642c: | | | | | | | | | | | | | | | | | | | 77a3 strb r3, [r4, #30] if (valid == IP_REASS_VALIDATE_TELEGRAM_FINISHED) { 800642e: | | | | | | | | | | | | | | | | | | \-> f1b9 0f01 cmp.w r9, #1 8006432: | | | | | +--|--|--|--|--|--|--|--|--|--|--|-----------------|----- f47f ae38 bne.w 80060a6 <ip4_input+0x3a> r = ((struct ip_reass_helper *)ipr->p->payload)->next_pbuf; 8006436: | | | | | | | | | | | | | | | | | | 6862 ldr r2, [r4, #4] u16_t datagram_len = (u16_t)(ipr->datagram_len + IP_HLEN); 8006438: | | | | | | | | | | | | | | | | | | 8ba3 ldrh r3, [r4, #28] r = ((struct ip_reass_helper *)ipr->p->payload)->next_pbuf; 800643a: | | | | | | | | | | | | | | | | | | 6856 ldr r6, [r2, #4] u16_t datagram_len = (u16_t)(ipr->datagram_len + IP_HLEN); 800643c: | | | | | | | | | | | | | | | | | | 3314 adds r3, #20 r = ((struct ip_reass_helper *)ipr->p->payload)->next_pbuf; 800643e: | | | | | | | | | | | | | | | | | | 6837 ldr r7, [r6, #0] u16_t datagram_len = (u16_t)(ipr->datagram_len + IP_HLEN); 8006440: | | | | | | | | | | | | | | | | | | b29b uxth r3, r3 SMEMCPY(fraghdr, &ipr->iphdr, IP_HLEN); 8006442: | | | | | | | | | | | | | | | | | | f104 0208 add.w r2, r4, #8 8006446: | | | | | | | | | | | | | | | | | | 4631 mov r1, r6 8006448: | | | | | | | | | | | | | | | | | | f104 001c add.w r0, r4, #28 800644c: | | | | | | | | | | | | | | | | | | /-> f852 cb04 ldr.w ip, [r2], #4 8006450: | | | | | | | | | | | | | | | | | | | f841 cb04 str.w ip, [r1], #4 8006454: | | | | | | | | | | | | | | | | | | | 4282 cmp r2, r0 8006456: | | | | | | | | | | | | | | | | | | \-- d1f9 bne.n 800644c <ip4_input+0x3e0> 8006458: | | | | | | | | | | | | | | | | | | ba5b rev16 r3, r3 IPH_LEN_SET(fraghdr, lwip_htons(datagram_len)); 800645a: | | | | | | | | | | | | | | | | | | 8073 strh r3, [r6, #2] IPH_OFFSET_SET(fraghdr, 0); 800645c: | | | | | | | | | | | | | | | | | | 2300 movs r3, #0 800645e: | | | | | | | | | | | | | | | | | | 71b3 strb r3, [r6, #6] 8006460: | | | | | | | | | | | | | | | | | | 71f3 strb r3, [r6, #7] IPH_CHKSUM_SET(fraghdr, 0); 8006462: | | | | | | | | | | | | | | | | | | 72b3 strb r3, [r6, #10] 8006464: | | | | | | | | | | | | | | | | | | 72f3 strb r3, [r6, #11] 8006466: | | | | | | | | | | | | | | | | | | 4630 mov r0, r6 8006468: | | | | | | | | | | | | | | | | | | 2114 movs r1, #20 800646a: | | | | | | | | | | | | | | | | | | f001 fe65 bl 8008138 <lwip_standard_chksum> 800646e: | | | | | | | | | | | | | | | | | | 43c0 mvns r0, r0 IPH_CHKSUM_SET(fraghdr, inet_chksum(fraghdr, IP_HLEN)); 8006470: | | | | | | | | | | | | | | | | | | 8170 strh r0, [r6, #10] p = ipr->p; 8006472: | | | | | | | | | | | | | | | | | | 6866 ldr r6, [r4, #4] while (r != NULL) { 8006474: | | | | | | | | | | | | | | | | | /--------------|----> 2f00 cmp r7, #0 8006476: | | | | | | | | | | | | | | | | | | /-----|----- f040 808e bne.w 8006596 <ip4_input+0x52a> if (ipr == reassdatagrams) { 800647a: | | | | | | | | | | | | | | | | | | | | f8d5 30c4 ldr.w r3, [r5, #196] @ 0xc4 if (ipr_prev->next == ipr) { 800647e: | | | | | | | | | | | | | | | | | | /-----|-----|----> 429c cmp r4, r3 8006480: | | | | | | | | | | | | | | | | | | | | | /-- d003 beq.n 800648a <ip4_input+0x41e> for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) { 8006482: | | | | | | | | | | | | | | | | | | | | | | 461f mov r7, r3 8006484: | | | | | | | | | | | | | | | | | | | | | | 2b00 cmp r3, #0 8006486: | | | | | | | | | | | | | | | | | | | /--|-----|--|-- f040 8093 bne.w 80065b0 <ip4_input+0x544> ip_reass_dequeue_datagram(ipr, ipr_prev); 800648a: | | | | | | | | | | | | | | | | | | | | | | \-> 4620 mov r0, r4 800648c: | | | | | | | | | | | | | | | | | | | | | | 4639 mov r1, r7 800648e: | | | | | | | | | | | | | | | | | | | | | | f7fc f811 bl 80024b4 <ip_reass_dequeue_datagram> clen = pbuf_clen(p); 8006492: | | | | | | | | | | | | | | | | | | | | | | 4630 mov r0, r6 8006494: | | | | | | | | | | | | | | | | | | | | | | f7fc f8c6 bl 8002624 <pbuf_clen> LWIP_ASSERT("ip_reass_pbufcount >= clen", ip_reass_pbufcount >= clen); 8006498: | | | | | | | | | | | | | | | | | | | | | | f8b5 324a ldrh.w r3, [r5, #586] @ 0x24a 800649c: | | | | | | | | | | | | | | | | | | | | | | 4283 cmp r3, r0 clen = pbuf_clen(p); 800649e: | | | | | | | | | | | | | | | | | | | | | | 4604 mov r4, r0 LWIP_ASSERT("ip_reass_pbufcount >= clen", ip_reass_pbufcount >= clen); 80064a0: | | | | | | | | | | | | | | | | | | | | | | /-- d20c bcs.n 80064bc <ip4_input+0x450> 80064a2: | | | | | | | | | | | | | | | | | | | | | | | b672 cpsid i 80064a4: | | | | | | | | | | | | | | | | | | | | | | | 4b6a ldr r3, [pc, #424] @ (8006650 ) 80064a6: | | | | | | | | | | | | | | | | | | | | | | | 4a70 ldr r2, [pc, #448] @ (8006668 ) 80064a8: | | | | | | | | | | | | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80064ac: | | | | | | | | | | | | | | | | | | | | | | | 4b6a ldr r3, [pc, #424] @ (8006658 ) 80064ae: | | | | | | | | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 80064b0: | | | | | | | | | | | | | | | | | | | | | | | 486a ldr r0, [pc, #424] @ (800665c ) 80064b2: | | | | | | | | | | | | | | | | | | | | | | | f240 239b movw r3, #667 @ 0x29b 80064b6: | | | | | | | | | | | | | | | | | | | | | | | f7fa ff1f bl 80012f8 <printf_> 80064ba: | | | | | | | | | | | | | | | | | | | | | | | be00 bkpt 0x0000 ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount - clen); 80064bc: | | | | | | | | | | | | | | | | | | | | | | \-> f8b5 324a ldrh.w r3, [r5, #586] @ 0x24a 80064c0: | | | | | | | | | | | | | | | | | | | | | | 1b1b subs r3, r3, r4 80064c2: | | | | | | | | | | | | | | | | | | | | | | f8a5 324a strh.w r3, [r5, #586] @ 0x24a 80064c6: | | | | | | | | | | | | | | | | | | | | | | 2e00 cmp r6, #0 80064c8: | | | | | +--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|-----|----- f43f aded beq.w 80060a6 <ip4_input+0x3a> iphdr = (const struct ip_hdr *)p->payload; 80064cc: | | | | | | | | | | | | | | | | | | | | | | 6875 ldr r5, [r6, #4] ip_data.current_netif = netif; 80064ce: | | | | | | | | \--|--|--|--|--|--|--|--|--|--|--|--|-----|----> 4c65 ldr r4, [pc, #404] @ (8006664 ) pbuf_remove_header(p, iphdr_hlen); /* Move to payload, no check necessary. */ 80064d0: | | | | | | | | | | | | | | | | | | | | | 9905 ldr r1, [sp, #20] ip_data.current_ip4_header = iphdr; 80064d2: | | | | | | | | | | | | | | | | | | | | | f8c4 5120 str.w r5, [r4, #288] @ 0x120 ip_data.current_input_netif = inp; 80064d6: | | | | | | | | | | | | | | | | | | | | | e9c4 8a46 strd r8, sl, [r4, #280] @ 0x118 ip_data.current_ip_header_tot_len = IPH_HL_BYTES(iphdr); 80064da: | | | | | | | | | | | | | | | | | | | | | 782b ldrb r3, [r5, #0] 80064dc: | | | | | | | | | | | | | | | | | | | | | f003 030f and.w r3, r3, #15 80064e0: | | | | | | | | | | | | | | | | | | | | | 009b lsls r3, r3, #2 pbuf_remove_header(p, iphdr_hlen); /* Move to payload, no check necessary. */ 80064e2: | | | | | | | | | | | | | | | | | | | | | 4630 mov r0, r6 ip_data.current_ip_header_tot_len = IPH_HL_BYTES(iphdr); 80064e4: | | | | | | | | | | | | | | | | | | | | | f8a4 3124 strh.w r3, [r4, #292] @ 0x124 pbuf_remove_header(p, iphdr_hlen); /* Move to payload, no check necessary. */ 80064e8: | | | | | | | | | | | | | | | | | | | | | f7fc f86a bl 80025c0 <pbuf_remove_header> switch (IPH_PROTO(iphdr)) { 80064ec: | | | | | | | | | | | | | | | | | | | | | 7a6d ldrb r5, [r5, #9] 80064ee: | | | | | | | | | | | | | | | | | | | | | 2d06 cmp r5, #6 80064f0: | | | | | | | | /--|--|--|--|--|--|--|--|--|--|--|--|-----|----- f000 816f beq.w 80067d2 <ip4_input+0x766> 80064f4: | | | | | | | | | | | | | | | | | | | | | | 2d11 cmp r5, #17 80064f6: | | | | | | | | | | | | | | | | | | | | | /--|----- d078 beq.n 80065ea <ip4_input+0x57e> 80064f8: | | | | | | | | | | | | | | | | | | | | | | | 2d01 cmp r5, #1 80064fa: | | | | | /--------|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|----- f001 8022 beq.w 8007542 <ip4_input+0x14d6> if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) && 80064fe: | | | | | | | | | | | | | | | | | | | | | | | | f8d4 512c ldr.w r5, [r4, #300] @ 0x12c 8006502: | | | | | | | | | | | | | | | | | | | | | | | | 4641 mov r1, r8 8006504: | | | | | | | | | | | | | | | | | | | | | | | | 4628 mov r0, r5 8006506: | | | | | | | | | | | | | | | | | | | | | | | | f001 fda3 bl 8008050 <ip4_addr_isbroadcast_u32> 800650a: | | | | | | | | | | | | | | | | | | | | | | | | /-- b968 cbnz r0, 8006528 <ip4_input+0x4bc> !ip4_addr_ismulticast(ip4_current_dest_addr())) { 800650c: | | | | | | | | | | | | | | | | | | | | | | | | | f005 05f0 and.w r5, r5, #240 @ 0xf0 if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) && 8006510: | | | | | | | | | | | | | | | | | | | | | | | | | 2de0 cmp r5, #224 @ 0xe0 8006512: | | | | | | | | | | | | | | | | | | | | | | | | +-- d009 beq.n 8006528 <ip4_input+0x4bc> return pbuf_add_header_impl(p, (size_t)header_size_increment, force); 8006514: | | | | | | | | | | | | | | | | | | | | | | | | | 9905 ldr r1, [sp, #20] 8006516: | | | | | | | | | | | | | | | | | | | | | | | | | 2201 movs r2, #1 8006518: | | | | | | | | | | | | | | | | | | | | | | | | | 4630 mov r0, r6 800651a: | | | | | | | | | | | | | | | | | | | | | | | | | f7fc f819 bl 8002550 <pbuf_add_header_impl.lto_priv.0> icmp_send_response(p, ICMP_DUR, t); 800651e: | | | | | | | | | | | | | | | | | | | | | | | | | 2202 movs r2, #2 8006520: | | | | | | | | | | | | | | | | | | | | | | | | | 2103 movs r1, #3 8006522: | | | | | | | | | | | | | | | | | | | | | | | | | 4630 mov r0, r6 8006524: | | | | | | | | | | | | | | | | | | | | | | | | | f7ff fc58 bl 8005dd8 <icmp_send_response> IP_STATS_INC(ip.proterr); 8006528: | | | | | | | | | | | | | | | | | | | | | | | | \-> 88a3 ldrh r3, [r4, #4] 800652a: | | | | | | | | | | | | | | | | | | | | | | | | 3301 adds r3, #1 800652c: | | | | | | | | | | | | | | | | | | | | | | | | 80a3 strh r3, [r4, #4] IP_STATS_INC(ip.drop); 800652e: | | | | | | | | | | | | | | | | | | | | | | | | f834 3c06 ldrh.w r3, [r4, #-6] 8006532: | | | | | | | | | | | | | | | | | | | | | | | | 3301 adds r3, #1 8006534: | | | | | | | | | | | | | | | | | | | | | | | | f824 3c06 strh.w r3, [r4, #-6] 8006538: | | | | | /-----|--------|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|----- e085 b.n 8006646 <ip4_input+0x5da> if (iprh->end > iprh_tmp->start) { 800653a: | | | | | | | | | | | | | | | | | | | | | | | | \----> 4570 cmp r0, lr 800653c: | | | | | | | | | +--|--|--|--|--|--|--|--|--|--|--|--|--|--|-------- d83a bhi.n 80065b4 <ip4_input+0x548> ipr->p = new_p; 800653e: | | | | | | | | | | | | | | | | | | | | | | | | /----> 6066 str r6, [r4, #4] 8006540: | | | | | | | | | | | | | | | | | | \--|--|--|--|--|--|----- e72f b.n 80063a2 <ip4_input+0x336> } else if (iprh->start == iprh_tmp->start) { 8006542: | | | | | | | | | +--|--|--|--|--|--|--\--|-----|--|--|--|--|--|----X d037 beq.n 80065b4 <ip4_input+0x548> } else if (iprh->start < iprh_tmp->end) { 8006544: | | | | | | | | | | | | | | | | | | | | | | | f8bc 2006 ldrh.w r2, [ip, #6] 8006548: | | | | | | | | | | | | | | | | | | | | | | | 429a cmp r2, r3 800654a: | | | | | | | | | +--|--|--|--|--|--|-----|-----|--|--|--|--|--|----- d833 bhi.n 80065b4 <ip4_input+0x548> if (iprh_prev != NULL) { 800654c: | | | | | | | | | | | | | | | | | | | | | | | /-- b127 cbz r7, 8006558 <ip4_input+0x4ec> if (iprh_prev->end != iprh_tmp->start) { 800654e: | | | | | | | | | | | | | | | | | | | | | | | | 88fa ldrh r2, [r7, #6] valid = 0; 8006550: | | | | | | | | | | | | | | | | | | | | | | | | 4572 cmp r2, lr 8006552: | | | | | | | | | | | | | | | | | | | | | | | | bf18 it ne 8006554: | | | | | | | | | | | | | | | | | | | | | | | | f04f 0900 movne.w r9, #0 q = iprh_tmp->next_pbuf; 8006558: | | | | | | | | | | | | | | | | | | | | | | | \-> f8dc 2000 ldr.w r2, [ip] iprh_prev = iprh_tmp; 800655c: | | | | | | | | | | | | | | | | | | | | | | | 4667 mov r7, ip 800655e: | | | | | | | | | | | \--|--|--|--|-----|-----|--|--|--|--|--|----- e6ba b.n 80062d6 <ip4_input+0x26a> LWIP_ASSERT("no previous fragment, this must be the first fragment!", 8006560: | | | | | | | | | | | \--|--|--|-----|-----|--|--|--|--|--|----> 2900 cmp r1, #0 8006562: | | | | | | | | | | | | | | | | | | | | +----- d0ec beq.n 800653e <ip4_input+0x4d2> 8006564: | | | | | | | | | | | | | | | | | | | | | b672 cpsid i 8006566: | | | | | | | | | | | | | | | | | | | | | 4b3a ldr r3, [pc, #232] @ (8006650 ) 8006568: | | | | | | | | | | | | | | | | | | | | | 4a40 ldr r2, [pc, #256] @ (800666c ) 800656a: | | | | | | | | | | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 800656e: | | | | | | | | | | | | | | | | | | | | | 4b3a ldr r3, [pc, #232] @ (8006658 ) 8006570: | | | | | | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 8006572: | | | | | | | | | | | | | | | | | | | | | 483a ldr r0, [pc, #232] @ (800665c ) 8006574: | | | | | | | | | | | | | | | | | | | | | f44f 73df mov.w r3, #446 @ 0x1be 8006578: | | | | | | | | | | | | | | | | | | | | | f7fa febe bl 80012f8 <printf_> 800657c: | | | | | | | | | | | | | | | | | | | | | be00 bkpt 0x0000 800657e: | | | | | | | | | | | | | | | | | | | | \----- e7de b.n 800653e <ip4_input+0x4d2> iprh = (struct ip_reass_helper *)q->payload; 8006580: | | | | | | | | | | | | | | \-----|--|--|--|--|-------> 685a ldr r2, [r3, #4] if (iprh_prev->end != iprh->start) { 8006582: | | | | | | | | | | | | | | | | | | | 88e8 ldrh r0, [r5, #6] 8006584: | | | | | | | | | | | | | | | | | | | 8893 ldrh r3, [r2, #4] 8006586: | | | | | | | | | | | | | | | | | | | 4298 cmp r0, r3 8006588: | | | | | | | | | | | +--|--|-----------|--|--|--|--|-------- d102 bne.n 8006590 <ip4_input+0x524> q = iprh->next_pbuf; 800658a: | | | | | | | | | | | | | | | | | | | 6813 ldr r3, [r2, #0] iprh = (struct ip_reass_helper *)q->payload; 800658c: | | | | | | | | | | | | | | | | | | | 4615 mov r5, r2 800658e: | | | | | | | | | | | | | \-----------|--|--|--|--|-------- e71c b.n 80063ca <ip4_input+0x35e> return IP_REASS_VALIDATE_PBUF_QUEUED; /* not yet valid! */ 8006590: | | | | | | | | | | | \--|--------------|--|--|--|--|-------> f04f 0900 mov.w r9, #0 8006594: | | | | | | | | | | | \--------------|--|--|--|--|-------- e73a b.n 800640c <ip4_input+0x3a0> iprh = (struct ip_reass_helper *)r->payload; 8006596: | | | | | | | | | | | | | | \--|-------> f8d7 9004 ldr.w r9, [r7, #4] pbuf_remove_header(r, IP_HLEN); 800659a: | | | | | | | | | | | | | | | 2114 movs r1, #20 800659c: | | | | | | | | | | | | | | | 4638 mov r0, r7 800659e: | | | | | | | | | | | | | | | f7fc f80f bl 80025c0 <pbuf_remove_header> pbuf_cat(p, r); 80065a2: | | | | | | | | | | | | | | | 4639 mov r1, r7 80065a4: | | | | | | | | | | | | | | | 4630 mov r0, r6 80065a6: | | | | | | | | | | | | | | | f7fc f869 bl 800267c <pbuf_cat> r = iprh->next_pbuf; 80065aa: | | | | | | | | | | | | | | | f8d9 7000 ldr.w r7, [r9] 80065ae: | | | | | | | | | | | \--|--|-----|-------- e761 b.n 8006474 <ip4_input+0x408> if (ipr_prev->next == ipr) { 80065b0: | | | | | | | | | | | | \-----|-------> 683b ldr r3, [r7, #0] 80065b2: | | | | | | | | | | | \--------|-------- e764 b.n 800647e <ip4_input+0x412> if (ipr->p == NULL) { 80065b4: | | | | | | | | | \--|--------------------------------------|-------> 6863 ldr r3, [r4, #4] 80065b6: | | | | | | | | | | | 2b00 cmp r3, #0 80065b8: | | | | | | | | +-----|--------------------------------------|-------- f47f adde bne.w 8006178 <ip4_input+0x10c> LWIP_ASSERT("not firstalthough just enqueued", ipr == reassdatagrams); 80065bc: | | | | | | | | | | | 4b29 ldr r3, [pc, #164] @ (8006664 ) 80065be: | | | | | | | | | | | f8d3 30c4 ldr.w r3, [r3, #196] @ 0xc4 80065c2: | | | | | | | | | | | 429c cmp r4, r3 80065c4: | | | | | | | | | | | /-- d00c beq.n 80065e0 <ip4_input+0x574> 80065c6: | | | | | | | | | | | | b672 cpsid i 80065c8: | | | | | | | | | | | | 4b21 ldr r3, [pc, #132] @ (8006650 ) 80065ca: | | | | | | | | | | | | 4a29 ldr r2, [pc, #164] @ (8006670 ) 80065cc: | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 80065d0: | | | | | | | | | | | | 4b21 ldr r3, [pc, #132] @ (8006658 ) 80065d2: | | | | | | | | | | | | 9300 str r3, [sp, #0] 80065d4: | | | | | | | | | | | | 4821 ldr r0, [pc, #132] @ (800665c ) 80065d6: | | | | | | | | | | | | f240 23ab movw r3, #683 @ 0x2ab 80065da: | | | | | | | | | | | | f7fa fe8d bl 80012f8 <printf_> 80065de: | | | | | | | | | | | | be00 bkpt 0x0000 ip_reass_dequeue_datagram(ipr, NULL); 80065e0: | | | | | | | | | | | \-> 2100 movs r1, #0 80065e2: | | | | | | | | | | | 4620 mov r0, r4 80065e4: | | | | | | | | | | | f7fb ff66 bl 80024b4 <ip_reass_dequeue_datagram> 80065e8: | | | | | | | | \-----|--------------------------------------|-------- e5c6 b.n 8006178 <ip4_input+0x10c> UDP_STATS_INC(udp.recv); 80065ea: | | | | | | | | | \-------> 8ce3 ldrh r3, [r4, #38] @ 0x26 80065ec: | | | | | | | | | 3301 adds r3, #1 80065ee: | | | | | | | | | 84e3 strh r3, [r4, #38] @ 0x26 if (p->len < UDP_HLEN) { 80065f0: | | | | | | | | | 8973 ldrh r3, [r6, #10] 80065f2: | | | | | | | | | 2b07 cmp r3, #7 80065f4: | | | | | | | | | /-- d806 bhi.n 8006604 <ip4_input+0x598> UDP_STATS_INC(udp.lenerr); 80065f6: | | | | | | | | | | 8de3 ldrh r3, [r4, #46] @ 0x2e 80065f8: | | | | | | | | | | 3301 adds r3, #1 80065fa: | | | | | | | | | | 85e3 strh r3, [r4, #46] @ 0x2e UDP_STATS_INC(udp.drop); 80065fc: | | | | | | | | | /-----------------------------|-> 8d63 ldrh r3, [r4, #42] @ 0x2a 80065fe: | | | | | | | | | | | 3301 adds r3, #1 8006600: | | | | | | | | | | | 8563 strh r3, [r4, #42] @ 0x2a pbuf_free(p); 8006602: | | | | | +-----|--------|--------|--------------|-----------------------------|-- e020 b.n 8006646 <ip4_input+0x5da> broadcast = ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif()); 8006604: | | | | | | | | | | \-> f8d4 812c ldr.w r8, [r4, #300] @ 0x12c 8006608: | | | | | | | | | | f8d4 1118 ldr.w r1, [r4, #280] @ 0x118 udphdr = (struct udp_hdr *)p->payload; 800660c: | | | | | | | | | | f8d6 9004 ldr.w r9, [r6, #4] broadcast = ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif()); 8006610: | | | | | | | | | | 4640 mov r0, r8 8006612: | | | | | | | | | | f001 fd1d bl 8008050 <ip4_addr_isbroadcast_u32> 8006616: | | | | | | | | | | 9005 str r0, [sp, #20] dest = lwip_ntohs(udphdr->dest); 8006618: | | | | | | | | | | f8b9 3002 ldrh.w r3, [r9, #2] src = lwip_ntohs(udphdr->src); 800661c: | | | | | | | | | | f8b9 7000 ldrh.w r7, [r9] 8006620: | | | | | | | | | | ba5b rev16 r3, r3 8006622: | | | | | | | | | | ba7f rev16 r7, r7 8006624: | | | | | | | | | | fa1f fc83 uxth.w ip, r3 uncon_pcb = NULL; 8006628: | | | | | | | | | | 2500 movs r5, #0 for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { 800662a: | | | | | | | | | | f8d4 3108 ldr.w r3, [r4, #264] @ 0x108 800662e: | | | | | | | | | | 9306 str r3, [sp, #24] 8006630: | | | | | | | | | | b2bf uxth r7, r7 prev = NULL; 8006632: | | | | | | | | | | 4629 mov r1, r5 for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { 8006634: | | | | | | | | | | /--------------------------/-X b9f3 cbnz r3, 8006674 <ip4_input+0x608> if (pcb != NULL) { 8006636: | | | | | | | | | | | | 2d00 cmp r5, #0 8006638: | | | | | | | | | | | /-----------------------|-- d161 bne.n 80066fe <ip4_input+0x692> if (for_us) { 800663a: | | | | | | | | | | | | | f8da 2000 ldr.w r2, [sl] 800663e: | | | | | | | | | | | | | f8d4 312c ldr.w r3, [r4, #300] @ 0x12c 8006642: | | | | | | | | | | | | | 429a cmp r2, r3 8006644: | | | | | | | | | | | +-----------------------|-- d05b beq.n 80066fe <ip4_input+0x692> pbuf_free(p); 8006646: | | | | | >-----|--------|--------|--------------|--|--|-----------------------|-> 4630 mov r0, r6 8006648: | | | | | | | | | | | | | f003 fbb8 bl 8009dbc <pbuf_free.isra.0> break; 800664c: | | | | | | /--|--------|--------|--------------|--|--|-----------------------|-- e096 b.n 800677c <ip4_input+0x710> 800664e: | | | | | | | | | | | | | | bf00 nop 8006650: | | | | | | | | | | | | | | 20000060 .word 0x20000060 8006654: | | | | | | | | | | | | | | 0800c590 .word 0x0800c590 8006658: | | | | | | | | | | | | | | 0800b87f .word 0x0800b87f 800665c: | | | | | | | | | | | | | | 0800b232 .word 0x0800b232 8006660: | | | | | | | | | | | | | | 0800c59d .word 0x0800c59d 8006664: | | | | | | | | | | | | | | 20001158 .word 0x20001158 8006668: | | | | | | | | | | | | | | 0800c5bf .word 0x0800c5bf 800666c: | | | | | | | | | | | | | | 0800c559 .word 0x0800c559 8006670: | | | | | | | | | | | | | | 0800c5da .word 0x0800c5da if ((pcb->local_port == dest) && 8006674: | | | | | | | | | | | | | \-> 8a5a ldrh r2, [r3, #18] 8006676: | | | | | | | | | | | | | 4562 cmp r2, ip 8006678: | | | | | | | | | | | | | /----------------------- d157 bne.n 800672a <ip4_input+0x6be> if ((pcb->netif_idx != NETIF_NO_INDEX) && 800667a: | | | | | | | | | | | | | | f893 e008 ldrb.w lr, [r3, #8] 800667e: | | | | | | | | | | | | | | f1be 0f00 cmp.w lr, #0 8006682: | | | | | | | | | | | | | | /-- d007 beq.n 8006694 <ip4_input+0x628> (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) { 8006684: | | | | | | | | | | | | | | | f8d4 211c ldr.w r2, [r4, #284] @ 0x11c 8006688: | | | | | | | | | | | | | | | f892 2038 ldrb.w r2, [r2, #56] @ 0x38 800668c: | | | | | | | | | | | | | | | 3201 adds r2, #1 if ((pcb->netif_idx != NETIF_NO_INDEX) && 800668e: | | | | | | | | | | | | | | | b2d2 uxtb r2, r2 8006690: | | | | | | | | | | | | | | | 4596 cmp lr, r2 8006692: | | | | | | | | | | | | | +--------------------|-- d14a bne.n 800672a <ip4_input+0x6be> if (broadcast != 0) { 8006694: | | | | | | | | | | | | | | \-> 9a05 ldr r2, [sp, #20] if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) || 8006696: | | | | | | | | | | | | | | f8d3 e000 ldr.w lr, [r3] if (broadcast != 0) { 800669a: | | | | | | | | | | | | | | 2a00 cmp r2, #0 800669c: | | | | | | | | | | | | | | /----------------- d040 beq.n 8006720 <ip4_input+0x6b4> if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) || 800669e: | | | | | | | | | | | | | | | f1be 0f00 cmp.w lr, #0 80066a2: | | | | | | | | | | | | | | /--|----------------- d009 beq.n 80066b8 <ip4_input+0x64c> 80066a4: | | | | | | | | | | | | | | | | f1b8 3fff cmp.w r8, #4294967295 @ 0xffffffff 80066a8: | | | | | | | | | | | | | | +--|----------------- d006 beq.n 80066b8 <ip4_input+0x64c> ip4_addr_net_eq(ip_2_ip4(&pcb->local_ip), ip4_current_dest_addr(), netif_ip4_netmask(inp))) { 80066aa: | | | | | | | | | | | | | | | | f8da 2004 ldr.w r2, [sl, #4] 80066ae: | | | | | | | | | | | | | | | | ea88 0b0e eor.w fp, r8, lr ((ip4_current_dest_addr()->addr == IPADDR_BROADCAST)) || 80066b2: | | | | | | | | | | | | | | | | ea1b 0f02 tst.w fp, r2 80066b6: | | | | | | | | | | | | | +--|--|----------------- d138 bne.n 800672a <ip4_input+0x6be> if ((pcb->flags & UDP_FLAGS_CONNECTED) == 0) { 80066b8: | | | | | | | | | | | | | | >--|----------------> 7c1a ldrb r2, [r3, #16] 80066ba: | | | | | | | | | | | | | | | | 0752 lsls r2, r2, #29 80066bc: | | | | | | | | | | | | | | | | /-------------- d40e bmi.n 80066dc <ip4_input+0x670> if (uncon_pcb == NULL) { 80066be: | | | | | | | | | | | | | | | | | 2d00 cmp r5, #0 80066c0: | | | | | | | | | | | | | | | | | /----------- d036 beq.n 8006730 <ip4_input+0x6c4> } else if (broadcast && ip4_current_dest_addr()->addr == IPADDR_BROADCAST) { 80066c2: | | | | | | | | | | | | | | | | | | 9a05 ldr r2, [sp, #20] 80066c4: | | | | | | | | | | | | | | | | +--|----------- b152 cbz r2, 80066dc <ip4_input+0x670> 80066c6: | | | | | | | | | | | | | | | | | | f1b8 3fff cmp.w r8, #4294967295 @ 0xffffffff 80066ca: | | | | | | | | | | | | | | | | +--|----------- d107 bne.n 80066dc <ip4_input+0x670> if (!IP_IS_V4_VAL(uncon_pcb->local_ip) || !ip4_addr_eq(ip_2_ip4(&uncon_pcb->local_ip), netif_ip4_addr(inp))) { 80066cc: | | | | | | | | | | | | | | | | | | f8da 2000 ldr.w r2, [sl] 80066d0: | | | | | | | | | | | | | | | | | | 6828 ldr r0, [r5, #0] 80066d2: | | | | | | | | | | | | | | | | | | 4290 cmp r0, r2 80066d4: | | | | | | | | | | | | | | | | +--|----------- d002 beq.n 80066dc <ip4_input+0x670> uncon_pcb = pcb; 80066d6: | | | | | | | | | | | | | | | | | | 4572 cmp r2, lr 80066d8: | | | | | | | | | | | | | | | | | | bf08 it eq 80066da: | | | | | | | | | | | | | | | | | | 461d moveq r5, r3 if ((pcb->remote_port == src) && 80066dc: | | | | | | | | | | | | | | | | >--|----------> 8a9a ldrh r2, [r3, #20] 80066de: | | | | | | | | | | | | | | | | | | 42ba cmp r2, r7 80066e0: | | | | | | | | | | | | | +--|--|--|--|----------- d123 bne.n 800672a <ip4_input+0x6be> (ip_addr_isany_val(pcb->remote_ip) || 80066e2: | | | | | | | | | | | | | | | | | | 685a ldr r2, [r3, #4] if ((pcb->remote_port == src) && 80066e4: | | | | | | | | | | | | | | | | | | /-- b11a cbz r2, 80066ee <ip4_input+0x682> (ip_addr_isany_val(pcb->remote_ip) || 80066e6: | | | | | | | | | | | | | | | | | | | f8d4 0128 ldr.w r0, [r4, #296] @ 0x128 80066ea: | | | | | | | | | | | | | | | | | | | 4282 cmp r2, r0 80066ec: | | | | | | | | | | | | | +--|--|--|--|--------|-- d11d bne.n 800672a <ip4_input+0x6be> if (prev != NULL) { 80066ee: | | | | | | | | | | | | | | | | | | /-----\-X b309 cbz r1, 8006734 <ip4_input+0x6c8> prev->next = pcb->next; 80066f0: | | | | | | | | | | | | | | | | | | | 68da ldr r2, [r3, #12] 80066f2: | | | | | | | | | | | | | | | | | | | 60ca str r2, [r1, #12] pcb->next = udp_pcbs; 80066f4: | | | | | | | | | | | | | | | | | | | 9a06 ldr r2, [sp, #24] 80066f6: | | | | | | | | | | | | | | | | | | | 60da str r2, [r3, #12] udp_pcbs = pcb; 80066f8: | | | | | | | | | | | | | | | | | | | f8c4 3108 str.w r3, [r4, #264] @ 0x108 for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { 80066fc: | | | | | | | | | | | | | | | | | | | /----> 461d mov r5, r3 if (udphdr->chksum != 0) { 80066fe: | | | | | | | | | | | | \--|--|--|--|--|--|--|----> f8b9 3006 ldrh.w r3, [r9, #6] 8006702: | | | | | | | | | | | | | | | | | | | /-- b1db cbz r3, 800673c <ip4_input+0x6d0> return inet_chksum_pseudo(p, proto, proto_len, ip_2_ip4(src), ip_2_ip4(dest)); 8006704: | | | | | | | | | | | | | | | | | | | | 8932 ldrh r2, [r6, #8] 8006706: | | | | | | | | | | | | | | | | | | | | f8cd 8000 str.w r8, [sp] 800670a: | | | | | | | | | | | | | | | | | | | | f8d4 3128 ldr.w r3, [r4, #296] @ 0x128 800670e: | | | | | | | | | | | | | | | | | | | | 2111 movs r1, #17 8006710: | | | | | | | | | | | | | | | | | | | | 4630 mov r0, r6 8006712: | | | | | | | | | | | | | | | | | | | | f003 f8d9 bl 80098c8 <inet_chksum_pseudo.isra.0> if (ip_chksum_pseudo(p, IP_PROTO_UDP, p->tot_len, 8006716: | | | | | | | | | | | | | | | | | | | +-- b188 cbz r0, 800673c <ip4_input+0x6d0> UDP_STATS_INC(udp.chkerr); 8006718: | | | | | | | | | | | | | | | | | | | | 8da3 ldrh r3, [r4, #44] @ 0x2c 800671a: | | | | | | | | | | | | | | | | | | | | 3301 adds r3, #1 800671c: | | | | | | | | | | | | | | | | | | | | 85a3 strh r3, [r4, #44] @ 0x2c UDP_STATS_INC(udp.drop); 800671e: | | | | | | | | | | +--|-----|--|--|--|--|--|--|--|-- e76d b.n 80065fc <ip4_input+0x590> if (ip_addr_isany(&pcb->local_ip) || ip_addr_eq(&pcb->local_ip, ip_current_dest_addr())) { 8006720: | | | | | | | | | | | | | | \--|--|--|--|--|-> f1be 0f00 cmp.w lr, #0 8006724: | | | | | | | | | | | | | +-----|--|--|--|--|-- d0c8 beq.n 80066b8 <ip4_input+0x64c> 8006726: | | | | | | | | | | | | | | | | | | | 45f0 cmp r8, lr 8006728: | | | | | | | | | | | | | \-----|--|--|--|--|-- d0c6 beq.n 80066b8 <ip4_input+0x64c> prev = pcb; 800672a: | | | | | | | | | | | | \--------|--|--|--|--|-> 4619 mov r1, r3 for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { 800672c: | | | | | | | | | | | | | | | | | 68db ldr r3, [r3, #12] 800672e: | | | | | | | | | | | \--------------|--|--|--|--|-- e781 b.n 8006634 <ip4_input+0x5c8> uncon_pcb = pcb; 8006730: | | | | | | | | | | | | \--|--|--|-> 461d mov r5, r3 8006732: | | | | | | | | | | | \-----|--|--|-- e7d3 b.n 80066dc <ip4_input+0x670> UDP_STATS_INC(udp.cachehit); 8006734: | | | | | | | | | | | \--|--|-> 8f62 ldrh r2, [r4, #58] @ 0x3a 8006736: | | | | | | | | | | | | | 3201 adds r2, #1 8006738: | | | | | | | | | | | | | 8762 strh r2, [r4, #58] @ 0x3a if (pcb == NULL) { 800673a: | | | | | | | | | | | \--|-- e7df b.n 80066fc <ip4_input+0x690> if (pbuf_remove_header(p, UDP_HLEN)) { 800673c: | | | | | | | | | | | \-> 2108 movs r1, #8 800673e: | | | | | | | | | | | 4630 mov r0, r6 8006740: | | | | | | | | | | | f7fb ff3e bl 80025c0 <pbuf_remove_header> 8006744: | | | | | | | | | | | /-- b168 cbz r0, 8006762 <ip4_input+0x6f6> LWIP_ASSERT("pbuf_remove_header failed", 0); 8006746: | | | | | | | | | | | | b672 cpsid i 8006748: | | | | | | | | | | | | 4ba7 ldr r3, [pc, #668] @ (80069e8 ) 800674a: | | | | | | | | | | | | 4aa8 ldr r2, [pc, #672] @ (80069ec ) 800674c: | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8006750: | | | | | | | | | | | | 4ba7 ldr r3, [pc, #668] @ (80069f0 ) 8006752: | | | | | | | | | | | | 9300 str r3, [sp, #0] 8006754: | | | | | | | | | | | | 48a7 ldr r0, [pc, #668] @ (80069f4 ) 8006756: | | | | | | | | | | | | f44f 73b8 mov.w r3, #368 @ 0x170 800675a: | | | | | | | | | | | | f7fa fdcd bl 80012f8 <printf_> 800675e: | | | | | | | | | | | | be00 bkpt 0x0000 8006760: | | | | | | | | | | +-----------------------------|-- e74c b.n 80065fc <ip4_input+0x590> if (pcb != NULL) { 8006762: | | | | | | | | | | | /--\-X b1ad cbz r5, 8006790 <ip4_input+0x724> if (pcb->recv != NULL) { 8006764: | | | | | | | | | | | | f8d5 8018 ldr.w r8, [r5, #24] 8006768: | | | | | | | | | | | | f1b8 0f00 cmp.w r8, #0 800676c: | | | | | +--|--|--------|--------|--------------|--------------------------|----- f43f af6b beq.w 8006646 <ip4_input+0x5da> pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src); 8006770: | | | | | | | | | | | | 9700 str r7, [sp, #0] 8006772: | | | | | | | | | | | | 4ba1 ldr r3, [pc, #644] @ (80069f8 ) 8006774: | | | | | | | | | | | | 69e8 ldr r0, [r5, #28] 8006776: | | | | | | | | | | | | 4632 mov r2, r6 8006778: | | | | | | | | | | | | 4629 mov r1, r5 800677a: | | | | | | | | | | | | 47c0 blx r8 ip_data.current_netif = NULL; 800677c: | | | | | | >--|--------|--------|--------------|--------------------------|----> 2300 movs r3, #0 ip_data.current_input_netif = NULL; 800677e: | | | | | | | | | | | | e9c4 3346 strd r3, r3, [r4, #280] @ 0x118 ip4_addr_set_any(ip4_current_dest_addr()); 8006782: | | | | | | | | | | | | e9c4 334a strd r3, r3, [r4, #296] @ 0x128 ip_data.current_ip4_header = NULL; 8006786: | | | | | | | | | | | | f8c4 3120 str.w r3, [r4, #288] @ 0x120 ip_data.current_ip_header_tot_len = 0; 800678a: | | | | | | | | | | | | f8a4 3124 strh.w r3, [r4, #292] @ 0x124 return ERR_OK; 800678e: | | | | | | | | \--------|--------------|--------------------------|----- e48a b.n 80060a6 <ip4_input+0x3a> if (!broadcast && !ip_addr_ismulticast(ip_current_dest_addr())) { 8006790: | | | | | | | | | | \----> 9b05 ldr r3, [sp, #20] 8006792: | | | | | | | | | | /-------- b9ab cbnz r3, 80067c0 <ip4_input+0x754> 8006794: | | | | | | | | | | | f8d4 312c ldr.w r3, [r4, #300] @ 0x12c 8006798: | | | | | | | | | | | f003 03f0 and.w r3, r3, #240 @ 0xf0 800679c: | | | | | | | | | | | 2be0 cmp r3, #224 @ 0xe0 800679e: | | | | | | | | | | +-------- d00f beq.n 80067c0 <ip4_input+0x754> pbuf_header_force(p, (s16_t)(ip_current_header_tot_len() + UDP_HLEN)); 80067a0: | | | | | | | | | | | f8b4 3124 ldrh.w r3, [r4, #292] @ 0x124 80067a4: | | | | | | | | | | | 3308 adds r3, #8 80067a6: | | | | | | | | | | | b299 uxth r1, r3 80067a8: | | | | | | | | | | | b21b sxth r3, r3 if (header_size_increment < 0) { 80067aa: | | | | | | | | | | | 2b00 cmp r3, #0 80067ac: | | | | | | | | | | | /----- da0c bge.n 80067c8 <ip4_input+0x75c> return pbuf_remove_header(p, (size_t) - header_size_increment); 80067ae: | | | | | | | | | | | | 4259 negs r1, r3 80067b0: | | | | | | | | | | | | 4630 mov r0, r6 80067b2: | | | | | | | | | | | | f7fb ff05 bl 80025c0 <pbuf_remove_header> 80067b6: | | | | | | | | | | | | /-> 2203 movs r2, #3 80067b8: | | | | | | | | | | | | | 4611 mov r1, r2 80067ba: | | | | | | | | | | | | | 4630 mov r0, r6 80067bc: | | | | | | | | | | | | | f7ff fb0c bl 8005dd8 <icmp_send_response> UDP_STATS_INC(udp.proterr); 80067c0: | | | | | | | | | | \--|--|-> 8ea3 ldrh r3, [r4, #52] @ 0x34 80067c2: | | | | | | | | | | | | 3301 adds r3, #1 80067c4: | | | | | | | | | | | | 86a3 strh r3, [r4, #52] @ 0x34 UDP_STATS_INC(udp.drop); 80067c6: | | | | | | | | | \--------------------------|--|-- e719 b.n 80065fc <ip4_input+0x590> return pbuf_add_header_impl(p, (size_t)header_size_increment, force); 80067c8: | | | | | | | | | \--|-> 2201 movs r2, #1 80067ca: | | | | | | | | | | 4630 mov r0, r6 80067cc: | | | | | | | | | | f7fb fec0 bl 8002550 <pbuf_add_header_impl.lto_priv.0> 80067d0: | | | | | | | | | \-- e7f1 b.n 80067b6 <ip4_input+0x74a> TCP_STATS_INC(tcp.recv); 80067d2: | | | | | | | | \----------------------------------------------> 8fe3 ldrh r3, [r4, #62] @ 0x3e if (p->len < TCP_HLEN) { 80067d4: | | | | | | | | f8b6 800a ldrh.w r8, [r6, #10] tcphdr = (struct tcp_hdr *)p->payload; 80067d8: | | | | | | | | 4f83 ldr r7, [pc, #524] @ (80069e8 ) 80067da: | | | | | | | | f8d6 a004 ldr.w sl, [r6, #4] 80067de: | | | | | | | | f8c7 a134 str.w sl, [r7, #308] @ 0x134 TCP_STATS_INC(tcp.recv); 80067e2: | | | | | | | | 3301 adds r3, #1 if (p->len < TCP_HLEN) { 80067e4: | | | | | | | | f1b8 0f13 cmp.w r8, #19 TCP_STATS_INC(tcp.recv); 80067e8: | | | | | | | | 87e3 strh r3, [r4, #62] @ 0x3e if (p->len < TCP_HLEN) { 80067ea: | | | | | | | | /-- d805 bhi.n 80067f8 <ip4_input+0x78c> TCP_STATS_INC(tcp.lenerr); 80067ec: | | | | | | | | /--------------|-> f8b4 3046 ldrh.w r3, [r4, #70] @ 0x46 80067f0: | | | | | | | | | | 3301 adds r3, #1 80067f2: | | | | | | | | | | f8a4 3046 strh.w r3, [r4, #70] @ 0x46 goto dropped; 80067f6: | | | | | | | | | /--------|-- e012 b.n 800681e <ip4_input+0x7b2> if (ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif()) || 80067f8: | | | | | | | | | | \-> f8d4 212c ldr.w r2, [r4, #300] @ 0x12c 80067fc: | | | | | | | | | | f8d4 1118 ldr.w r1, [r4, #280] @ 0x118 8006800: | | | | | | | | | | 9205 str r2, [sp, #20] 8006802: | | | | | | | | | | 4610 mov r0, r2 8006804: | | | | | | | | | | f001 fc24 bl 8008050 <ip4_addr_isbroadcast_u32> 8006808: | | | | | | | | | | /-- b920 cbnz r0, 8006814 <ip4_input+0x7a8> ip_addr_ismulticast(ip_current_dest_addr())) { 800680a: | | | | | | | | | | | 9a05 ldr r2, [sp, #20] 800680c: | | | | | | | | | | | f002 03f0 and.w r3, r2, #240 @ 0xf0 if (ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif()) || 8006810: | | | | | | | | | | | 2be0 cmp r3, #224 @ 0xe0 8006812: | | | | | | | | | | /--|-- d10a bne.n 800682a <ip4_input+0x7be> TCP_STATS_INC(tcp.proterr); 8006814: | | | | | | | | | | | \-> f8b4 304c ldrh.w r3, [r4, #76] @ 0x4c 8006818: | | | | | | | | | | | 3301 adds r3, #1 800681a: | | | | | | | | | | | f8a4 304c strh.w r3, [r4, #76] @ 0x4c TCP_STATS_INC(tcp.drop); 800681e: | | | | | | | | | >-----|----> f8b4 3042 ldrh.w r3, [r4, #66] @ 0x42 8006822: | | | | | | | | | | | 3301 adds r3, #1 8006824: | | | | | | | | | | | f8a4 3042 strh.w r3, [r4, #66] @ 0x42 8006828: | | | | | +--|--|-----------------------------------------------|-----|-----|----- e70d b.n 8006646 <ip4_input+0x5da> u16_t chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len, 800682a: | | | | | | | | | | \----> f8b6 9008 ldrh.w r9, [r6, #8] 800682e: | | | | | | | | | | 9200 str r2, [sp, #0] 8006830: | | | | | | | | | | f8d4 3128 ldr.w r3, [r4, #296] @ 0x128 8006834: | | | | | | | | | | 464a mov r2, r9 8006836: | | | | | | | | | | 4629 mov r1, r5 8006838: | | | | | | | | | | 4630 mov r0, r6 800683a: | | | | | | | | | | f003 f845 bl 80098c8 <inet_chksum_pseudo.isra.0> if (chksum != 0) { 800683e: | | | | | | | | | | /-- b128 cbz r0, 800684c <ip4_input+0x7e0> TCP_STATS_INC(tcp.chkerr); 8006840: | | | | | | | | | | | f8b4 3044 ldrh.w r3, [r4, #68] @ 0x44 8006844: | | | | | | | | | | | 3301 adds r3, #1 8006846: | | | | | | | | | | | f8a4 3044 strh.w r3, [r4, #68] @ 0x44 goto dropped; 800684a: | | | | | | | | | +--------|-- e7e8 b.n 800681e <ip4_input+0x7b2> hdrlen_bytes = TCPH_HDRLEN_BYTES(tcphdr); 800684c: | | | | | | | | | | \-> f8ba 100c ldrh.w r1, [sl, #12] 8006850: | | | | | | | | | | ba49 rev16 r1, r1 8006852: | | | | | | | | | | f3c1 3103 ubfx r1, r1, #12, #4 8006856: | | | | | | | | | | 0089 lsls r1, r1, #2 if ((hdrlen_bytes < TCP_HLEN) || (hdrlen_bytes > p->tot_len)) { 8006858: | | | | | | | | | | 2913 cmp r1, #19 800685a: | | | | | | | | +-----|----------- d9c7 bls.n 80067ec <ip4_input+0x780> 800685c: | | | | | | | | | | 4589 cmp r9, r1 800685e: | | | | | | | | +-----|----------- d3c5 bcc.n 80067ec <ip4_input+0x780> tcphdr_optlen = (u16_t)(hdrlen_bytes - TCP_HLEN); 8006860: | | | | | | | | | | f1a1 0314 sub.w r3, r1, #20 8006864: | | | | | | | | | | b29b uxth r3, r3 if (p->len >= hdrlen_bytes) { 8006866: | | | | | | | | | | 4588 cmp r8, r1 tcphdr_optlen = (u16_t)(hdrlen_bytes - TCP_HLEN); 8006868: | | | | | | | | | | f8a7 37d4 strh.w r3, [r7, #2004] @ 0x7d4 tcphdr_opt2 = NULL; 800686c: | | | | | | | | | | f8c7 012c str.w r0, [r7, #300] @ 0x12c if (p->len >= hdrlen_bytes) { 8006870: | | | | | | | | | | /-- d330 bcc.n 80068d4 <ip4_input+0x868> pbuf_remove_header(p, hdrlen_bytes); /* cannot fail */ 8006872: | | | | | | | | | | | 4630 mov r0, r6 tcphdr_opt1len = tcphdr_optlen; 8006874: | | | | | | | | | | | f8a7 3130 strh.w r3, [r7, #304] @ 0x130 pbuf_remove_header(p, hdrlen_bytes); /* cannot fail */ 8006878: | | | | | | | | | | | f7fb fea2 bl 80025c0 <pbuf_remove_header> tcphdr->src = lwip_ntohs(tcphdr->src); 800687c: | | | | | | | | | /--|--------|-> f8d7 5134 ldr.w r5, [r7, #308] @ 0x134 8006880: | | | | | | | | | | | | 882b ldrh r3, [r5, #0] seqno = tcphdr->seqno = lwip_ntohl(tcphdr->seqno); 8006882: | | | | | | | | | | | | 6868 ldr r0, [r5, #4] 8006884: | | | | | | | | | | | | ba5b rev16 r3, r3 tcphdr->src = lwip_ntohs(tcphdr->src); 8006886: | | | | | | | | | | | | 802b strh r3, [r5, #0] tcphdr->dest = lwip_ntohs(tcphdr->dest); 8006888: | | | | | | | | | | | | 886b ldrh r3, [r5, #2] 800688a: | | | | | | | | | | | | ba5b rev16 r3, r3 800688c: | | | | | | | | | | | | 806b strh r3, [r5, #2] seqno = tcphdr->seqno = lwip_ntohl(tcphdr->seqno); 800688e: | | | | | | | | | | | | f001 fc51 bl 8008134 <lwip_htonl> 8006892: | | | | | | | | | | | | f8cb 00c8 str.w r0, [fp, #200] @ 0xc8 8006896: | | | | | | | | | | | | 6068 str r0, [r5, #4] ackno = tcphdr->ackno = lwip_ntohl(tcphdr->ackno); 8006898: | | | | | | | | | | | | 68a8 ldr r0, [r5, #8] 800689a: | | | | | | | | | | | | f001 fc4b bl 8008134 <lwip_htonl> 800689e: | | | | | | | | | | | | f8cb 00d0 str.w r0, [fp, #208] @ 0xd0 tcphdr->wnd = lwip_ntohs(tcphdr->wnd); 80068a2: | | | | | | | | | | | | 89eb ldrh r3, [r5, #14] ackno = tcphdr->ackno = lwip_ntohl(tcphdr->ackno); 80068a4: | | | | | | | | | | | | 60a8 str r0, [r5, #8] 80068a6: | | | | | | | | | | | | ba5b rev16 r3, r3 tcphdr->wnd = lwip_ntohs(tcphdr->wnd); 80068a8: | | | | | | | | | | | | 81eb strh r3, [r5, #14] flags = TCPH_FLAGS(tcphdr); 80068aa: | | | | | | | | | | | | 89ab ldrh r3, [r5, #12] 80068ac: | | | | | | | | | | | | ba5b rev16 r3, r3 80068ae: | | | | | | | | | | | | f003 023f and.w r2, r3, #63 @ 0x3f if (flags & (TCP_FIN | TCP_SYN)) { 80068b2: | | | | | | | | | | | | 079b lsls r3, r3, #30 flags = TCPH_FLAGS(tcphdr); 80068b4: | | | | | | | | | | | | f88b 20cc strb.w r2, [fp, #204] @ 0xcc tcplen = p->tot_len; 80068b8: | | | | | | | | | | | | 8932 ldrh r2, [r6, #8] if (flags & (TCP_FIN | TCP_SYN)) { 80068ba: | | | | | | | | | | | /-----|-- d057 beq.n 800696c <ip4_input+0x900> tcplen++; 80068bc: | | | | | | | | | | | | | 1c53 adds r3, r2, #1 80068be: | | | | | | | | | | | | | b29b uxth r3, r3 if (tcplen < p->tot_len) { 80068c0: | | | | | | | | | | | | | 429a cmp r2, r3 tcplen++; 80068c2: | | | | | | | | | | | | | f8ab 30d4 strh.w r3, [fp, #212] @ 0xd4 if (tcplen < p->tot_len) { 80068c6: | | | | | | | | | | | | /--|-- d953 bls.n 8006970 <ip4_input+0x904> TCP_STATS_INC(tcp.lenerr); 80068c8: | | | | | | | | | | | | | | f8bb 3046 ldrh.w r3, [fp, #70] @ 0x46 80068cc: | | | | | | | | | | | | | | 3301 adds r3, #1 80068ce: | | | | | | | | | | | | | | f8ab 3046 strh.w r3, [fp, #70] @ 0x46 goto dropped; 80068d2: | | | | | | | | | | \--|--|--|-- e7a4 b.n 800681e <ip4_input+0x7b2> LWIP_ASSERT("p->next != NULL", p->next != NULL); 80068d4: | | | | | | | | | | | | \-> 6833 ldr r3, [r6, #0] 80068d6: | | | | | | | | | | | | /-- b953 cbnz r3, 80068ee <ip4_input+0x882> 80068d8: | | | | | | | | | | | | | b672 cpsid i 80068da: | | | | | | | | | | | | | 4b48 ldr r3, [pc, #288] @ (80069fc ) 80068dc: | | | | | | | | | | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 80068e0: | | | | | | | | | | | | | 4a47 ldr r2, [pc, #284] @ (8006a00 ) 80068e2: | | | | | | | | | | | | | 9300 str r3, [sp, #0] 80068e4: | | | | | | | | | | | | | 4843 ldr r0, [pc, #268] @ (80069f4 ) 80068e6: | | | | | | | | | | | | | 23c2 movs r3, #194 @ 0xc2 80068e8: | | | | | | | | | | | | | f7fa fd06 bl 80012f8 <printf_> 80068ec: | | | | | | | | | | | | | be00 bkpt 0x0000 pbuf_remove_header(p, TCP_HLEN); 80068ee: | | | | | | | | | | | | \-> 2114 movs r1, #20 80068f0: | | | | | | | | | | | | 4630 mov r0, r6 80068f2: | | | | | | | | | | | | f7fb fe65 bl 80025c0 <pbuf_remove_header> tcphdr_opt1len = p->len; 80068f6: | | | | | | | | | | | | 8975 ldrh r5, [r6, #10] opt2len = (u16_t)(tcphdr_optlen - tcphdr_opt1len); 80068f8: | | | | | | | | | | | | f8b7 97d4 ldrh.w r9, [r7, #2004] @ 0x7d4 tcphdr_opt1len = p->len; 80068fc: | | | | | | | | | | | | f8a7 5130 strh.w r5, [r7, #304] @ 0x130 pbuf_remove_header(p, tcphdr_opt1len); 8006900: | | | | | | | | | | | | 4629 mov r1, r5 8006902: | | | | | | | | | | | | 4630 mov r0, r6 8006904: | | | | | | | | | | | | f7fb fe5c bl 80025c0 <pbuf_remove_header> if (opt2len > p->next->len) { 8006908: | | | | | | | | | | | | 6830 ldr r0, [r6, #0] opt2len = (u16_t)(tcphdr_optlen - tcphdr_opt1len); 800690a: | | | | | | | | | | | | eba9 0805 sub.w r8, r9, r5 if (opt2len > p->next->len) { 800690e: | | | | | | | | | | | | 8943 ldrh r3, [r0, #10] opt2len = (u16_t)(tcphdr_optlen - tcphdr_opt1len); 8006910: | | | | | | | | | | | | fa1f f888 uxth.w r8, r8 if (opt2len > p->next->len) { 8006914: | | | | | | | | | | | | 4543 cmp r3, r8 8006916: | | | | | | | | \--|-----|--|----- f4ff af69 bcc.w 80067ec <ip4_input+0x780> tcphdr_opt2 = (u8_t *)p->next->payload; 800691a: | | | | | | | | | | | 6843 ldr r3, [r0, #4] 800691c: | | | | | | | | | | | f8c7 312c str.w r3, [r7, #300] @ 0x12c pbuf_remove_header(p->next, opt2len); 8006920: | | | | | | | | | | | 4641 mov r1, r8 8006922: | | | | | | | | | | | f7fb fe4d bl 80025c0 <pbuf_remove_header> p->tot_len = (u16_t)(p->tot_len - opt2len); 8006926: | | | | | | | | | | | 8933 ldrh r3, [r6, #8] 8006928: | | | | | | | | | | | 441d add r5, r3 LWIP_ASSERT("p->len == 0", p->len == 0); 800692a: | | | | | | | | | | | 8973 ldrh r3, [r6, #10] p->tot_len = (u16_t)(p->tot_len - opt2len); 800692c: | | | | | | | | | | | eba5 0509 sub.w r5, r5, r9 8006930: | | | | | | | | | | | 8135 strh r5, [r6, #8] LWIP_ASSERT("p->len == 0", p->len == 0); 8006932: | | | | | | | | | | | /-- b153 cbz r3, 800694a <ip4_input+0x8de> 8006934: | | | | | | | | | | | | b672 cpsid i 8006936: | | | | | | | | | | | | 4b31 ldr r3, [pc, #196] @ (80069fc ) 8006938: | | | | | | | | | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 800693c: | | | | | | | | | | | | 4a31 ldr r2, [pc, #196] @ (8006a04 ) 800693e: | | | | | | | | | | | | 9300 str r3, [sp, #0] 8006940: | | | | | | | | | | | | 482c ldr r0, [pc, #176] @ (80069f4 ) 8006942: | | | | | | | | | | | | 23df movs r3, #223 @ 0xdf 8006944: | | | | | | | | | | | | f7fa fcd8 bl 80012f8 <printf_> 8006948: | | | | | | | | | | | | be00 bkpt 0x0000 LWIP_ASSERT("p->tot_len == p->next->tot_len", p->tot_len == p->next->tot_len); 800694a: | | | | | | | | | | | \-> 6833 ldr r3, [r6, #0] 800694c: | | | | | | | | | | | 8932 ldrh r2, [r6, #8] 800694e: | | | | | | | | | | | 891b ldrh r3, [r3, #8] 8006950: | | | | | | | | | | | 429a cmp r2, r3 8006952: | | | | | | | | +-----|--|----- d093 beq.n 800687c <ip4_input+0x810> 8006954: | | | | | | | | | | | b672 cpsid i 8006956: | | | | | | | | | | | 4b29 ldr r3, [pc, #164] @ (80069fc ) 8006958: | | | | | | | | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 800695c: | | | | | | | | | | | 4a2a ldr r2, [pc, #168] @ (8006a08 ) 800695e: | | | | | | | | | | | 9300 str r3, [sp, #0] 8006960: | | | | | | | | | | | 4824 ldr r0, [pc, #144] @ (80069f4 ) 8006962: | | | | | | | | | | | 23e0 movs r3, #224 @ 0xe0 8006964: | | | | | | | | | | | f7fa fcc8 bl 80012f8 <printf_> 8006968: | | | | | | | | | | | be00 bkpt 0x0000 800696a: | | | | | | | | \-----|--|----- e787 b.n 800687c <ip4_input+0x810> tcplen = p->tot_len; 800696c: | | | | | | | | \--|----> f8ab 20d4 strh.w r2, [fp, #212] @ 0xd4 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { 8006970: | | | | | | | | \----> f8d4 50bc ldr.w r5, [r4, #188] @ 0xbc LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED); 8006974: | | | | | | | | f8df 9084 ldr.w r9, [pc, #132] @ 80069fc 8006978: | | | | | | | | f8df a078 ldr.w sl, [pc, #120] @ 80069f4 prev = NULL; 800697c: | | | | | | | | f04f 0800 mov.w r8, #0 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { 8006980: | | | | | | | | /----------------> 2d00 cmp r5, #0 8006982: | | | | | | | | | /-- d145 bne.n 8006a10 <ip4_input+0x9a4> for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { 8006984: | | | | | | | | | | f8d4 50c0 ldr.w r5, [r4, #192] @ 0xc0 LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); 8006988: | | | | | | | | | | f8df 8070 ldr.w r8, [pc, #112] @ 80069fc 800698c: | | | | | | | | | | f8df a07c ldr.w sl, [pc, #124] @ 8006a0c 8006990: | | | | | | | | | | f8df 9060 ldr.w r9, [pc, #96] @ 80069f4 for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { 8006994: | | | | | | | | /-----|--------------|-> 2d00 cmp r5, #0 8006996: | | | | | | | | | | /-----------|-- f040 80f8 bne.w 8006b8a <ip4_input+0xb1e> for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { 800699a: | | | | | | | | | | | | f8d4 c104 ldr.w ip, [r4, #260] @ 0x104 (lpcb->netif_idx != netif_get_index(ip_data.current_input_netif))) { 800699e: | | | | | | | | | | | | f8d4 011c ldr.w r0, [r4, #284] @ 0x11c if (lpcb->local_port == tcphdr->dest) { 80069a2: | | | | | | | | | | | | f8d7 1134 ldr.w r1, [r7, #308] @ 0x134 if (ip_addr_eq(&lpcb->local_ip, ip_current_dest_addr())) { 80069a6: | | | | | | | | | | | | f8d4 212c ldr.w r2, [r4, #300] @ 0x12c for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { 80069aa: | | | | | | | | | | | | 46e0 mov r8, ip 80069ac: | | | | | | | | /-----|-----|--|-----------|-> f1b8 0f00 cmp.w r8, #0 80069b0: | | | | | | | | | | /--|--|-----------|-- f040 814d bne.w 8006c4e <ip4_input+0xbe2> if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) { 80069b4: | | | | | | | | | | | | | | 898b ldrh r3, [r1, #12] 80069b6: | | | | | | | | | | | | | | ba5b rev16 r3, r3 80069b8: | | | | | | | | | | | | | | 075a lsls r2, r3, #29 80069ba: | | | | | +--|--|-----------------------------------|-----|--|--|--|-----------|-- f53f ae44 bmi.w 8006646 <ip4_input+0x5da> TCP_STATS_INC(tcp.proterr); 80069be: | | | | | | | | | | | | | | f8bb 304c ldrh.w r3, [fp, #76] @ 0x4c tcp_rst_netif(ip_data.current_input_netif, ackno, seqno + tcplen, ip_current_dest_addr(), 80069c2: | | | | | | | | | | | | | | f8bb 50d4 ldrh.w r5, [fp, #212] @ 0xd4 80069c6: | | | | | | | | | | | | | | f8db 20c8 ldr.w r2, [fp, #200] @ 0xc8 TCP_STATS_INC(tcp.proterr); 80069ca: | | | | | | | | | | | | | | 3301 adds r3, #1 80069cc: | | | | | | | | | | | | | | f8ab 304c strh.w r3, [fp, #76] @ 0x4c TCP_STATS_INC(tcp.drop); 80069d0: | | | | | | | | | | | | | | f8bb 3042 ldrh.w r3, [fp, #66] @ 0x42 80069d4: | | | | | | | | | | | | | | 3301 adds r3, #1 80069d6: | | | | | | | | | | | | | | f8ab 3042 strh.w r3, [fp, #66] @ 0x42 tcp_rst_netif(ip_data.current_input_netif, ackno, seqno + tcplen, ip_current_dest_addr(), 80069da: | | | | | | | | | | | | | | 884b ldrh r3, [r1, #2] 80069dc: | | | | | | | | | | | | | | 8809 ldrh r1, [r1, #0] 80069de: | | | | | | | | | | | | | | 9100 str r1, [sp, #0] 80069e0: | | | | | | | | | | | | | | f8db 10d0 ldr.w r1, [fp, #208] @ 0xd0 80069e4: | | | | | | | | | | | | | | 442a add r2, r5 80069e6: | | | | | | | | | /--|--|--|--|-----------|-- e165 b.n 8006cb4 <ip4_input+0xc48> 80069e8: | | | | | | | | | | | | | | | 20000060 .word 0x20000060 80069ec: | | | | | | | | | | | | | | | 0800c5fa .word 0x0800c5fa 80069f0: | | | | | | | | | | | | | | | 0800c614 .word 0x0800c614 80069f4: | | | | | | | | | | | | | | | 0800b232 .word 0x0800b232 80069f8: | | | | | | | | | | | | | | | 20001280 .word 0x20001280 80069fc: | | | | | | | | | | | | | | | 0800b591 .word 0x0800b591 8006a00: | | | | | | | | | | | | | | | 0800c628 .word 0x0800c628 8006a04: | | | | | | | | | | | | | | | 0800c638 .word 0x0800c638 8006a08: | | | | | | | | | | | | | | | 0800c644 .word 0x0800c644 8006a0c: | | | | | | | | | | | | | | | 0800c730 .word 0x0800c730 LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED); 8006a10: | | | | | | | | | | | | | | \-> 7d2b ldrb r3, [r5, #20] 8006a12: | | | | | | | | | | | | | | /-- b953 cbnz r3, 8006a2a <ip4_input+0x9be> 8006a14: | | | | | | | | | | | | | | | b672 cpsid i 8006a16: | | | | | | | | | | | | | | | 4aac ldr r2, [pc, #688] @ (8006cc8 ) 8006a18: | | | | | | | | | | | | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 8006a1c: | | | | | | | | | | | | | | | f8cd 9000 str.w r9, [sp] 8006a20: | | | | | | | | | | | | | | | 23fb movs r3, #251 @ 0xfb 8006a22: | | | | | | | | | | | | | | | 4650 mov r0, sl 8006a24: | | | | | | | | | | | | | | | f7fa fc68 bl 80012f8 <printf_> 8006a28: | | | | | | | | | | | | | | | be00 bkpt 0x0000 LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); 8006a2a: | | | | | | | | | | | | | | \-> 7d2b ldrb r3, [r5, #20] 8006a2c: | | | | | | | | | | | | | | 2b0a cmp r3, #10 8006a2e: | | | | | | | | | | | | | | /-- d10a bne.n 8006a46 <ip4_input+0x9da> 8006a30: | | | | | | | | | | | | | | | b672 cpsid i 8006a32: | | | | | | | | | | | | | | | 4aa6 ldr r2, [pc, #664] @ (8006ccc ) 8006a34: | | | | | | | | | | | | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 8006a38: | | | | | | | | | | | | | | | f8cd 9000 str.w r9, [sp] 8006a3c: | | | | | | | | | | | | | | | 23fc movs r3, #252 @ 0xfc 8006a3e: | | | | | | | | | | | | | | | 4650 mov r0, sl 8006a40: | | | | | | | | | | | | | | | f7fa fc5a bl 80012f8 <printf_> 8006a44: | | | | | | | | | | | | | | | be00 bkpt 0x0000 LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN); 8006a46: | | | | | | | | | | | | | | \-> 7d2b ldrb r3, [r5, #20] 8006a48: | | | | | | | | | | | | | | 2b01 cmp r3, #1 8006a4a: | | | | | | | | | | | | | | /-- d10a bne.n 8006a62 <ip4_input+0x9f6> 8006a4c: | | | | | | | | | | | | | | | b672 cpsid i 8006a4e: | | | | | | | | | | | | | | | 4aa0 ldr r2, [pc, #640] @ (8006cd0 ) 8006a50: | | | | | | | | | | | | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 8006a54: | | | | | | | | | | | | | | | f8cd 9000 str.w r9, [sp] 8006a58: | | | | | | | | | | | | | | | 23fd movs r3, #253 @ 0xfd 8006a5a: | | | | | | | | | | | | | | | 4650 mov r0, sl 8006a5c: | | | | | | | | | | | | | | | f7fa fc4c bl 80012f8 <printf_> 8006a60: | | | | | | | | | | | | | | | be00 bkpt 0x0000 if ((pcb->netif_idx != NETIF_NO_INDEX) && 8006a62: | | | | | | | | | | | | | | \-> 7a29 ldrb r1, [r5, #8] 8006a64: | | | | | | | | | | | | | | 68ea ldr r2, [r5, #12] 8006a66: | | | | | | | | | | | | | | /-- b141 cbz r1, 8006a7a <ip4_input+0xa0e> (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) { 8006a68: | | | | | | | | | | | | | | | f8d4 311c ldr.w r3, [r4, #284] @ 0x11c 8006a6c: | | | | | | | | | | | | | | | f893 3038 ldrb.w r3, [r3, #56] @ 0x38 8006a70: | | | | | | | | | | | | | | | 3301 adds r3, #1 if ((pcb->netif_idx != NETIF_NO_INDEX) && 8006a72: | | | | | | | | | | | | | | | b2db uxtb r3, r3 8006a74: | | | | | | | | | | | | | | | 4299 cmp r1, r3 8006a76: | | | | | | | | | | | | | | /--------|-- f040 8085 bne.w 8006b84 <ip4_input+0xb18> if (pcb->remote_port == tcphdr->src && 8006a7a: | | | | | | | | | | | | | | | \-> f8d7 3134 ldr.w r3, [r7, #308] @ 0x134 8006a7e: | | | | | | | | | | | | | | | 8b28 ldrh r0, [r5, #24] 8006a80: | | | | | | | | | | | | | | | 8819 ldrh r1, [r3, #0] 8006a82: | | | | | | | | | | | | | | | 4288 cmp r0, r1 8006a84: | | | | | | | | | | | | | | +----------- d17e bne.n 8006b84 <ip4_input+0xb18> 8006a86: | | | | | | | | | | | | | | | 8ae9 ldrh r1, [r5, #22] 8006a88: | | | | | | | | | | | | | | | 885b ldrh r3, [r3, #2] 8006a8a: | | | | | | | | | | | | | | | 4299 cmp r1, r3 8006a8c: | | | | | | | | | | | | | | +----------- d17a bne.n 8006b84 <ip4_input+0xb18> pcb->local_port == tcphdr->dest && 8006a8e: | | | | | | | | | | | | | | | 6869 ldr r1, [r5, #4] 8006a90: | | | | | | | | | | | | | | | f8d4 3128 ldr.w r3, [r4, #296] @ 0x128 8006a94: | | | | | | | | | | | | | | | 4299 cmp r1, r3 8006a96: | | | | | | | | | | | | | | +----------- d175 bne.n 8006b84 <ip4_input+0xb18> ip_addr_eq(&pcb->remote_ip, ip_current_src_addr()) && 8006a98: | | | | | | | | | | | | | | | 6829 ldr r1, [r5, #0] 8006a9a: | | | | | | | | | | | | | | | f8d4 312c ldr.w r3, [r4, #300] @ 0x12c 8006a9e: | | | | | | | | | | | | | | | 4299 cmp r1, r3 8006aa0: | | | | | | | | | | | | | | +----------- d170 bne.n 8006b84 <ip4_input+0xb18> LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb); 8006aa2: | | | | | | | | | | | | | | | 4295 cmp r5, r2 8006aa4: | | | | | | | | | | | | | | | /-- d10b bne.n 8006abe <ip4_input+0xa52> 8006aa6: | | | | | | | | | | | | | | | | b672 cpsid i 8006aa8: | | | | | | | | | | | | | | | | 4b8a ldr r3, [pc, #552] @ (8006cd4 ) 8006aaa: | | | | | | | | | | | | | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 8006aae: | | | | | | | | | | | | | | | | 4a8a ldr r2, [pc, #552] @ (8006cd8 ) 8006ab0: | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 8006ab2: | | | | | | | | | | | | | | | | 488a ldr r0, [pc, #552] @ (8006cdc ) 8006ab4: | | | | | | | | | | | | | | | | f240 130d movw r3, #269 @ 0x10d 8006ab8: | | | | | | | | | | | | | | | | f7fa fc1e bl 80012f8 <printf_> 8006abc: | | | | | | | | | | | | | | | | be00 bkpt 0x0000 prev->next = pcb->next; 8006abe: | | | | | | | | | | | | | | | \-> 68eb ldr r3, [r5, #12] if (prev != NULL) { 8006ac0: | | | | | | | | | | | | | | | f1b8 0f00 cmp.w r8, #0 8006ac4: | | | | | | | | | | | | | | | /-------- d058 beq.n 8006b78 <ip4_input+0xb0c> prev->next = pcb->next; 8006ac6: | | | | | | | | | | | | | | | | f8c8 300c str.w r3, [r8, #12] pcb->next = tcp_active_pcbs; 8006aca: | | | | | | | | | | | | | | | | f8d4 30bc ldr.w r3, [r4, #188] @ 0xbc 8006ace: | | | | | | | | | | | | | | | | 60eb str r3, [r5, #12] tcp_active_pcbs = pcb; 8006ad0: | | | | | | | | | | | | | | | | f8c4 50bc str.w r5, [r4, #188] @ 0xbc LWIP_ASSERT("tcp_input: pcb->next != pcb (after cache)", pcb->next != pcb); 8006ad4: | | | | | | | | | | | | | | | | /----> 68eb ldr r3, [r5, #12] 8006ad6: | | | | | | | | | | | | | | | | | 429d cmp r5, r3 8006ad8: | | | | | | | | | | | | | | | | | /-- d10b bne.n 8006af2 <ip4_input+0xa86> 8006ada: | | | | | | | | | | | | | | | | | | b672 cpsid i 8006adc: | | | | | | | | | | | | | | | | | | 4b7d ldr r3, [pc, #500] @ (8006cd4 ) 8006ade: | | | | | | | | | | | | | | | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 8006ae2: | | | | | | | | | | | | | | | | | | 4a7f ldr r2, [pc, #508] @ (8006ce0 ) 8006ae4: | | | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 8006ae6: | | | | | | | | | | | | | | | | | | 487d ldr r0, [pc, #500] @ (8006cdc ) 8006ae8: | | | | | | | | | | | | | | | | | | f240 1315 movw r3, #277 @ 0x115 8006aec: | | | | | | | | | | | | | | | | | | f7fa fc04 bl 80012f8 <printf_> 8006af0: | | | | | | | | | | | | | | | | | | be00 bkpt 0x0000 inseg.len = p->tot_len; 8006af2: | | | | | | | | | | | | | | | | | \-> 8932 ldrh r2, [r6, #8] 8006af4: | | | | | | | | | | | | | | | | | f8a4 20e4 strh.w r2, [r4, #228] @ 0xe4 inseg.tcphdr = tcphdr; 8006af8: | | | | | | | | | | | | | | | | | f8d7 2134 ldr.w r2, [r7, #308] @ 0x134 inseg.p = p; 8006afc: | | | | | | | | | | | | | | | | | f8c4 60e0 str.w r6, [r4, #224] @ 0xe0 inseg.next = NULL; 8006b00: | | | | | | | | | | | | | | | | | 2300 movs r3, #0 recv_data = NULL; 8006b02: | | | | | | | | | | | | | | | | | e9c4 233b strd r2, r3, [r4, #236] @ 0xec inseg.next = NULL; 8006b06: | | | | | | | | | | | | | | | | | f8c4 30dc str.w r3, [r4, #220] @ 0xdc recv_flags = 0; 8006b0a: | | | | | | | | | | | | | | | | | f884 30f4 strb.w r3, [r4, #244] @ 0xf4 recv_acked = 0; 8006b0e: | | | | | | | | | | | | | | | | | f8a4 30d6 strh.w r3, [r4, #214] @ 0xd6 if (flags & TCP_PSH) { 8006b12: | | | | | | | | | | | | | | | | | f894 30cc ldrb.w r3, [r4, #204] @ 0xcc 8006b16: | | | | | | | | | | | | | | | | | 071b lsls r3, r3, #28 p->flags |= PBUF_FLAG_PUSH; 8006b18: | | | | | | | | | | | | | | | | | bf42 ittt mi 8006b1a: | | | | | | | | | | | | | | | | | 7b73 ldrbmi r3, [r6, #13] 8006b1c: | | | | | | | | | | | | | | | | | f043 0301 orrmi.w r3, r3, #1 8006b20: | | | | | | | | | | | | | | | | | 7373 strbmi r3, [r6, #13] if (pcb->refused_data != NULL) { 8006b22: | | | | | | | | | | | | | | | | | 6fab ldr r3, [r5, #120] @ 0x78 8006b24: | | | | | | | | | | | | | | | | | 2b00 cmp r3, #0 8006b26: | | | | | | | | /-----------------------------|--|--|--|--|--|--|--|--|----- f000 822c beq.w 8006f82 <ip4_input+0xf16> if ((tcp_process_refused_data(pcb) == ERR_ABRT) || 8006b2a: | | | | | | | | | | | | | | | | | | 4628 mov r0, r5 8006b2c: | | | | | | | | | | | | | | | | | | f7fd fa36 bl 8003f9c <tcp_process_refused_data> 8006b30: | | | | | | | | | | | | | | | | | | 300d adds r0, #13 8006b32: | | | | | | | | | | | | | | | | | | /-- d008 beq.n 8006b46 <ip4_input+0xada> 8006b34: | | | | | | | | | | | | | | | | | | | 6fab ldr r3, [r5, #120] @ 0x78 8006b36: | | | | | | | | | | | | | | | | | | | 2b00 cmp r3, #0 8006b38: | | | | | | | | +-----------------------------|--|--|--|--|--|--|--|--|--|-- f000 8223 beq.w 8006f82 <ip4_input+0xf16> ((pcb->refused_data != NULL) && (tcplen > 0))) { 8006b3c: | | | | | | | | | | | | | | | | | | | f8b4 30d4 ldrh.w r3, [r4, #212] @ 0xd4 8006b40: | | | | | | | | | | | | | | | | | | | 2b00 cmp r3, #0 8006b42: | | | | | | | | +-----------------------------|--|--|--|--|--|--|--|--|--|-- f000 821e beq.w 8006f82 <ip4_input+0xf16> if (pcb->rcv_ann_wnd == 0) { 8006b46: | | | | | | | | | | | | | | | | | | \-> 8d6b ldrh r3, [r5, #42] @ 0x2a 8006b48: | | | | | | | | | | | | | | | | | | /-- b913 cbnz r3, 8006b50 <ip4_input+0xae4> tcp_send_empty_ack(pcb); 8006b4a: | | | | | | | | | | | | | | | | | | | 4628 mov r0, r5 8006b4c: | | | | | | | | | | | | | | | | | | | f7fc f90c bl 8002d68 <tcp_send_empty_ack> TCP_STATS_INC(tcp.drop); 8006b50: | | | | | | | | | | | | | | | | | | \-> f8b4 3042 ldrh.w r3, [r4, #66] @ 0x42 8006b54: | | | | | | | | | | | | | | | | | | 3301 adds r3, #1 8006b56: | | | | | | | | | | | | | | | | | | f8a4 3042 strh.w r3, [r4, #66] @ 0x42 if (inseg.p != NULL) { 8006b5a: | | | | | | | | /--|-----------------------------|--|--|--|--|--|--|--|--|----> f8d4 00e0 ldr.w r0, [r4, #224] @ 0xe0 tcp_input_pcb = NULL; 8006b5e: | | | | | | | | | | | | | | | | | | | 2500 movs r5, #0 8006b60: | | | | | | | | | | | | | | | | | | | f8c4 50f8 str.w r5, [r4, #248] @ 0xf8 recv_data = NULL; 8006b64: | | | | | | | | | | | | | | | | | | | f8c4 50f0 str.w r5, [r4, #240] @ 0xf0 if (inseg.p != NULL) { 8006b68: | | | | | | | | | | | | | | | | | | | 2800 cmp r0, #0 8006b6a: | | | | | | +--|--|--|-----------------------------|--|--|--|--|--|--|--|--|----- f43f ae07 beq.w 800677c <ip4_input+0x710> pbuf_free(inseg.p); 8006b6e: | | | | | | | | | | | | | | | | | | | f003 f925 bl 8009dbc <pbuf_free.isra.0> inseg.p = NULL; 8006b72: | | | | | | | | | | | | | | | | | | | f8c4 50e0 str.w r5, [r4, #224] @ 0xe0 8006b76: | | | | | | +--|--|--|-----------------------------|--|--|--|--|--|--|--|--|----- e601 b.n 800677c <ip4_input+0x710> TCP_STATS_INC(tcp.cachehit); 8006b78: | | | | | | | | | | | | | | | | | \--|----> f8b4 3052 ldrh.w r3, [r4, #82] @ 0x52 8006b7c: | | | | | | | | | | | | | | | | | | 3301 adds r3, #1 8006b7e: | | | | | | | | | | | | | | | | | | f8a4 3052 strh.w r3, [r4, #82] @ 0x52 8006b82: | | | | | | | | | | | | | | | | | \----- e7a7 b.n 8006ad4 <ip4_input+0xa68> for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { 8006b84: | | | | | | | | | | | | | | | | \----------> 46a8 mov r8, r5 8006b86: | | | | | | | | | | | | | | | | 4615 mov r5, r2 8006b88: | | | | | | | | | | | | | | \--|-------------- e6fa b.n 8006980 <ip4_input+0x914> LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); 8006b8a: | | | | | | | | | | | | | | \-------------> 7d2b ldrb r3, [r5, #20] 8006b8c: | | | | | | | | | | | | | | 2b0a cmp r3, #10 8006b8e: | | | | | | | | | | | | | | /-- d00b beq.n 8006ba8 <ip4_input+0xb3c> 8006b90: | | | | | | | | | | | | | | | b672 cpsid i 8006b92: | | | | | | | | | | | | | | | f240 131f movw r3, #287 @ 0x11f 8006b96: | | | | | | | | | | | | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 8006b9a: | | | | | | | | | | | | | | | f8cd 8000 str.w r8, [sp] 8006b9e: | | | | | | | | | | | | | | | 4652 mov r2, sl 8006ba0: | | | | | | | | | | | | | | | 4648 mov r0, r9 8006ba2: | | | | | | | | | | | | | | | f7fa fba9 bl 80012f8 <printf_> 8006ba6: | | | | | | | | | | | | | | | be00 bkpt 0x0000 if ((pcb->netif_idx != NETIF_NO_INDEX) && 8006ba8: | | | | | | | | | | | | | | \-> 7a2a ldrb r2, [r5, #8] 8006baa: | | | | | | | | | | | | | | /-- b13a cbz r2, 8006bbc <ip4_input+0xb50> (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) { 8006bac: | | | | | | | | | | | | | | | f8d4 311c ldr.w r3, [r4, #284] @ 0x11c 8006bb0: | | | | | | | | | | | | | | | f893 3038 ldrb.w r3, [r3, #56] @ 0x38 8006bb4: | | | | | | | | | | | | | | | 3301 adds r3, #1 if ((pcb->netif_idx != NETIF_NO_INDEX) && 8006bb6: | | | | | | | | | | | | | | | b2db uxtb r3, r3 8006bb8: | | | | | | | | | | | | | | | 429a cmp r2, r3 8006bba: | | | | | | | | | | | | | | /-----|-- d146 bne.n 8006c4a <ip4_input+0xbde> if (pcb->remote_port == tcphdr->src && 8006bbc: | | | | | | | | | | | | | | | \-> f8d7 3134 ldr.w r3, [r7, #308] @ 0x134 8006bc0: | | | | | | | | | | | | | | | 8b28 ldrh r0, [r5, #24] 8006bc2: | | | | | | | | | | | | | | | 881a ldrh r2, [r3, #0] 8006bc4: | | | | | | | | | | | | | | | 4290 cmp r0, r2 8006bc6: | | | | | | | | | | | | | | +-------- d140 bne.n 8006c4a <ip4_input+0xbde> pcb->local_port == tcphdr->dest && 8006bc8: | | | | | | | | | | | | | | | 885a ldrh r2, [r3, #2] if (pcb->remote_port == tcphdr->src && 8006bca: | | | | | | | | | | | | | | | 8aeb ldrh r3, [r5, #22] 8006bcc: | | | | | | | | | | | | | | | 4293 cmp r3, r2 8006bce: | | | | | | | | | | | | | | +-------- d13c bne.n 8006c4a <ip4_input+0xbde> pcb->local_port == tcphdr->dest && 8006bd0: | | | | | | | | | | | | | | | 6869 ldr r1, [r5, #4] 8006bd2: | | | | | | | | | | | | | | | f8d4 2128 ldr.w r2, [r4, #296] @ 0x128 8006bd6: | | | | | | | | | | | | | | | 4291 cmp r1, r2 8006bd8: | | | | | | | | | | | | | | +-------- d137 bne.n 8006c4a <ip4_input+0xbde> ip_addr_eq(&pcb->remote_ip, ip_current_src_addr()) && 8006bda: | | | | | | | | | | | | | | | 6829 ldr r1, [r5, #0] 8006bdc: | | | | | | | | | | | | | | | f8d4 212c ldr.w r2, [r4, #300] @ 0x12c 8006be0: | | | | | | | | | | | | | | | 4291 cmp r1, r2 8006be2: | | | | | | | | | | | | | | +-------- d132 bne.n 8006c4a <ip4_input+0xbde> if (flags & TCP_RST) { 8006be4: | | | | | | | | | | | | | | | f894 10cc ldrb.w r1, [r4, #204] @ 0xcc 8006be8: | | | | | | | | | | | | | | | 074f lsls r7, r1, #29 8006bea: | | | | | +--|--|--|--|-----------------------------|--|--|--|-----------|-------- f53f ad2c bmi.w 8006646 <ip4_input+0x5da> if (flags & TCP_SYN) { 8006bee: | | | | | | | | | | | | | | | 078a lsls r2, r1, #30 tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(), 8006bf0: | | | | | | | | | | | | | | | f8b4 70d4 ldrh.w r7, [r4, #212] @ 0xd4 if (flags & TCP_SYN) { 8006bf4: | | | | | | | | | | | | | | | /----- d519 bpl.n 8006c2a <ip4_input+0xbbe> if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd)) { 8006bf6: | | | | | | | | | | | | | | | | f8d4 20c8 ldr.w r2, [r4, #200] @ 0xc8 8006bfa: | | | | | | | | | | | | | | | | 6a69 ldr r1, [r5, #36] @ 0x24 8006bfc: | | | | | | | | | | | | | | | | eba2 0c01 sub.w ip, r2, r1 8006c00: | | | | | | | | | | | | | | | | f1bc 0f00 cmp.w ip, #0 8006c04: | | | | | | | | | | | | | | | | /-- db16 blt.n 8006c34 <ip4_input+0xbc8> 8006c06: | | | | | | | | | | | | | | | | | f8b5 c028 ldrh.w ip, [r5, #40] @ 0x28 8006c0a: | | | | | | | | | | | | | | | | | 1a89 subs r1, r1, r2 8006c0c: | | | | | | | | | | | | | | | | | eb1c 0f01 cmn.w ip, r1 8006c10: | | | | | | | | | | | | | | | | +-- d410 bmi.n 8006c34 <ip4_input+0xbc8> tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(), 8006c12: | | | | | | | | | | | | | | | | | e9cd 3001 strd r3, r0, [sp, #4] 8006c16: | | | | | | | | | | | | | | | | | 4b33 ldr r3, [pc, #204] @ (8006ce4 ) 8006c18: | | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 8006c1a: | | | | | | | | | | | | | | | | | f8d4 10d0 ldr.w r1, [r4, #208] @ 0xd0 8006c1e: | | | | | | | | | | | | | | | | | 3304 adds r3, #4 8006c20: | | | | | | | | | | | | | | | | | 443a add r2, r7 8006c22: | | | | | | | | | | | | | | | | | 4628 mov r0, r5 8006c24: | | | | | | | | | | | | | | | | | f7fc f876 bl 8002d14 <tcp_rst> return; 8006c28: | | | | | +--|--|--|--|-----------------------------|--|--|--|-----------|--|--|-- e50d b.n 8006646 <ip4_input+0x5da> } else if (flags & TCP_FIN) { 8006c2a: | | | | | | | | | | | | | | | \--|-> 07cb lsls r3, r1, #31 pcb->tmr = tcp_ticks; 8006c2c: | | | | | | | | | | | | | | | | bf44 itt mi 8006c2e: | | | | | | | | | | | | | | | | f8d4 30d8 ldrmi.w r3, [r4, #216] @ 0xd8 8006c32: | | | | | | | | | | | | | | | | 622b strmi r3, [r5, #32] if ((tcplen > 0)) { 8006c34: | | | | | | | | | | | | | | | \-> 2f00 cmp r7, #0 8006c36: | | | | | +--|--|--|--|-----------------------------|--|--|--|-----------|-------- f43f ad06 beq.w 8006646 <ip4_input+0x5da> tcp_ack_now(pcb); 8006c3a: | | | | | | | | | | | | | | | 8b6b ldrh r3, [r5, #26] 8006c3c: | | | | | | | | | | | | | | | f043 0302 orr.w r3, r3, #2 8006c40: | | | | | | | | | | | | | | | 836b strh r3, [r5, #26] tcp_output(npcb); 8006c42: | | | | | | | | | | /--------------------------|--|--|--|-----------|-------> 4628 mov r0, r5 8006c44: | | | | | | | | | | | | | | | | f7fc fce6 bl 8003614 <tcp_output> 8006c48: | | | | | +--|--|--|--|--|--------------------------|--|--|--|-----------|-------- e4fd b.n 8006646 <ip4_input+0x5da> for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { 8006c4a: | | | | | | | | | | | | | | | \-------> 68ed ldr r5, [r5, #12] 8006c4c: | | | | | | | | | | | | | \--|-------------------- e6a2 b.n 8006994 <ip4_input+0x928> if ((lpcb->netif_idx != NETIF_NO_INDEX) && 8006c4e: | | | | | | | | | | | | | \-------------------> f898 e008 ldrb.w lr, [r8, #8] 8006c52: | | | | | | | | | | | | | f1be 0f00 cmp.w lr, #0 8006c56: | | | | | | | | | | | | | /-- d005 beq.n 8006c64 <ip4_input+0xbf8> (lpcb->netif_idx != netif_get_index(ip_data.current_input_netif))) { 8006c58: | | | | | | | | | | | | | | f890 3038 ldrb.w r3, [r0, #56] @ 0x38 8006c5c: | | | | | | | | | | | | | | 3301 adds r3, #1 if ((lpcb->netif_idx != NETIF_NO_INDEX) && 8006c5e: | | | | | | | | | | | | | | b2db uxtb r3, r3 8006c60: | | | | | | | | | | | | | | 459e cmp lr, r3 8006c62: | | | | | | | | | | | | | /--|-- d10b bne.n 8006c7c <ip4_input+0xc10> if (lpcb->local_port == tcphdr->dest) { 8006c64: | | | | | | | | | | | | | | \-> 884b ldrh r3, [r1, #2] 8006c66: | | | | | | | | | | | | | | f8b8 e016 ldrh.w lr, [r8, #22] 8006c6a: | | | | | | | | | | | | | | 459e cmp lr, r3 8006c6c: | | | | | | | | | | | | | +----- d106 bne.n 8006c7c <ip4_input+0xc10> if (ip_addr_eq(&lpcb->local_ip, ip_current_dest_addr())) { 8006c6e: | | | | | | | | | | | | | | f8d8 e000 ldr.w lr, [r8] 8006c72: | | | | | | | | | | | | | | 4596 cmp lr, r2 8006c74: | | | | | | | | | | | | | | /-- d006 beq.n 8006c84 <ip4_input+0xc18> } else if (ip_addr_isany(&lpcb->local_ip)) { 8006c76: | | | | | | | | | | | | | | | f1be 0f00 cmp.w lr, #0 8006c7a: | | | | | | | | | | | | | | +-- d003 beq.n 8006c84 <ip4_input+0xc18> for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { 8006c7c: | | | | | | | | | | | | | \--|-> 4645 mov r5, r8 8006c7e: | | | | | | | | | | | | | | f8d8 800c ldr.w r8, [r8, #12] 8006c82: | | | | | | | | | | | \--|-----------------------|-- e693 b.n 80069ac <ip4_input+0x940> if (prev != NULL) { 8006c84: | | | | | | | | | | | | /--\-X b1cd cbz r5, 8006cba <ip4_input+0xc4e> ((struct tcp_pcb_listen *)prev)->next = lpcb->next; 8006c86: | | | | | | | | | | | | | f8d8 200c ldr.w r2, [r8, #12] 8006c8a: | | | | | | | | | | | | | 60ea str r2, [r5, #12] tcp_listen_pcbs.listen_pcbs = lpcb; 8006c8c: | | | | | | | | | | | | | f8c4 8104 str.w r8, [r4, #260] @ 0x104 lpcb->next = tcp_listen_pcbs.listen_pcbs; 8006c90: | | | | | | | | | | | | | f8c8 c00c str.w ip, [r8, #12] if (flags & TCP_RST) { 8006c94: | | | | | | | | | | | | | /-> f894 20cc ldrb.w r2, [r4, #204] @ 0xcc 8006c98: | | | | | | | | | | | | | | 0755 lsls r5, r2, #29 8006c9a: | | | | | +--|--|--|--|--|-----------------------------|--------------------|--|-- f53f acd4 bmi.w 8006646 <ip4_input+0x5da> if (flags & TCP_ACK) { 8006c9e: | | | | | | | | | | | | | | 06d5 lsls r5, r2, #27 8006ca0: | | | | | | | | | | | | /--|--|-- d522 bpl.n 8006ce8 <ip4_input+0xc7c> tcp_rst_netif(ip_data.current_input_netif, ackno, seqno + tcplen, ip_current_dest_addr(), 8006ca2: | | | | | | | | | | | | | | | 8809 ldrh r1, [r1, #0] 8006ca4: | | | | | | | | | | | | | | | f8b4 50d4 ldrh.w r5, [r4, #212] @ 0xd4 8006ca8: | | | | | | | | | | | | | | | f8d4 20c8 ldr.w r2, [r4, #200] @ 0xc8 8006cac: | | | | | | | | | | | | | | | 9100 str r1, [sp, #0] 8006cae: | | | | | | | | | | | | | | | f8d4 10d0 ldr.w r1, [r4, #208] @ 0xd0 8006cb2: | | | | | | | | | | | | | | | 442a add r2, r5 tcp_rst_netif(ip_data.current_input_netif, ackno, seqno + tcplen, ip_current_dest_addr(), 8006cb4: | | | | | | | | | | | \-----------------|--|--|-> f002 fb46 bl 8009344 <tcp_rst_netif.constprop.0> 8006cb8: | | | | | +--|--|--|--|--|-----------------------------------------------|--|--|-- e4c5 b.n 8006646 <ip4_input+0x5da> TCP_STATS_INC(tcp.cachehit); 8006cba: | | | | | | | | | | | | \--|-> f8b4 2052 ldrh.w r2, [r4, #82] @ 0x52 8006cbe: | | | | | | | | | | | | | 3201 adds r2, #1 8006cc0: | | | | | | | | | | | | | f8a4 2052 strh.w r2, [r4, #82] @ 0x52 8006cc4: | | | | | | | | | | | | \-- e7e6 b.n 8006c94 <ip4_input+0xc28> 8006cc6: | | | | | | | | | | | | bf00 nop 8006cc8: | | | | | | | | | | | | 0800c663 .word 0x0800c663 8006ccc: | | | | | | | | | | | | 0800c68a .word 0x0800c68a 8006cd0: | | | | | | | | | | | | 0800c6b4 .word 0x0800c6b4 8006cd4: | | | | | | | | | | | | 0800b591 .word 0x0800b591 8006cd8: | | | | | | | | | | | | 0800c6db .word 0x0800c6db 8006cdc: | | | | | | | | | | | | 0800b232 .word 0x0800b232 8006ce0: | | | | | | | | | | | | 0800c706 .word 0x0800c706 8006ce4: | | | | | | | | | | | | 20001280 .word 0x20001280 } else if (flags & TCP_SYN) { 8006ce8: | | | | | | | | | | | \-------> 0790 lsls r0, r2, #30 8006cea: | | | | | +--|--|--|--|--|-------------------------------------------------------- f57f acac bpl.w 8006646 <ip4_input+0x5da> pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); 8006cee: | | | | | | | | | | | 2001 movs r0, #1 npcb = tcp_alloc(pcb->prio); 8006cf0: | | | | | | | | | | | f898 a015 ldrb.w sl, [r8, #21] 8006cf4: | | | | | | | | | | | f7fb f9fa bl 80020ec <memp_malloc> if (pcb == NULL) { 8006cf8: | | | | | | | | | | | 4605 mov r5, r0 8006cfa: | | | | | | | | | | | 2800 cmp r0, #0 8006cfc: | | | | | | | | | | | /-------------- d16c bne.n 8006dd8 <ip4_input+0xd6c> struct tcp_pcb *pcb = tcp_active_pcbs; 8006cfe: | | | | | | | | | | | | f8d4 00bc ldr.w r0, [r4, #188] @ 0xbc while (pcb != NULL) { 8006d02: | | | | | | | | | | | /-----------------------------------|-------------> 2800 cmp r0, #0 8006d04: | | | | | | | | | | | | /--------------------------|-------------- f040 80e2 bne.w 8006ecc <ip4_input+0xe60> for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { 8006d08: | | | | | | | | | | | | | | f8d4 30c0 ldr.w r3, [r4, #192] @ 0xc0 if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { 8006d0c: | | | | | | | | | | | | | | f8d4 50d8 ldr.w r5, [r4, #216] @ 0xd8 inactivity = 0; 8006d10: | | | | | | | | | | | | | | 4601 mov r1, r0 for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { 8006d12: | | | | | | | | | | | /--|--------|--------------------------|-------------> 2b00 cmp r3, #0 8006d14: | | | | | | | | | | | | | /--|--------------------------|-------------- f040 80e5 bne.w 8006ee2 <ip4_input+0xe76> if (inactive != NULL) { 8006d18: | | | | | | | | | | | | | | | | /-- b110 cbz r0, 8006d20 <ip4_input+0xcb4> tcp_abandon(pcb, 1); 8006d1a: | | | | | | | | | | | | | | | | | 2101 movs r1, #1 8006d1c: | | | | | | | | | | | | | | | | | f7fc fee6 bl 8003aec <tcp_abandon> pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); 8006d20: | | | | | | | | | | | | | | | | \-> 2001 movs r0, #1 8006d22: | | | | | | | | | | | | | | | | f7fb f9e3 bl 80020ec <memp_malloc> if (pcb == NULL) { 8006d26: | | | | | | | | | | | | | | | | 4605 mov r5, r0 8006d28: | | | | | | | | | | | | | | | | 2800 cmp r0, #0 8006d2a: | | | | | | | | | | | | | | | | /----------- d151 bne.n 8006dd0 <ip4_input+0xd64> for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { 8006d2c: | | | | | | | | | | | | | | | | | f8d4 10bc ldr.w r1, [r4, #188] @ 0xbc if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { 8006d30: | | | | | | | | | | | | | | | | | f8d4 00d8 ldr.w r0, [r4, #216] @ 0xd8 inactivity = 0; 8006d34: | | | | | | | | | | | | | | | | | 462a mov r2, r5 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { 8006d36: | | | | | | | | | | | | | /--|--|--------------------------|--|----------> 2900 cmp r1, #0 8006d38: | | | | | | | | | | | | | | | | /--------------------|--|----------- f040 80dc bne.w 8006ef4 <ip4_input+0xe88> if (inactive != NULL) { 8006d3c: | | | | | | | | | | | | | | | | | | | /-- b115 cbz r5, 8006d44 <ip4_input+0xcd8> tcp_abandon(inactive, 0); 8006d3e: | | | | | | | | | | | | | | | | | | | | 4628 mov r0, r5 8006d40: | | | | | | | | | | | | | | | | | | | | f7fc fed4 bl 8003aec <tcp_abandon> pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); 8006d44: | | | | | | | | | | | | | | | | | | | \-> 2001 movs r0, #1 8006d46: | | | | | | | | | | | | | | | | | | | f7fb f9d1 bl 80020ec <memp_malloc> if (pcb == NULL) { 8006d4a: | | | | | | | | | | | | | | | | | | | f8df 933c ldr.w r9, [pc, #828] @ 8007088 8006d4e: | | | | | | | | | | | | | | | | | | | 4605 mov r5, r0 8006d50: | | | | | | | | | | | | | | | | | | | 2800 cmp r0, #0 8006d52: | | | | | | | | | | | | | | | | | | | /-------- d138 bne.n 8006dc6 <ip4_input+0xd5a> for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { 8006d54: | | | | | | | | | | | | | | | | | | | | f8d9 10bc ldr.w r1, [r9, #188] @ 0xbc if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { 8006d58: | | | | | | | | | | | | | | | | | | | | f8d9 00d8 ldr.w r0, [r9, #216] @ 0xd8 inactivity = 0; 8006d5c: | | | | | | | | | | | | | | | | | | | | 462a mov r2, r5 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { 8006d5e: | | | | | | | | | | | | | | | | /--|--------------------|--|--|-------> 2900 cmp r1, #0 8006d60: | | | | | | | | | | | | | | | | | | /--------------|--|--|-------- f040 80d3 bne.w 8006f0a <ip4_input+0xe9e> if (inactive != NULL) { 8006d64: | | | | | | | | | | | | | | | | | | | | | | /-- b115 cbz r5, 8006d6c <ip4_input+0xd00> tcp_abandon(inactive, 0); 8006d66: | | | | | | | | | | | | | | | | | | | | | | | 4628 mov r0, r5 8006d68: | | | | | | | | | | | | | | | | | | | | | | | f7fc fec0 bl 8003aec <tcp_abandon> pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); 8006d6c: | | | | | | | | | | | | | | | | | | | | | | \-> 2001 movs r0, #1 8006d6e: | | | | | | | | | | | | | | | | | | | | | | f7fb f9bd bl 80020ec <memp_malloc> if (pcb == NULL) { 8006d72: | | | | | | | | | | | | | | | | | | | | | | 4605 mov r5, r0 8006d74: | | | | | | | | | | | | | | | | | | | | | | /----- bb10 cbnz r0, 8006dbc <ip4_input+0xd50> mprio = LWIP_MIN(TCP_PRIO_MAX, prio); 8006d76: | | | | | | | | | | | | | | | | | | | | | | | f01a 0f80 tst.w sl, #128 @ 0x80 8006d7a: | | | | | | | | | | | | | | | | | | | /-----------|--|--|--|----- f040 80d1 bne.w 8006f20 <ip4_input+0xeb4> if (mprio == 0) { 8006d7e: | | | | | | | | | | | | | | | | | | | | | | | | f1ba 0f00 cmp.w sl, #0 8006d82: | | | | | | | | | | | | | | | | | | | | | | | | /-- d00f beq.n 8006da4 <ip4_input+0xd38> 8006d84: | | | | | | | | | | | | | | | | | | | | | | | | | 4651 mov r1, sl mprio--; 8006d86: | | | | | | | | | | | | | | | | | | | | /--------|--|--|--|--|-> 3901 subs r1, #1 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { 8006d88: | | | | | | | | | | | | | | | | | | | | | | | | | | f8d9 30bc ldr.w r3, [r9, #188] @ 0xbc ((pcb->prio == mprio) && ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity))) { 8006d8c: | | | | | | | | | | | | | | | | | | | | | | | | | | f8d9 c0d8 ldr.w ip, [r9, #216] @ 0xd8 mprio--; 8006d90: | | | | | | | | | | | | | | | | | | | | | | | | | | b2c9 uxtb r1, r1 inactivity = 0; 8006d92: | | | | | | | | | | | | | | | | | | | | | | | | | | 2000 movs r0, #0 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { 8006d94: | | | | | | | | | | | | | | | | | | /--|--|--|--------|--|--|--|--|-> 2b00 cmp r3, #0 8006d96: | | | | | | | | | | | | | | | | | | | | | | /--|--|--|--|--|-- f040 80c5 bne.w 8006f24 <ip4_input+0xeb8> if (inactive != NULL) { 8006d9a: | | | | | | | | | | | | | | | | | | | | | | | | | | | +-- b11d cbz r5, 8006da4 <ip4_input+0xd38> tcp_abandon(pcb, 1); 8006d9c: | | | | | | | | | | | | | | | | | | | | | | | | | | | | 2101 movs r1, #1 8006d9e: | | | | | | | | | | | | | | | | | | | | | | | | | | | | 4628 mov r0, r5 8006da0: | | | | | | | | | | | | | | | | | | | | | | | | | | | | f7fc fea4 bl 8003aec <tcp_abandon> pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); 8006da4: | | | | | | | | | | | | | | | | | | | | | | | | | | | \-> 2001 movs r0, #1 8006da6: | | | | | | | | | | | | | | | | | | | | | | | | | | | f7fb f9a1 bl 80020ec <memp_malloc> if (pcb != NULL) { 8006daa: | | | | | | | | | | | | | | | | | | | | | | | | | | | 4605 mov r5, r0 8006dac: | | | | | | | | | | | | | | | | | | | | | | | | | | | 2800 cmp r0, #0 8006dae: | | | | | | | | | | | | | | | | | | | | | | /--|--|--|--|--|----- f000 80ca beq.w 8006f46 <ip4_input+0xeda> MEMP_STATS_DEC(err, MEMP_TCP_PCB); 8006db2: | | | | | | | | | | | | | | | | | | | | | | | | | | | | f8d9 2058 ldr.w r2, [r9, #88] @ 0x58 8006db6: | | | | | | | | | | | | | | | | | | | | | | | | | | | | 8893 ldrh r3, [r2, #4] 8006db8: | | | | | | | | | | | | | | | | | | | | | | | | | | | | 3b01 subs r3, #1 8006dba: | | | | | | | | | | | | | | | | | | | | | | | | | | | | 8093 strh r3, [r2, #4] MEMP_STATS_DEC(err, MEMP_TCP_PCB); 8006dbc: | | | | | | | | | | | | | | | | | | | | | | | | | | | \----> f8d9 2058 ldr.w r2, [r9, #88] @ 0x58 8006dc0: | | | | | | | | | | | | | | | | | | | | | | | | | | | 8893 ldrh r3, [r2, #4] 8006dc2: | | | | | | | | | | | | | | | | | | | | | | | | | | | 3b01 subs r3, #1 8006dc4: | | | | | | | | | | | | | | | | | | | | | | | | | | | 8093 strh r3, [r2, #4] MEMP_STATS_DEC(err, MEMP_TCP_PCB); 8006dc6: | | | | | | | | | | | | | | | | | | | | | | | | | | \-------> f8d9 2058 ldr.w r2, [r9, #88] @ 0x58 8006dca: | | | | | | | | | | | | | | | | | | | | | | | | | | 8893 ldrh r3, [r2, #4] 8006dcc: | | | | | | | | | | | | | | | | | | | | | | | | | | 3b01 subs r3, #1 8006dce: | | | | | | | | | | | | | | | | | | | | | | | | | | 8093 strh r3, [r2, #4] MEMP_STATS_DEC(err, MEMP_TCP_PCB); 8006dd0: | | | | | | | | | | | | | | | | | | | | | | | | | \----------> 6da2 ldr r2, [r4, #88] @ 0x58 8006dd2: | | | | | | | | | | | | | | | | | | | | | | | | | 8893 ldrh r3, [r2, #4] 8006dd4: | | | | | | | | | | | | | | | | | | | | | | | | | 3b01 subs r3, #1 8006dd6: | | | | | | | | | | | | | | | | | | | | | | | | | 8093 strh r3, [r2, #4] memset(pcb, 0, sizeof(struct tcp_pcb)); 8006dd8: | | | | | | | | | | | | | | | | | | | | | | | | \-------------> 2294 movs r2, #148 @ 0x94 8006dda: | | | | | | | | | | | | | | | | | | | | | | | | 2100 movs r1, #0 8006ddc: | | | | | | | | | | | | | | | | | | | | | | | | f105 0008 add.w r0, r5, #8 8006de0: | | | | | | | | | | | | | | | | | | | | | | | | f004 f878 bl 800aed4 <memset> pcb->last_timer = tcp_timer_ctr; 8006de4: | | | | | | | | | | | | | | | | | | | | | | | | f894 2110 ldrb.w r2, [r4, #272] @ 0x110 8006de8: | | | | | | | | | | | | | | | | | | | | | | | | 77aa strb r2, [r5, #30] pcb->snd_buf = TCP_SND_BUF; 8006dea: | | | | | | | | | | | | | | | | | | | | | | | | f44f 6386 mov.w r3, #1072 @ 0x430 pcb->cwnd = 1; 8006dee: | | | | | | | | | | | | | | | | | | | | | | | | 4aa0 ldr r2, [pc, #640] @ (8007070 ) pcb->snd_buf = TCP_SND_BUF; 8006df0: | | | | | | | | | | | | | | | | | | | | | | | | f8a5 3064 strh.w r3, [r5, #100] @ 0x64 pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(TCP_WND); 8006df4: | | | | | | | | | | | | | | | | | | | | | | | | 4b9f ldr r3, [pc, #636] @ (8007074 ) 8006df6: | | | | | | | | | | | | | | | | | | | | | | | | 62ab str r3, [r5, #40] @ 0x28 pcb->cwnd = 1; 8006df8: | | | | | | | | | | | | | | | | | | | | | | | | 64aa str r2, [r5, #72] @ 0x48 pcb->ttl = TCP_TTL; 8006dfa: | | | | | | | | | | | | | | | | | | | | | | | | 23ff movs r3, #255 @ 0xff pcb->recv = tcp_recv_null; 8006dfc: | | | | | | | | | | | | | | | | | | | | | | | | 4a9e ldr r2, [pc, #632] @ (8007078 ) pcb->ttl = TCP_TTL; 8006dfe: | | | | | | | | | | | | | | | | | | | | | | | | 72eb strb r3, [r5, #11] pcb->prio = prio; 8006e00: | | | | | | | | | | | | | | | | | | | | | | | | f885 a015 strb.w sl, [r5, #21] pcb->rto = LWIP_TCP_RTO_TIME / TCP_SLOW_INTERVAL; 8006e04: | | | | | | | | | | | | | | | | | | | | | | | | 2306 movs r3, #6 pcb->recv = tcp_recv_null; 8006e06: | | | | | | | | | | | | | | | | | | | | | | | | f8c5 2084 str.w r2, [r5, #132] @ 0x84 pcb->keep_idle = TCP_KEEPIDLE_DEFAULT; 8006e0a: | | | | | | | | | | | | | | | | | | | | | | | | 4a9c ldr r2, [pc, #624] @ (800707c ) pcb->rto = LWIP_TCP_RTO_TIME / TCP_SLOW_INTERVAL; 8006e0c: | | | | | | | | | | | | | | | | | | | | | | | | f8a5 3040 strh.w r3, [r5, #64] @ 0x40 pcb->sv = LWIP_TCP_RTO_TIME / TCP_SLOW_INTERVAL; 8006e10: | | | | | | | | | | | | | | | | | | | | | | | | 87eb strh r3, [r5, #62] @ 0x3e pcb->keep_idle = TCP_KEEPIDLE_DEFAULT; 8006e12: | | | | | | | | | | | | | | | | | | | | | | | | f8c5 2094 str.w r2, [r5, #148] @ 0x94 pcb->rtime = -1; 8006e16: | | | | | | | | | | | | | | | | | | | | | | | | 4b9a ldr r3, [pc, #616] @ (8007080 ) ip_addr_copy(npcb->local_ip, *ip_current_dest_addr()); 8006e18: | | | | | | | | | | | | | | | | | | | | | | | | f8d4 212c ldr.w r2, [r4, #300] @ 0x12c 8006e1c: | | | | | | | | | | | | | | | | | | | | | | | | 632b str r3, [r5, #48] @ 0x30 npcb->remote_port = tcphdr->src; 8006e1e: | | | | | | | | | | | | | | | | | | | | | | | | f8d7 1134 ldr.w r1, [r7, #308] @ 0x134 ip_addr_copy(npcb->local_ip, *ip_current_dest_addr()); 8006e22: | | | | | | | | | | | | | | | | | | | | | | | | 602a str r2, [r5, #0] ip_addr_copy(npcb->remote_ip, *ip_current_src_addr()); 8006e24: | | | | | | | | | | | | | | | | | | | | | | | | f8d4 2128 ldr.w r2, [r4, #296] @ 0x128 8006e28: | | | | | | | | | | | | | | | | | | | | | | | | 606a str r2, [r5, #4] npcb->local_port = pcb->local_port; 8006e2a: | | | | | | | | | | | | | | | | | | | | | | | | f8b8 2016 ldrh.w r2, [r8, #22] 8006e2e: | | | | | | | | | | | | | | | | | | | | | | | | 82ea strh r2, [r5, #22] npcb->remote_port = tcphdr->src; 8006e30: | | | | | | | | | | | | | | | | | | | | | | | | 780a ldrb r2, [r1, #0] 8006e32: | | | | | | | | | | | | | | | | | | | | | | | | 7849 ldrb r1, [r1, #1] iss += tcp_ticks; /* XXX */ 8006e34: | | | | | | | | | | | | | | | | | | | | | | | | 4893 ldr r0, [pc, #588] @ (8007084 ) pcb->tmr = tcp_ticks; 8006e36: | | | | | | | | | | | | | | | | | | | | | | | | f8d4 30d8 ldr.w r3, [r4, #216] @ 0xd8 8006e3a: | | | | | | | | | | | | | | | | | | | | | | | | 622b str r3, [r5, #32] 8006e3c: | | | | | | | | | | | | | | | | | | | | | | | | ea42 2201 orr.w r2, r2, r1, lsl #8 8006e40: | | | | | | | | | | | | | | | | | | | | | | | | 832a strh r2, [r5, #24] npcb->state = SYN_RCVD; 8006e42: | | | | | | | | | | | | | | | | | | | | | | | | 2203 movs r2, #3 8006e44: | | | | | | | | | | | | | | | | | | | | | | | | 752a strb r2, [r5, #20] npcb->rcv_nxt = seqno + 1; 8006e46: | | | | | | | | | | | | | | | | | | | | | | | | f8d4 20c8 ldr.w r2, [r4, #200] @ 0xc8 8006e4a: | | | | | | | | | | | | | | | | | | | | | | | | 1c51 adds r1, r2, #1 8006e4c: | | | | | | | | | | | | | | | | | | | | | | | | 6269 str r1, [r5, #36] @ 0x24 npcb->rcv_ann_right_edge = npcb->rcv_nxt; 8006e4e: | | | | | | | | | | | | | | | | | | | | | | | | 62e9 str r1, [r5, #44] @ 0x2c iss += tcp_ticks; /* XXX */ 8006e50: | | | | | | | | | | | | | | | | | | | | | | | | 6cc1 ldr r1, [r0, #76] @ 0x4c 8006e52: | | | | | | | | | | | | | | | | | | | | | | | | 440b add r3, r1 8006e54: | | | | | | | | | | | | | | | | | | | | | | | | 64c3 str r3, [r0, #76] @ 0x4c npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */ 8006e56: | | | | | | | | | | | | | | | | | | | | | | | | 3a01 subs r2, #1 npcb->snd_wl2 = iss; 8006e58: | | | | | | | | | | | | | | | | | | | | | | | | 65ab str r3, [r5, #88] @ 0x58 npcb->snd_nxt = iss; 8006e5a: | | | | | | | | | | | | | | | | | | | | | | | | 652b str r3, [r5, #80] @ 0x50 npcb->lastack = iss; 8006e5c: | | | | | | | | | | | | | | | | | | | | | | | | 646b str r3, [r5, #68] @ 0x44 npcb->snd_lbb = iss; 8006e5e: | | | | | | | | | | | | | | | | | | | | | | | | 65eb str r3, [r5, #92] @ 0x5c npcb->callback_arg = pcb->callback_arg; 8006e60: | | | | | | | | | | | | | | | | | | | | | | | | f8d8 3010 ldr.w r3, [r8, #16] npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */ 8006e64: | | | | | | | | | | | | | | | | | | | | | | | | 656a str r2, [r5, #84] @ 0x54 npcb->callback_arg = pcb->callback_arg; 8006e66: | | | | | | | | | | | | | | | | | | | | | | | | 612b str r3, [r5, #16] npcb->listener = pcb; 8006e68: | | | | | | | | | | | | | | | | | | | | | | | | f8c5 807c str.w r8, [r5, #124] @ 0x7c npcb->so_options = pcb->so_options & SOF_INHERITED; 8006e6c: | | | | | | | | | | | | | | | | | | | | | | | | f898 3009 ldrb.w r3, [r8, #9] 8006e70: | | | | | | | | | | | | | | | | | | | | | | | | f003 030c and.w r3, r3, #12 8006e74: | | | | | | | | | | | | | | | | | | | | | | | | 726b strb r3, [r5, #9] npcb->netif_idx = pcb->netif_idx; 8006e76: | | | | | | | | | | | | | | | | | | | | | | | | f898 3008 ldrb.w r3, [r8, #8] 8006e7a: | | | | | | | | | | | | | | | | | | | | | | | | 722b strb r3, [r5, #8] TCP_REG_ACTIVE(npcb); 8006e7c: | | | | | | | | | | | | | | | | | | | | | | | | f8d4 30bc ldr.w r3, [r4, #188] @ 0xbc 8006e80: | | | | | | | | | | | | | | | | | | | | | | | | 60eb str r3, [r5, #12] 8006e82: | | | | | | | | | | | | | | | | | | | | | | | | f8c4 50bc str.w r5, [r4, #188] @ 0xbc 8006e86: | | | | | | | | | | | | | | | | | | | | | | | | f7fb fac9 bl 800241c <tcp_timer_needed> 8006e8a: | | | | | | | | | | | | | | | | | | | | | | | | 2301 movs r3, #1 tcp_parseopt(npcb); 8006e8c: | | | | | | | | | | | | | | | | | | | | | | | | 4628 mov r0, r5 TCP_REG_ACTIVE(npcb); 8006e8e: | | | | | | | | | | | | | | | | | | | | | | | | f884 3100 strb.w r3, [r4, #256] @ 0x100 tcp_parseopt(npcb); 8006e92: | | | | | | | | | | | | | | | | | | | | | | | | f7fa ff45 bl 8001d20 <tcp_parseopt> npcb->snd_wnd = tcphdr->wnd; 8006e96: | | | | | | | | | | | | | | | | | | | | | | | | f8d7 3134 ldr.w r3, [r7, #308] @ 0x134 npcb->mss = tcp_eff_send_mss(npcb->mss, &npcb->local_ip, &npcb->remote_ip); 8006e9a: | | | | | | | | | | | | | | | | | | | | | | | | 8e6f ldrh r7, [r5, #50] @ 0x32 npcb->snd_wnd = tcphdr->wnd; 8006e9c: | | | | | | | | | | | | | | | | | | | | | | | | 89db ldrh r3, [r3, #14] 8006e9e: | | | | | | | | | | | | | | | | | | | | | | | | f8a5 3060 strh.w r3, [r5, #96] @ 0x60 npcb->snd_wnd_max = npcb->snd_wnd; 8006ea2: | | | | | | | | | | | | | | | | | | | | | | | | f8a5 3062 strh.w r3, [r5, #98] @ 0x62 npcb->mss = tcp_eff_send_mss(npcb->mss, &npcb->local_ip, &npcb->remote_ip); 8006ea6: | | | | | | | | | | | | | | | | | | | | | | | | 1d28 adds r0, r5, #4 8006ea8: | | | | | | | | | | | | | | | | | | | | | | | | f7fe ff7e bl 8005da8 <ip4_route> if (outif == NULL) { 8006eac: | | | | | | | | | | | | | | | | | | | | | | | | 2800 cmp r0, #0 8006eae: | | | | | | | | | | | | | | | | | | | | | | | | /-------- d15c bne.n 8006f6a <ip4_input+0xefe> 8006eb0: | | | | | | | | | | | | | | | | | | | | | | | | /--|-------> 866f strh r7, [r5, #50] @ 0x32 rc = tcp_enqueue_flags(npcb, TCP_SYN | TCP_ACK); 8006eb2: | | | | | | | | | | | | | | | | | | | | | | | | | | 2112 movs r1, #18 8006eb4: | | | | | | | | | | | | | | | | | | | | | | | | | | 4628 mov r0, r5 8006eb6: | | | | | | | | | | | | | | | | | | | | | | | | | | f7fb fdb9 bl 8002a2c <tcp_enqueue_flags> if (rc != ERR_OK) { 8006eba: | | | | | | | | | | | | | | | | | | | | | | | | | | 2800 cmp r0, #0 8006ebc: | | | | | | | | | | \--|--|--|--|--|--|--|--|--|--|--|--|--|-----|--|-------- f43f aec1 beq.w 8006c42 <ip4_input+0xbd6> tcp_abandon(npcb, 0); 8006ec0: | | | | | | | | | | | | | | | | | | | | | | | | | 2100 movs r1, #0 8006ec2: | | | | | | | | | | | | | | | | | | | | | | | | | 4628 mov r0, r5 8006ec4: | | | | | | | | | | | | | | | | | | | | | | | | | f7fc fe12 bl 8003aec <tcp_abandon> return; 8006ec8: | | | | | +--|--|--|--|-----|--|--|--|--|--|--|--|--|--|--|--|--|-----|--|-------- f7ff bbbd b.w 8006646 <ip4_input+0x5da> if (pcb->flags & TF_CLOSEPEND) { 8006ecc: | | | | | | | | | | | | | | \--|--|--|--|--|--|--|--|-----|--|-------> 8b43 ldrh r3, [r0, #26] struct tcp_pcb *next = pcb->next; 8006ece: | | | | | | | | | | | | | | | | | | | | | | | | 68c5 ldr r5, [r0, #12] if (pcb->flags & TF_CLOSEPEND) { 8006ed0: | | | | | | | | | | | | | | | | | | | | | | | | 0719 lsls r1, r3, #28 8006ed2: | | | | | | | | | | | | | | | | | | | | | | | | /-- d504 bpl.n 8006ede <ip4_input+0xe72> tcp_clear_flags(pcb, TF_CLOSEPEND); 8006ed4: | | | | | | | | | | | | | | | | | | | | | | | | | f023 0308 bic.w r3, r3, #8 8006ed8: | | | | | | | | | | | | | | | | | | | | | | | | | 8343 strh r3, [r0, #26] tcp_close_shutdown_fin(pcb); 8006eda: | | | | | | | | | | | | | | | | | | | | | | | | | f7fc fd57 bl 800398c <tcp_close_shutdown_fin> for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { 8006ede: | | | | | | | | | | | | | | | | | | | | | | | | \-> 4628 mov r0, r5 8006ee0: | | | | | | | | | | | \--|--|-----|--|--|--|--|--|--|--|-----|--|-------- e70f b.n 8006d02 <ip4_input+0xc96> if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { 8006ee2: | | | | | | | | | | | | \-----|--|--|--|--|--|--|--|-----|--|-------> 6a1a ldr r2, [r3, #32] 8006ee4: | | | | | | | | | | | | | | | | | | | | | | 1aaa subs r2, r5, r2 8006ee6: | | | | | | | | | | | | | | | | | | | | | | 428a cmp r2, r1 8006ee8: | | | | | | | | | | | | | | | | | | | | | | bf34 ite cc 8006eea: | | | | | | | | | | | | | | | | | | | | | | 460a movcc r2, r1 inactive = pcb; 8006eec: | | | | | | | | | | | | | | | | | | | | | | 4618 movcs r0, r3 for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { 8006eee: | | | | | | | | | | | | | | | | | | | | | | 4611 mov r1, r2 8006ef0: | | | | | | | | | | | | | | | | | | | | | | 68db ldr r3, [r3, #12] 8006ef2: | | | | | | | | | | \-----|--------|--|--|--|--|--|--|--|-----|--|-------- e70e b.n 8006d12 <ip4_input+0xca6> if (pcb->state == state) { 8006ef4: | | | | | | | | | | | | \--|--|--|--|--|--|-----|--|-------> 7d0b ldrb r3, [r1, #20] 8006ef6: | | | | | | | | | | | | | | | | | | | | 2b09 cmp r3, #9 8006ef8: | | | | | | | | | | | | | | | | | | | | /-- d105 bne.n 8006f06 <ip4_input+0xe9a> if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { 8006efa: | | | | | | | | | | | | | | | | | | | | | 6a0b ldr r3, [r1, #32] 8006efc: | | | | | | | | | | | | | | | | | | | | | 1ac3 subs r3, r0, r3 8006efe: | | | | | | | | | | | | | | | | | | | | | 4293 cmp r3, r2 inactivity = tcp_ticks - pcb->tmr; 8006f00: | | | | | | | | | | | | | | | | | | | | | bf24 itt cs 8006f02: | | | | | | | | | | | | | | | | | | | | | 461a movcs r2, r3 inactive = pcb; 8006f04: | | | | | | | | | | | | | | | | | | | | | 460d movcs r5, r1 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { 8006f06: | | | | | | | | | | | | | | | | | | | | \-> 68c9 ldr r1, [r1, #12] 8006f08: | | | | | | | | | | \--------|-----|--|--|--|--|--|-----|--|-------- e715 b.n 8006d36 <ip4_input+0xcca> if (pcb->state == state) { 8006f0a: | | | | | | | | | | | | \--|--|--|--|-----|--|-------> 7d0b ldrb r3, [r1, #20] 8006f0c: | | | | | | | | | | | | | | | | | | 2b08 cmp r3, #8 8006f0e: | | | | | | | | | | | | | | | | | | /-- d105 bne.n 8006f1c <ip4_input+0xeb0> if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { 8006f10: | | | | | | | | | | | | | | | | | | | 6a0b ldr r3, [r1, #32] 8006f12: | | | | | | | | | | | | | | | | | | | 1ac3 subs r3, r0, r3 8006f14: | | | | | | | | | | | | | | | | | | | 4293 cmp r3, r2 inactivity = tcp_ticks - pcb->tmr; 8006f16: | | | | | | | | | | | | | | | | | | | bf24 itt cs 8006f18: | | | | | | | | | | | | | | | | | | | 461a movcs r2, r3 inactive = pcb; 8006f1a: | | | | | | | | | | | | | | | | | | | 460d movcs r5, r1 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { 8006f1c: | | | | | | | | | | | | | | | | | | \-> 68c9 ldr r1, [r1, #12] 8006f1e: | | | | | | | | | | \-----|-----|--|--|--|-----|--|-------- e71e b.n 8006d5e <ip4_input+0xcf2> mprio = LWIP_MIN(TCP_PRIO_MAX, prio); 8006f20: | | | | | | | | | | | \--|--|--|-----|--|-------> 217f movs r1, #127 @ 0x7f 8006f22: | | | | | | | | | | | \--|--|-----|--|-------- e730 b.n 8006d86 <ip4_input+0xd1a> if ((pcb->prio < mprio) || 8006f24: | | | | | | | | | | | | \-----|--|-------> f893 e015 ldrb.w lr, [r3, #21] 8006f28: | | | | | | | | | | | | | | 458e cmp lr, r1 8006f2a: | | | | | | | | | | | | | | /-- d305 bcc.n 8006f38 <ip4_input+0xecc> 8006f2c: | | | | | | | | | | | | | | /--|-- d109 bne.n 8006f42 <ip4_input+0xed6> ((pcb->prio == mprio) && ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity))) { 8006f2e: | | | | | | | | | | | | | | | | 6a1a ldr r2, [r3, #32] 8006f30: | | | | | | | | | | | | | | | | ebac 0202 sub.w r2, ip, r2 8006f34: | | | | | | | | | | | | | | | | 4282 cmp r2, r0 8006f36: | | | | | | | | | | | | | | +--|-- d304 bcc.n 8006f42 <ip4_input+0xed6> inactivity = tcp_ticks - pcb->tmr; 8006f38: | | | | | | | | | | | | | | | \-> 6a18 ldr r0, [r3, #32] mprio = pcb->prio; 8006f3a: | | | | | | | | | | | | | | | 4671 mov r1, lr inactivity = tcp_ticks - pcb->tmr; 8006f3c: | | | | | | | | | | | | | | | ebac 0000 sub.w r0, ip, r0 inactive = pcb; 8006f40: | | | | | | | | | | | | | | | 461d mov r5, r3 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { 8006f42: | | | | | | | | | | | | | | \----> 68db ldr r3, [r3, #12] 8006f44: | | | | | | | | | | \-----------|--------|--|-------- e726 b.n 8006d94 <ip4_input+0xd28> TCP_STATS_INC(tcp.memerr); 8006f46: | | | | | | | | | | \--------|--|-------> f8b9 3048 ldrh.w r3, [r9, #72] @ 0x48 8006f4a: | | | | | | | | | | | | 3301 adds r3, #1 8006f4c: | | | | | | | | | | | | f8a9 3048 strh.w r3, [r9, #72] @ 0x48 TCP_EVENT_ACCEPT(pcb, NULL, pcb->callback_arg, ERR_MEM, err); 8006f50: | | | | | | | | | | | | f8d8 3018 ldr.w r3, [r8, #24] 8006f54: | | | | | | | | | | | | 2b00 cmp r3, #0 8006f56: | | | | | +--|--|--|--|-----------------------------------------------|--|-------- f43f ab76 beq.w 8006646 <ip4_input+0x5da> 8006f5a: | | | | | | | | | | | | 4601 mov r1, r0 8006f5c: | | | | | | | | | | | | f04f 32ff mov.w r2, #4294967295 @ 0xffffffff 8006f60: | | | | | | | | | | | | f8d8 0010 ldr.w r0, [r8, #16] 8006f64: | | | | | | | | | | | | 4798 blx r3 8006f66: | | | | | +--|--|--|--|-----------------------------------------------|--|-------- f7ff bb6e b.w 8006646 <ip4_input+0x5da> mtu = outif->mtu; 8006f6a: | | | | | | | | | | | \-------> 8d83 ldrh r3, [r0, #44] @ 0x2c if (mtu != 0) { 8006f6c: | | | | | | | | | | | 2b00 cmp r3, #0 8006f6e: | | | | | | | | | | +----------- d09f beq.n 8006eb0 <ip4_input+0xe44> mss_s = (mtu > offset) ? (u16_t)(mtu - offset) : 0; 8006f70: | | | | | | | | | | | 2b28 cmp r3, #40 @ 0x28 8006f72: | | | | | | | | | | | bf38 it cc 8006f74: | | | | | | | | | | | 2328 movcc r3, #40 @ 0x28 8006f76: | | | | | | | | | | | 3b28 subs r3, #40 @ 0x28 sendmss = LWIP_MIN(sendmss, mss_s); 8006f78: | | | | | | | | | | | b29b uxth r3, r3 8006f7a: | | | | | | | | | | | 429f cmp r7, r3 8006f7c: | | | | | | | | | | | bf28 it cs 8006f7e: | | | | | | | | | | | 461f movcs r7, r3 8006f80: | | | | | | | | | | \----------- e796 b.n 8006eb0 <ip4_input+0xe44> if (flags & TCP_RST) { 8006f82: | | | | | | | | | \----------------------------------------------------------> f894 20cc ldrb.w r2, [r4, #204] @ 0xcc 8006f86: | | | | | | | | | 4e40 ldr r6, [pc, #256] @ (8007088 ) tcp_input_pcb = pcb; 8006f88: | | | | | | | | | f8c4 50f8 str.w r5, [r4, #248] @ 0xf8 if (flags & TCP_RST) { 8006f8c: | | | | | | | | | f012 0f04 tst.w r2, #4 8006f90: | | | | | | | | | /-------------- d042 beq.n 8007018 <ip4_input+0xfac> if (pcb->state == SYN_SENT) { 8006f92: | | | | | | | | | | 7d29 ldrb r1, [r5, #20] 8006f94: | | | | | | | | | | 2902 cmp r1, #2 8006f96: | | | | | | | | | | /----- d122 bne.n 8006fde <ip4_input+0xf72> if (ackno == pcb->snd_nxt) { 8006f98: | | | | | | | | | | | 6d2a ldr r2, [r5, #80] @ 0x50 8006f9a: | | | | | | | | | | | f8d4 30d0 ldr.w r3, [r4, #208] @ 0xd0 8006f9e: | | | | | | | | | | | 429a cmp r2, r3 8006fa0: | | | | | | | | | /--------------------|--------|----- d109 bne.n 8006fb6 <ip4_input+0xf4a> recv_flags |= TF_RESET; 8006fa2: | | | | | | | | | | | /--|----> f894 30f4 ldrb.w r3, [r4, #244] @ 0xf4 8006fa6: | | | | | | | | | | | | | f043 0308 orr.w r3, r3, #8 8006faa: | | | | | | | | | | | | | f884 30f4 strb.w r3, [r4, #244] @ 0xf4 tcp_clear_flags(pcb, TF_ACK_DELAY); 8006fae: | | | | | | | | | | | | | 8b6b ldrh r3, [r5, #26] 8006fb0: | | | | | | | | | | | | | f023 0301 bic.w r3, r3, #1 8006fb4: | | | | | | | | | | | /--|--|----> 836b strh r3, [r5, #26] if (recv_flags & TF_RESET) { 8006fb6: | | | | | | | | | >--------------------|--|--|--|----> f894 30f4 ldrb.w r3, [r4, #244] @ 0xf4 8006fba: | | | | | | | | | | | | | | 071a lsls r2, r3, #28 8006fbc: | | | | | | | | | | /-----------------|--|--|--|----- f140 8251 bpl.w 8007462 <ip4_input+0x13f6> TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_RST); 8006fc0: | | | | | | | | | | | | | | | f8d5 3090 ldr.w r3, [r5, #144] @ 0x90 8006fc4: | | | | | | | | | | | | | | | /-- b11b cbz r3, 8006fce <ip4_input+0xf62> 8006fc6: | | | | | | | | | | | | | | | | 6928 ldr r0, [r5, #16] 8006fc8: | | | | | | | | | | | | | | | | f06f 010d mvn.w r1, #13 8006fcc: | | | | | | | | | | | | | | | | 4798 blx r3 tcp_pcb_remove(&tcp_active_pcbs, pcb); 8006fce: | | | | | | | | | | | | | | | \-> 482f ldr r0, [pc, #188] @ (800708c ) 8006fd0: | | | | | | | | | | | | | | | 4629 mov r1, r5 8006fd2: | | | | | | | | | | | | | | | f7fc fd13 bl 80039fc <tcp_pcb_remove> tcp_free(pcb); 8006fd6: | | | | | | | | | | | | | | | 4628 mov r0, r5 8006fd8: | | | | | | | | | | | | | | | f7fb fa4c bl 8002474 <tcp_free> 8006fdc: | | | | | | | | +--------------------------|--|-----------------|--|--|--|----- e5bd b.n 8006b5a <ip4_input+0xaee> if (seqno == pcb->rcv_nxt) { 8006fde: | | | | | | | | | | | | | | \----> 6a6b ldr r3, [r5, #36] @ 0x24 8006fe0: | | | | | | | | | | | | | | f8d4 20c8 ldr.w r2, [r4, #200] @ 0xc8 8006fe4: | | | | | | | | | | | | | | 4293 cmp r3, r2 8006fe6: | | | | | | | | | | | | | | /-- d008 beq.n 8006ffa <ip4_input+0xf8e> } else if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, 8006fe8: | | | | | | | | | | | | | | | 1ad1 subs r1, r2, r3 8006fea: | | | | | | | | | | | | | | | 2900 cmp r1, #0 8006fec: | | | | | | | | | +--|-----------------|--|--|-----|-- dbe3 blt.n 8006fb6 <ip4_input+0xf4a> 8006fee: | | | | | | | | | | | | | | | 8d29 ldrh r1, [r5, #40] @ 0x28 8006ff0: | | | | | | | | | | | | | | | 1a9b subs r3, r3, r2 8006ff2: | | | | | | | | | | | | | | | 42d9 cmn r1, r3 8006ff4: | | | | | | | | | +--|-----------------|--|--|-----|-- d4df bmi.n 8006fb6 <ip4_input+0xf4a> tcp_ack_now(pcb); 8006ff6: | | | | | | | | | | | /--------|--|--|-----|-> 8b6b ldrh r3, [r5, #26] 8006ff8: | | | | | | | | | | | | | | | /--|-- e015 b.n 8007026 <ip4_input+0xfba> LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED); 8006ffa: | | | | | | | | | | | | | | | | \-> 2900 cmp r1, #0 8006ffc: | | | | | | | | | | | | | | +--|----- d1d1 bne.n 8006fa2 <ip4_input+0xf36> 8006ffe: | | | | | | | | | | | | | | | | b672 cpsid i 8007000: | | | | | | | | | | | | | | | | 4b23 ldr r3, [pc, #140] @ (8007090 ) 8007002: | | | | | | | | | | | | | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 8007006: | | | | | | | | | | | | | | | | 4a23 ldr r2, [pc, #140] @ (8007094 ) 8007008: | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 800700a: | | | | | | | | | | | | | | | | 4823 ldr r0, [pc, #140] @ (8007098 ) 800700c: | | | | | | | | | | | | | | | | f240 333b movw r3, #827 @ 0x33b 8007010: | | | | | | | | | | | | | | | | f7fa f972 bl 80012f8 <printf_> 8007014: | | | | | | | | | | | | | | | | be00 bkpt 0x0000 8007016: | | | | | | | | | | | | | | \--|----- e7c4 b.n 8006fa2 <ip4_input+0xf36> if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) { 8007018: | | | | | | | | | | | | \--|-----|----> 0790 lsls r0, r2, #30 tcp_ack_now(pcb); 800701a: | | | | | | | | | | | | | | 8b6b ldrh r3, [r5, #26] if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) { 800701c: | | | | | | | | | | | | | | /-- d506 bpl.n 800702c <ip4_input+0xfc0> 800701e: | | | | | | | | | | | | | | | 7d2a ldrb r2, [r5, #20] 8007020: | | | | | | | | | | | | | | | 3a02 subs r2, #2 8007022: | | | | | | | | | | | | | | | 2a01 cmp r2, #1 8007024: | | | | | | | | | | | | | | +-- d902 bls.n 800702c <ip4_input+0xfc0> tcp_ack_now(pcb); 8007026: | | | | | | | | | | | | | \--|-> f043 0302 orr.w r3, r3, #2 800702a: | | | | | | | | | | | | \--------|-- e7c3 b.n 8006fb4 <ip4_input+0xf48> if ((pcb->flags & TF_RXCLOSED) == 0) { 800702c: | | | | | | | | | | | | \-> 06d9 lsls r1, r3, #27 pcb->tmr = tcp_ticks; 800702e: | | | | | | | | | | | | bf5c itt pl 8007030: | | | | | | | | | | | | f8d4 30d8 ldrpl.w r3, [r4, #216] @ 0xd8 8007034: | | | | | | | | | | | | 622b strpl r3, [r5, #32] pcb->persist_probe = 0; 8007036: | | | | | | | | | | | | 2300 movs r3, #0 8007038: | | | | | | | | | | | | f8a5 309a strh.w r3, [r5, #154] @ 0x9a tcp_parseopt(pcb); 800703c: | | | | | | | | | | | | 4628 mov r0, r5 800703e: | | | | | | | | | | | | f7fa fe6f bl 8001d20 <tcp_parseopt> if (flags & TCP_SYN) { 8007042: | | | | | | | | | | | | f894 30cc ldrb.w r3, [r4, #204] @ 0xcc 8007046: | | | | | | | | | | | | 7d2a ldrb r2, [r5, #20] 8007048: | | | | | | | | | | | | f013 0102 ands.w r1, r3, #2 800704c: | | | | | | | | | | | | /-- d002 beq.n 8007054 <ip4_input+0xfe8> if ((pcb->state != SYN_SENT) && (pcb->state != SYN_RCVD)) { 800704e: | | | | | | | | | | | | | 1e90 subs r0, r2, #2 8007050: | | | | | | | | | | | | | 2801 cmp r0, #1 8007052: | | | | | | | | | +--|--------|--------------------|-- d8b0 bhi.n 8006fb6 <ip4_input+0xf4a> switch (pcb->state) { 8007054: | | | | | | | | | | | | \-> 3a02 subs r2, #2 8007056: | | | | | | | | | | | | 2a07 cmp r2, #7 8007058: | | | | | | | | | +--|--------|----------------------- d8ad bhi.n 8006fb6 <ip4_input+0xf4a> 800705a: | | | | | | | | | | | | e8df f012 tbh [pc, r2, lsl #1] 800705e: | | | | | | | | | | | | 001f .short 0x001f 8007060: | | | | | | | | [32m| | | | 015000d6 .word 0x015000d6 8007064: | | | | | | | | | | | | 01a00156 .word 0x01a00156 8007068: | | | | | | | | | | | | 01c90150 .word 0x01c90150 800706c: | | | | | | | | | | | | 01e9 .short 0x01e9 800706e: | | | | | | | | | | | | bf00 nop 8007070: | | | | | | | | | | | | 04300001 .word 0x04300001 8007074: | | | | | | | | | | | | 08600860 .word 0x08600860 8007078: | | | | | | | | | | | | 08003dd1 .word 0x08003dd1 800707c: | | | | | | | | | | | | 006ddd00 .word 0x006ddd00 8007080: | | | | | | | | | | | | 0218ffff .word 0x0218ffff 8007084: | | | | | | | | | | | | 20000000 .word 0x20000000 8007088: | | | | | | | | | | | | 20001158 .word 0x20001158 800708c: | | | | | | | | | | | | 20001214 .word 0x20001214 8007090: | | | | | | | | | | | | 0800b591 .word 0x0800b591 8007094: | | | | | | | | | | | | 0800c75d .word 0x0800c75d 8007098: | | | | | | | | | | | | 0800b232 .word 0x0800b232 if ((flags & TCP_ACK) && (flags & TCP_SYN) 800709c: | | | | | | | | | | | | f003 0212 and.w r2, r3, #18 80070a0: | | | | | | | | | | | | 2a12 cmp r2, #18 80070a2: | | | | | | | | | | | | /-------------------- f040 808b bne.w 80071bc <ip4_input+0x1150> && (ackno == pcb->lastack + 1)) { 80070a6: | | | | | | | | | | | | | 6c6a ldr r2, [r5, #68] @ 0x44 80070a8: | | | | | | | | | | | | | f8d4 10d0 ldr.w r1, [r4, #208] @ 0xd0 80070ac: | | | | | | | | | | | | | 3201 adds r2, #1 80070ae: | | | | | | | | | | | | | 428a cmp r2, r1 80070b0: | | | | | | | | | | | | +-------------------- f040 8084 bne.w 80071bc <ip4_input+0x1150> pcb->rcv_nxt = seqno + 1; 80070b4: | | | | | | | | | | | | | f8d4 30c8 ldr.w r3, [r4, #200] @ 0xc8 pcb->lastack = ackno; 80070b8: | | | | | | | | | | | | | 646a str r2, [r5, #68] @ 0x44 pcb->rcv_nxt = seqno + 1; 80070ba: | | | | | | | | | | | | | 1c59 adds r1, r3, #1 pcb->snd_wnd = tcphdr->wnd; 80070bc: | | | | | | | | | | | | | f8d7 2134 ldr.w r2, [r7, #308] @ 0x134 pcb->rcv_nxt = seqno + 1; 80070c0: | | | | | | | | | | | | | 6269 str r1, [r5, #36] @ 0x24 pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */ 80070c2: | | | | | | | | | | | | | 3b01 subs r3, #1 pcb->rcv_ann_right_edge = pcb->rcv_nxt; 80070c4: | | | | | | | | | | | | | 62e9 str r1, [r5, #44] @ 0x2c pcb->snd_wnd = tcphdr->wnd; 80070c6: | | | | | | | | | | | | | 89d2 ldrh r2, [r2, #14] pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */ 80070c8: | | | | | | | | | | | | | 656b str r3, [r5, #84] @ 0x54 pcb->state = ESTABLISHED; 80070ca: | | | | | | | | | | | | | 2304 movs r3, #4 pcb->snd_wnd = tcphdr->wnd; 80070cc: | | | | | | | | | | | | | f8a5 2060 strh.w r2, [r5, #96] @ 0x60 pcb->snd_wnd_max = pcb->snd_wnd; 80070d0: | | | | | | | | | | | | | f8a5 2062 strh.w r2, [r5, #98] @ 0x62 pcb->state = ESTABLISHED; 80070d4: | | | | | | | | | | | | | 752b strb r3, [r5, #20] pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip); 80070d6: | | | | | | | | | | | | | 18e8 adds r0, r5, r3 80070d8: | | | | | | | | | | | | | f8b5 8032 ldrh.w r8, [r5, #50] @ 0x32 80070dc: | | | | | | | | | | | | | f7fe fe64 bl 8005da8 <ip4_route> if (outif == NULL) { 80070e0: | | | | | | | | | | | | | /-- b148 cbz r0, 80070f6 <ip4_input+0x108a> mtu = outif->mtu; 80070e2: | | | | | | | | | | | | | | 8d83 ldrh r3, [r0, #44] @ 0x2c if (mtu != 0) { 80070e4: | | | | | | | | | | | | | +-- b13b cbz r3, 80070f6 <ip4_input+0x108a> mss_s = (mtu > offset) ? (u16_t)(mtu - offset) : 0; 80070e6: | | | | | | | | | | | | | | 2b28 cmp r3, #40 @ 0x28 80070e8: | | | | | | | | | | | | | | bf38 it cc 80070ea: | | | | | | | | | | | | | | 2328 movcc r3, #40 @ 0x28 80070ec: | | | | | | | | | | | | | | 3b28 subs r3, #40 @ 0x28 sendmss = LWIP_MIN(sendmss, mss_s); 80070ee: | | | | | | | | | | | | | | b29b uxth r3, r3 80070f0: | | | | | | | | | | | | | | 4598 cmp r8, r3 80070f2: | | | | | | | | | | | | | | bf28 it cs 80070f4: | | | | | | | | | | | | | | 4698 movcs r8, r3 pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss); 80070f6: | | | | | | | | | | | | | \-> ea4f 0248 mov.w r2, r8, lsl #1 80070fa: | | | | | | | | | | | | | f241 131c movw r3, #4380 @ 0x111c 80070fe: | | | | | | | | | | | | | 429a cmp r2, r3 8007100: | | | | | | | | | | | | | 4610 mov r0, r2 8007102: | | | | | | | | | | | | | bf38 it cc 8007104: | | | | | | | | | | | | | 4618 movcc r0, r3 8007106: | | | | | | | | | | | | | ebb0 0f88 cmp.w r0, r8, lsl #2 pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip); 800710a: | | | | | | | | | | | | | f8a5 8032 strh.w r8, [r5, #50] @ 0x32 pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss); 800710e: | | | | | | | | | | | | | ea4f 0188 mov.w r1, r8, lsl #2 8007112: | | | | | | | | | | | | | /-------------- d946 bls.n 80071a2 <ip4_input+0x1136> 8007114: | | | | | | | | | | | | | | b28b uxth r3, r1 8007116: | | | | | | | | | | | | | /--|-------------> f8a5 3048 strh.w r3, [r5, #72] @ 0x48 LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0)); 800711a: | | | | | | | | | | | | | | | f8b5 3066 ldrh.w r3, [r5, #102] @ 0x66 800711e: | | | | | | | | | | | | | | | /-- b963 cbnz r3, 800713a <ip4_input+0x10ce> 8007120: | | | | | | | | | | | | | | | | b672 cpsid i 8007122: | | | | | | | | | | | | | | | | 4bac ldr r3, [pc, #688] @ (80073d4 ) 8007124: | | | | | | | | | | | | | | | | 4aac ldr r2, [pc, #688] @ (80073d8 ) 8007126: | | | | | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 800712a: | | | | | | | | | | | | | | | | 4bac ldr r3, [pc, #688] @ (80073dc ) 800712c: | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 800712e: | | | | | | | | | | | | | | | | 48ac ldr r0, [pc, #688] @ (80073e0 ) 8007130: | | | | | | | | | | | | | | | | f240 3377 movw r3, #887 @ 0x377 8007134: | | | | | | | | | | | | | | | | f7fa f8e0 bl 80012f8 <printf_> 8007138: | | | | | | | | | | | | | | | | be00 bkpt 0x0000 --pcb->snd_queuelen; 800713a: | | | | | | | | | | | | | | | \-> f8b5 3066 ldrh.w r3, [r5, #102] @ 0x66 rseg = pcb->unacked; 800713e: | | | | | | | | | | | | | | | f8d5 8070 ldr.w r8, [r5, #112] @ 0x70 --pcb->snd_queuelen; 8007142: | | | | | | | | | | | | | | | 3b01 subs r3, #1 8007144: | | | | | | | | | | | | | | | f8a5 3066 strh.w r3, [r5, #102] @ 0x66 if (rseg == NULL) { 8007148: | | | | | | | | | | | | | | | f1b8 0f00 cmp.w r8, #0 800714c: | | | | | | | | | | | | | | | /----------- d12d bne.n 80071aa <ip4_input+0x113e> rseg = pcb->unsent; 800714e: | | | | | | | | | | | | | | | | f8d5 806c ldr.w r8, [r5, #108] @ 0x6c LWIP_ASSERT("no segment to free", rseg != NULL); 8007152: | | | | | | | | | | | | | | | | f1b8 0f00 cmp.w r8, #0 8007156: | | | | | | | | | | | | | | | | /-- d10c bne.n 8007172 <ip4_input+0x1106> 8007158: | | | | | | | | | | | | | | | | | b672 cpsid i 800715a: | | | | | | | | | | | | | | | | | 4b9e ldr r3, [pc, #632] @ (80073d4 ) 800715c: | | | | | | | | | | | | | | | | | 4aa1 ldr r2, [pc, #644] @ (80073e4 ) 800715e: | | | | | | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8007162: | | | | | | | | | | | | | | | | | 4b9e ldr r3, [pc, #632] @ (80073dc ) 8007164: | | | | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 8007166: | | | | | | | | | | | | | | | | | 489e ldr r0, [pc, #632] @ (80073e0 ) 8007168: | | | | | | | | | | | | | | | | | f240 337f movw r3, #895 @ 0x37f 800716c: | | | | | | | | | | | | | | | | | f7fa f8c4 bl 80012f8 <printf_> 8007170: | | | | | | | | | | | | | | | | | be00 bkpt 0x0000 pcb->unsent = rseg->next; 8007172: | | | | | | | | | | | | | | | | \-> f8d8 3000 ldr.w r3, [r8] 8007176: | | | | | | | | | | | | | | | | 66eb str r3, [r5, #108] @ 0x6c tcp_seg_free(rseg); 8007178: | | | | | | | | | | | | | | | | /-------> 4640 mov r0, r8 800717a: | | | | | | | | | | | | | | | | | f7fb fb3f bl 80027fc <tcp_seg_free> if (pcb->unacked == NULL) { 800717e: | | | | | | | | | | | | | | | | | 6f2b ldr r3, [r5, #112] @ 0x70 8007180: | | | | | | | | | | | | | | | | | /-- b9bb cbnz r3, 80071b2 <ip4_input+0x1146> pcb->rtime = -1; 8007182: | | | | | | | | | | | | | | | | | | f64f 73ff movw r3, #65535 @ 0xffff 8007186: | | | | | | | | | | | | | | | | | | 862b strh r3, [r5, #48] @ 0x30 TCP_EVENT_CONNECTED(pcb, ERR_OK, err); 8007188: | | | | | | | | | | | | | | | | | /--|-> f8d5 3088 ldr.w r3, [r5, #136] @ 0x88 800718c: | | | | | | | | | | | | | | | | | | | 2b00 cmp r3, #0 800718e: | | | | | | | | | | | +--|--|--|--|--|--|--|-- f43f af32 beq.w 8006ff6 <ip4_input+0xf8a> 8007192: | | | | | | | | | | | | | | | | | | | 6928 ldr r0, [r5, #16] 8007194: | | | | | | | | | | | | | | | | | | | 2200 movs r2, #0 8007196: | | | | | | | | | | | | | | | | | | | 4629 mov r1, r5 8007198: | | | | | | | | | | | | | | | | | | | 4798 blx r3 if (err == ERR_ABRT) { 800719a: | | | | | | | | | | | | | | | | | | | 300d adds r0, #13 800719c: | | | | | | | | | | | \--|--|--|--|--|--|--|-- f47f af2b bne.w 8006ff6 <ip4_input+0xf8a> 80071a0: | | | | | | | | +--------------------------|--|-----------|--|--|--|--|--|--|-- e4db b.n 8006b5a <ip4_input+0xaee> pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss); 80071a2: | | | | | | | | | | | | | \--|--|--|--|-> 429a cmp r2, r3 80071a4: | | | | | | | | | | | | | | | | | bf88 it hi 80071a6: | | | | | | | | | | | | | | | | | b293 uxthhi r3, r2 80071a8: | | | | | | | | | | | | \-----|--|--|--|-- e7b5 b.n 8007116 <ip4_input+0x10aa> pcb->unacked = rseg->next; 80071aa: | | | | | | | | | | | | \--|--|--|-> f8d8 3000 ldr.w r3, [r8] 80071ae: | | | | | | | | | | | | | | | 672b str r3, [r5, #112] @ 0x70 80071b0: | | | | | | | | | | | | \--|--|-- e7e2 b.n 8007178 <ip4_input+0x110c> pcb->rtime = 0; 80071b2: | | | | | | | | | | | | | \-> 2300 movs r3, #0 80071b4: | | | | | | | | | | | | | 862b strh r3, [r5, #48] @ 0x30 pcb->nrtx = 0; 80071b6: | | | | | | | | | | | | | f885 3042 strb.w r3, [r5, #66] @ 0x42 80071ba: | | | | | | | | | | | | \----- e7e5 b.n 8007188 <ip4_input+0x111c> else if (flags & TCP_ACK) { 80071bc: | | | | | | | | | | | \-------------------> 06da lsls r2, r3, #27 80071be: | | | | | | | | | +--|-------------------------------- f57f aefa bpl.w 8006fb6 <ip4_input+0xf4a> ip_current_src_addr(), tcphdr->dest, tcphdr->src); 80071c2: | | | | | | | | | | | f8d7 3134 ldr.w r3, [r7, #308] @ 0x134 tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(), 80071c6: | | | | | | | | | | | f8b6 10d4 ldrh.w r1, [r6, #212] @ 0xd4 80071ca: | | | | | | | | | | | 8818 ldrh r0, [r3, #0] 80071cc: | | | | | | | | | | | f8d6 20c8 ldr.w r2, [r6, #200] @ 0xc8 80071d0: | | | | | | | | | | | 9002 str r0, [sp, #8] 80071d2: | | | | | | | | | | | 885b ldrh r3, [r3, #2] 80071d4: | | | | | | | | | | | 9301 str r3, [sp, #4] 80071d6: | | | | | | | | | | | 4b84 ldr r3, [pc, #528] @ (80073e8 ) 80071d8: | | | | | | | | | | | 9300 str r3, [sp, #0] 80071da: | | | | | | | | | | | 440a add r2, r1 80071dc: | | | | | | | | | | | 3304 adds r3, #4 80071de: | | | | | | | | | | | f8d6 10d0 ldr.w r1, [r6, #208] @ 0xd0 80071e2: | | | | | | | | | | | 4628 mov r0, r5 80071e4: | | | | | | | | | | | f7fb fd96 bl 8002d14 <tcp_rst> if (pcb->nrtx < TCP_SYNMAXRTX) { 80071e8: | | | | | | | | | | | f895 3042 ldrb.w r3, [r5, #66] @ 0x42 80071ec: | | | | | | | | | | | 2b05 cmp r3, #5 80071ee: | | | | | | | | | +--|-------------------------------- f63f aee2 bhi.w 8006fb6 <ip4_input+0xf4a> pcb->rtime = 0; 80071f2: | | | | | | | | | | | 2300 movs r3, #0 80071f4: | | | | | | | | | | | 862b strh r3, [r5, #48] @ 0x30 if (tcp_rexmit_rto_prepare(pcb) == ERR_OK) { 80071f6: | | | | | | | | | | | 4628 mov r0, r5 80071f8: | | | | | | | | | | | f7fa fe00 bl 8001dfc <tcp_rexmit_rto_prepare> 80071fc: | | | | | | | | | | | 2800 cmp r0, #0 80071fe: | | | | | | | | | +--|-------------------------------- f47f aeda bne.w 8006fb6 <ip4_input+0xf4a> tcp_rexmit_rto_commit(pcb); 8007202: | | | | | | | | | | | 4628 mov r0, r5 8007204: | | | | | | | | | | | f7fc ff2c bl 8004060 <tcp_rexmit_rto_commit> 8007208: | | | | | | | | | +--|-------------------------------- e6d5 b.n 8006fb6 <ip4_input+0xf4a> if (flags & TCP_SYN) { 800720a: | | | | | | | | | | | /-- b151 cbz r1, 8007222 <ip4_input+0x11b6> if (seqno == pcb->rcv_nxt - 1) { 800720c: | | | | | | | | | | | | 6a6b ldr r3, [r5, #36] @ 0x24 800720e: | | | | | | | | | | | | f8d4 20c8 ldr.w r2, [r4, #200] @ 0xc8 8007212: | | | | | | | | | | | | 3b01 subs r3, #1 8007214: | | | | | | | | | | | | 4293 cmp r3, r2 8007216: | | | | | | | | | +--|-----------------------------|-- f47f aece bne.w 8006fb6 <ip4_input+0xf4a> tcp_rexmit(pcb); 800721a: | | | | | | | | | | | | 4628 mov r0, r5 800721c: | | | | | | | | | | | | f7fa fe38 bl 8001e90 <tcp_rexmit> 8007220: | | | | | | | | | +--|-----------------------------|-- e6c9 b.n 8006fb6 <ip4_input+0xf4a> } else if (flags & TCP_ACK) { 8007222: | | | | | | | | | | | \-> 06db lsls r3, r3, #27 8007224: | | | | | | | | | +--|-------------------------------- f57f aec7 bpl.w 8006fb6 <ip4_input+0xf4a> if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) { 8007228: | | | | | | | | | | | 6c6b ldr r3, [r5, #68] @ 0x44 800722a: | | | | | | | | | | | f8d6 10d0 ldr.w r1, [r6, #208] @ 0xd0 800722e: | | | | | | | | | | | 43db mvns r3, r3 8007230: | | | | | | | | | | | 42cb cmn r3, r1 8007232: | | | | | | | | | | | /----------- d451 bmi.n 80072d8 <ip4_input+0x126c> 8007234: | | | | | | | | | | | | 6d2b ldr r3, [r5, #80] @ 0x50 8007236: | | | | | | | | | | | | 1a5b subs r3, r3, r1 8007238: | | | | | | | | | | | | 2b00 cmp r3, #0 800723a: | | | | | | | | | | | +----------- db4d blt.n 80072d8 <ip4_input+0x126c> pcb->state = ESTABLISHED; 800723c: | | | | | | | | | | | | 2304 movs r3, #4 800723e: | | | | | | | | | | | | 752b strb r3, [r5, #20] if (pcb->listener == NULL) { 8007240: | | | | | | | | | | | | 6feb ldr r3, [r5, #124] @ 0x7c 8007242: | | | | | | | | | | | | /-- b923 cbnz r3, 800724e <ip4_input+0x11e2> tcp_abandon(pcb, 1); 8007244: | | | | | | | | | | | /-----------------|--------|-> 2101 movs r1, #1 8007246: | | | | | | | | | | | | | | 4628 mov r0, r5 8007248: | | | | | | | | | | | | | | f7fc fc50 bl 8003aec <tcp_abandon> goto aborted; 800724c: | | | | | | | | +--------------------------|--|--|-----------------|--------|-- e485 b.n 8006b5a <ip4_input+0xaee> LWIP_ASSERT("pcb->listener->accept != NULL", pcb->listener->accept != NULL); 800724e: | | | | | | | | | | | | | \-> 699b ldr r3, [r3, #24] 8007250: | | | | | | | | | | | | | /-- b963 cbnz r3, 800726c <ip4_input+0x1200> 8007252: | | | | | | | | | | | | | | b672 cpsid i 8007254: | | | | | | | | | | | | | | 4b5f ldr r3, [pc, #380] @ (80073d4 ) 8007256: | | | | | | | | | | | | | | 4a65 ldr r2, [pc, #404] @ (80073ec ) 8007258: | | | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 800725c: | | | | | | | | | | | | | | 4b5f ldr r3, [pc, #380] @ (80073dc ) 800725e: | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 8007260: | | | | | | | | | | | | | | 485f ldr r0, [pc, #380] @ (80073e0 ) 8007262: | | | | | | | | | | | | | | f44f 736e mov.w r3, #952 @ 0x3b8 8007266: | | | | | | | | | | | | | | f7fa f847 bl 80012f8 <printf_> 800726a: | | | | | | | | | | | | | | be00 bkpt 0x0000 TCP_EVENT_ACCEPT(pcb->listener, pcb, pcb->callback_arg, ERR_OK, err); 800726c: | | | | | | | | | | | | | \-> 6feb ldr r3, [r5, #124] @ 0x7c 800726e: | | | | | | | | | | | | | 699b ldr r3, [r3, #24] 8007270: | | | | | | | | | | | | | 2b00 cmp r3, #0 8007272: | | | | | | | | | | | +-----------------|----------- d0e7 beq.n 8007244 <ip4_input+0x11d8> 8007274: | | | | | | | | | | | | | 6928 ldr r0, [r5, #16] 8007276: | | | | | | | | | | | | | 2200 movs r2, #0 8007278: | | | | | | | | | | | | | 4629 mov r1, r5 800727a: | | | | | | | | | | | | | 4798 blx r3 if (err != ERR_OK) { 800727c: | | | | | | | | | | | | | /-- b118 cbz r0, 8007286 <ip4_input+0x121a> if (err != ERR_ABRT) { 800727e: | | | | | | | | | | | | | | 300d adds r0, #13 8007280: | | | | | | | | +--------------------------|--|--|-----------------|--------|-- f43f ac6b beq.w 8006b5a <ip4_input+0xaee> 8007284: | | | | | | | | | | | +-----------------|--------|-- e7de b.n 8007244 <ip4_input+0x11d8> tcp_receive(pcb); 8007286: | | | | | | | | | | | | | \-> 4628 mov r0, r5 8007288: | | | | | | | | | | | | | f7fb fdaa bl 8002de0 <tcp_receive> if (recv_acked != 0) { 800728c: | | | | | | | | | | | | | f8b6 30d6 ldrh.w r3, [r6, #214] @ 0xd6 8007290: | | | | | | | | | | | | | /-- b113 cbz r3, 8007298 <ip4_input+0x122c> recv_acked--; 8007292: | | | | | | | | | | | | | | 3b01 subs r3, #1 8007294: | | | | | | | | | | | | | | f8a6 30d6 strh.w r3, [r6, #214] @ 0xd6 pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss); 8007298: | | | | | | | | | | | | | \-> 8e69 ldrh r1, [r5, #50] @ 0x32 800729a: | | | | | | | | | | | | | f241 131c movw r3, #4380 @ 0x111c 800729e: | | | | | | | | | | | | | 004a lsls r2, r1, #1 80072a0: | | | | | | | | | | | | | 429a cmp r2, r3 80072a2: | | | | | | | | | | | | | 4694 mov ip, r2 80072a4: | | | | | | | | | | | | | bf38 it cc 80072a6: | | | | | | | | | | | | | 469c movcc ip, r3 80072a8: | | | | | | | | | | | | | ebbc 0f81 cmp.w ip, r1, lsl #2 80072ac: | | | | | | | | | | | | | ea4f 0081 mov.w r0, r1, lsl #2 80072b0: | | | | | | | | | | | | | /-- d90e bls.n 80072d0 <ip4_input+0x1264> 80072b2: | | | | | | | | | | | | | | b283 uxth r3, r0 80072b4: | | | | | | | | | | | | | /--|-> f8a5 3048 strh.w r3, [r5, #72] @ 0x48 if (recv_flags & TF_GOT_FIN) { 80072b8: | | | | | | | | | | | | | | | f896 30f4 ldrb.w r3, [r6, #244] @ 0xf4 if (recv_flags & TF_GOT_FIN) { /* passive close */ 80072bc: | | | | | | | | | | | | | /--|--|-> 0698 lsls r0, r3, #26 80072be: | | | | | | | | | +--|--|-----------------|--|--|--|-- f57f ae7a bpl.w 8006fb6 <ip4_input+0xf4a> tcp_ack_now(pcb); 80072c2: | | | | | | | | | | | | | | | | 8b6b ldrh r3, [r5, #26] 80072c4: | | | | | | | | | | | | | | | | f043 0302 orr.w r3, r3, #2 80072c8: | | | | | | | | | | | | | | | | 836b strh r3, [r5, #26] pcb->state = CLOSE_WAIT; 80072ca: | | | | | | | | | | | | | | | | 2307 movs r3, #7 pcb->state = CLOSING; 80072cc: | | | | | | | | | | | | /-----|--|--|--|-> 752b strb r3, [r5, #20] 80072ce: | | | | | | | | | +--|--|-----------|-----|--|--|--|-- e672 b.n 8006fb6 <ip4_input+0xf4a> pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss); 80072d0: | | | | | | | | | | | | | | | | \-> 429a cmp r2, r3 80072d2: | | | | | | | | | | | | | | | | bf88 it hi 80072d4: | | | | | | | | | | | | | | | | b293 uxthhi r3, r2 80072d6: | | | | | | | | | | | | | | | \----- e7ed b.n 80072b4 <ip4_input+0x1248> ip_current_src_addr(), tcphdr->dest, tcphdr->src); 80072d8: | | | | | | | | | | | | | \--|-------> 4b3e ldr r3, [pc, #248] @ (80073d4 ) tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(), 80072da: | | | | | | | | | | | | | | f8b6 00d4 ldrh.w r0, [r6, #212] @ 0xd4 ip_current_src_addr(), tcphdr->dest, tcphdr->src); 80072de: | | | | | | | | | | | | | | f8d3 3134 ldr.w r3, [r3, #308] @ 0x134 tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(), 80072e2: | | | | | | | | | | | | | | 881a ldrh r2, [r3, #0] 80072e4: | | | | | | | | | | | | | | 9202 str r2, [sp, #8] 80072e6: | | | | | | | | | | | | | | 885b ldrh r3, [r3, #2] 80072e8: | | | | | | | | | | | | | | 9301 str r3, [sp, #4] 80072ea: | | | | | | | | | | | | | | 4b3f ldr r3, [pc, #252] @ (80073e8 ) 80072ec: | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 80072ee: | | | | | | | | | | | | | | f8d6 20c8 ldr.w r2, [r6, #200] @ 0xc8 80072f2: | | | | | | | | | | | | | | 3304 adds r3, #4 80072f4: | | | | | | | | | | | | | | 1882 adds r2, r0, r2 80072f6: | | | | | | | | | | | | | | 4628 mov r0, r5 80072f8: | | | | | | | | | | | | | | f7fb fd0c bl 8002d14 <tcp_rst> 80072fc: | | | | | | | | | +--|--|-----------|--------|-------- e65b b.n 8006fb6 <ip4_input+0xf4a> tcp_receive(pcb); 80072fe: | | | | | | | | | | | | | | 4628 mov r0, r5 8007300: | | | | | | | | | | | | | | f7fb fd6e bl 8002de0 <tcp_receive> if (recv_flags & TF_GOT_FIN) { /* passive close */ 8007304: | | | | | | | | | | | | | | f894 30f4 ldrb.w r3, [r4, #244] @ 0xf4 8007308: | | | | | | | | | | | | | \-------- e7d8 b.n 80072bc <ip4_input+0x1250> tcp_receive(pcb); 800730a: | | | | | | | | | | | | | 4628 mov r0, r5 800730c: | | | | | | | | | | | | | f7fb fd68 bl 8002de0 <tcp_receive> if (recv_flags & TF_GOT_FIN) { 8007310: | | | | | | | | | | | | | f894 30f4 ldrb.w r3, [r4, #244] @ 0xf4 8007314: | | | | | | | | | | | | | f894 20cc ldrb.w r2, [r4, #204] @ 0xcc 8007318: | | | | | | | | | | | | | f013 0f20 tst.w r3, #32 800731c: | | | | | | | | | | | | | /-------------- d030 beq.n 8007380 <ip4_input+0x1314> tcp_ack_now(pcb); 800731e: | | | | | | | | | | | | | | 8b6b ldrh r3, [r5, #26] if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) && 8007320: | | | | | | | | | | | | | | 06d1 lsls r1, r2, #27 tcp_ack_now(pcb); 8007322: | | | | | | | | | | | | | | f043 0302 orr.w r3, r3, #2 if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) && 8007326: | | | | | | | | | | | | | | /----------- d528 bpl.n 800737a <ip4_input+0x130e> 8007328: | | | | | | | | | | | | | | | 6d29 ldr r1, [r5, #80] @ 0x50 800732a: | | | | | | | | | | | | | | | f8d4 20d0 ldr.w r2, [r4, #208] @ 0xd0 800732e: | | | | | | | | | | | | | | | 4291 cmp r1, r2 8007330: | | | | | | | | | | | | | | +----------- d123 bne.n 800737a <ip4_input+0x130e> 8007332: | | | | | | | | | | | | | | | 6eea ldr r2, [r5, #108] @ 0x6c 8007334: | | | | | | | | | | | | | | +----------- bb0a cbnz r2, 800737a <ip4_input+0x130e> tcp_ack_now(pcb); 8007336: | | | | | | | | | | | | | | | 836b strh r3, [r5, #26] tcp_pcb_purge(pcb); 8007338: | | | | | | | | | | | | | | | 4628 mov r0, r5 800733a: | | | | | | | | | | | | | | | f7fb fa74 bl 8002826 <tcp_pcb_purge> TCP_RMV_ACTIVE(pcb); 800733e: | | | | | | | | | | | | | | | f8d4 30bc ldr.w r3, [r4, #188] @ 0xbc 8007342: | | | | | | | | | | | | | | | 429d cmp r5, r3 8007344: | | | | | | | | | | | | | | | /-------- d10a bne.n 800735c <ip4_input+0x12f0> TCP_RMV_ACTIVE(pcb); 8007346: | | | | | | | | | | | | /--------|--|--|--|-------> 68eb ldr r3, [r5, #12] 8007348: | | | | | | | | | | | | | | | | | f8c4 30bc str.w r3, [r4, #188] @ 0xbc 800734c: | | | | | | | | | | | | | /-----|--|--|--|-------- e008 b.n 8007360 <ip4_input+0x12f4> TCP_RMV_ACTIVE(pcb); 800734e: | | | | | | | | | | | | | | | | | | /----> 68da ldr r2, [r3, #12] 8007350: | | | | | | | | | | | | | | | | | | | 4295 cmp r5, r2 8007352: | | | | | | | | | | | | | | | | | | | /-- d102 bne.n 800735a <ip4_input+0x12ee> TCP_RMV_ACTIVE(pcb); 8007354: | | | | | | | | | | | | | | /--|--|--|--|--|--|-> 68ea ldr r2, [r5, #12] 8007356: | | | | | | | | | | | | | | | | | | | | | 60da str r2, [r3, #12] 8007358: | | | | | | | | | | | | | +--|--|--|--|--|--|--|-- e002 b.n 8007360 <ip4_input+0x12f4> TCP_RMV_ACTIVE(pcb); 800735a: | | | | | | | | | | | | | | | | | | | | \-> 4613 mov r3, r2 800735c: | | | | | | | | | | | | | | | | | | \--|----> 2b00 cmp r3, #0 800735e: | | | | | | | | | | | | | | | | | | \----- d1f6 bne.n 800734e <ip4_input+0x12e2> TCP_RMV_ACTIVE(pcb); 8007360: | | | | | | | | | | | | | >--|--|--|--|----------> 2301 movs r3, #1 8007362: | | | | | | | | | | | | | | | | | | f886 3100 strb.w r3, [r6, #256] @ 0x100 pcb->state = TIME_WAIT; 8007366: | | | | | | | | | | | | | | | | | | 230a movs r3, #10 8007368: | | | | | | | | | | | | | | | | | | 752b strb r3, [r5, #20] TCP_REG(&tcp_tw_pcbs, pcb); 800736a: | | | | | | | | | | | | | | | | | | f8d6 30c0 ldr.w r3, [r6, #192] @ 0xc0 800736e: | | | | | | | | | | | | | | | | | | 60eb str r3, [r5, #12] 8007370: | | | | | | | | | | | | | | | | | | f8c6 50c0 str.w r5, [r6, #192] @ 0xc0 8007374: | | | | | | | | | | | | | | | | | | f7fb f852 bl 800241c <tcp_timer_needed> 8007378: | | | | | | | | | +--|--|--|--|--|--|--|--|----------- e61d b.n 8006fb6 <ip4_input+0xf4a> tcp_ack_now(pcb); 800737a: | | | | | | | | | | | | | | | | | \----------> 836b strh r3, [r5, #26] pcb->state = CLOSING; 800737c: | | | | | | | | | | | | | | | | | 2308 movs r3, #8 800737e: | | | | | | | | | | | | | | | +--|-------------- e7a5 b.n 80072cc <ip4_input+0x1260> } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) && 8007380: | | | | | | | | | | | | | | | | \-------------> 06d2 lsls r2, r2, #27 8007382: | | | | | | | | | +--|--|--|--|--|--|----------------- f57f ae18 bpl.w 8006fb6 <ip4_input+0xf4a> 8007386: | | | | | | | | | | | | | | | | 6d2a ldr r2, [r5, #80] @ 0x50 8007388: | | | | | | | | | | | | | | | | f8d4 30d0 ldr.w r3, [r4, #208] @ 0xd0 800738c: | | | | | | | | | | | | | | | | 429a cmp r2, r3 800738e: | | | | | | | | | +--|--|--|--|--|--|----------------- f47f ae12 bne.w 8006fb6 <ip4_input+0xf4a> 8007392: | | | | | | | | | | | | | | | | 6eeb ldr r3, [r5, #108] @ 0x6c 8007394: | | | | | | | | | | | | | | | | 2b00 cmp r3, #0 8007396: | | | | | | | | | +--|--|--|--|--|--|----------------- f47f ae0e bne.w 8006fb6 <ip4_input+0xf4a> pcb->state = FIN_WAIT_2; 800739a: | | | | | | | | | | | | | | | | 2306 movs r3, #6 800739c: | | | | | | | | | | | | | | | \----------------- e796 b.n 80072cc <ip4_input+0x1260> tcp_receive(pcb); 800739e: | | | | | | | | | | | | | | | 4628 mov r0, r5 80073a0: | | | | | | | | | | | | | | | f7fb fd1e bl 8002de0 <tcp_receive> if (recv_flags & TF_GOT_FIN) { 80073a4: | | | | | | | | | | | | | | | f894 30f4 ldrb.w r3, [r4, #244] @ 0xf4 80073a8: | | | | | | | | | | | | | | | 069b lsls r3, r3, #26 80073aa: | | | | | | | | | +--|--|--|--|--|-------------------- f57f ae04 bpl.w 8006fb6 <ip4_input+0xf4a> tcp_ack_now(pcb); 80073ae: | | | | | | | | | | | | | | | 8b6b ldrh r3, [r5, #26] 80073b0: | | | | | | | | | | | | | | | f043 0302 orr.w r3, r3, #2 80073b4: | | | | | | | | | | | | | | | 836b strh r3, [r5, #26] tcp_pcb_purge(pcb); 80073b6: | | | | | | | | | | | | | | | 4628 mov r0, r5 80073b8: | | | | | | | | | | | | | | | f7fb fa35 bl 8002826 <tcp_pcb_purge> TCP_RMV_ACTIVE(pcb); 80073bc: | | | | | | | | | | | | | | | f8d4 30bc ldr.w r3, [r4, #188] @ 0xbc 80073c0: | | | | | | | | | | | | | | | 429d cmp r5, r3 80073c2: | | | | | | | | | | | | +--|--|-------------------- d0c0 beq.n 8007346 <ip4_input+0x12da> 80073c4: | | | | | | | | | | | | | | | /-> 2b00 cmp r3, #0 80073c6: | | | | | | | | | | | | | +--|-----------------|-- d0cb beq.n 8007360 <ip4_input+0x12f4> 80073c8: | | | | | | | | | | | | | | | | 68da ldr r2, [r3, #12] 80073ca: | | | | | | | | | | | | | | | | 4295 cmp r5, r2 80073cc: | | | | | | | | | | | | | | +-----------------|-- d0c2 beq.n 8007354 <ip4_input+0x12e8> 80073ce: | | | | | | | | | | | | | | | | 4613 mov r3, r2 80073d0: | | | | | | | | | | | | | | | \-- e7f8 b.n 80073c4 <ip4_input+0x1358> 80073d2: | | | | | | | | | | | | | | | bf00 nop 80073d4: | | | | | | | | | | | | | | | 20000060 .word 0x20000060 80073d8: | | | | | | | | | | | | | | | 0800c77d .word 0x0800c77d 80073dc: | | | | | | | | | | | | | | | 0800b591 .word 0x0800b591 80073e0: | | | | | | | | | | | | | | | 0800b232 .word 0x0800b232 80073e4: | | | | | | | | | | | | | | | 0800c793 .word 0x0800c793 80073e8: | | | | | | | | | | | | | | | 20001280 .word 0x20001280 80073ec: | | | | | | | | | | | | | | | 0800c7a6 .word 0x0800c7a6 tcp_receive(pcb); 80073f0: | | | | | | | | | | | | | | | 4628 mov r0, r5 80073f2: | | | | | | | | | | | | | | | f7fb fcf5 bl 8002de0 <tcp_receive> if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) { 80073f6: | | | | | | | | | | | | | | | f894 30cc ldrb.w r3, [r4, #204] @ 0xcc 80073fa: | | | | | | | | | | | | | | | 06d8 lsls r0, r3, #27 80073fc: | | | | | | | | | +--|--|--|--|--|-------------------- f57f addb bpl.w 8006fb6 <ip4_input+0xf4a> 8007400: | | | | | | | | | | | | | | | 6d2a ldr r2, [r5, #80] @ 0x50 8007402: | | | | | | | | | | | | | | | f8d4 30d0 ldr.w r3, [r4, #208] @ 0xd0 8007406: | | | | | | | | | | | | | | | 429a cmp r2, r3 8007408: | | | | | | | | | +--|--|--|--|--|-------------------- f47f add5 bne.w 8006fb6 <ip4_input+0xf4a> 800740c: | | | | | | | | | | | | | | | 6eeb ldr r3, [r5, #108] @ 0x6c 800740e: | | | | | | | | | | | | | | | 2b00 cmp r3, #0 8007410: | | | | | | | | | +--|--|--|--|--|-------------------- f47f add1 bne.w 8006fb6 <ip4_input+0xf4a> tcp_pcb_purge(pcb); 8007414: | | | | | | | | | | | | | | | 4628 mov r0, r5 8007416: | | | | | | | | | | | | | | | f7fb fa06 bl 8002826 <tcp_pcb_purge> TCP_RMV_ACTIVE(pcb); 800741a: | | | | | | | | | | | | | | | f8d4 30bc ldr.w r3, [r4, #188] @ 0xbc 800741e: | | | | | | | | | | | | | | | 429d cmp r5, r3 8007420: | | | | | | | | | | | | \--|--|-------------------- d091 beq.n 8007346 <ip4_input+0x12da> 8007422: | | | | | | | | | | | | | | /-> 2b00 cmp r3, #0 8007424: | | | | | | | | | | | | \--|-----------------|-- d09c beq.n 8007360 <ip4_input+0x12f4> 8007426: | | | | | | | | | | | | | | 68da ldr r2, [r3, #12] 8007428: | | | | | | | | | | | | | | 4295 cmp r5, r2 800742a: | | | | | | | | | | | | \-----------------|-- d093 beq.n 8007354 <ip4_input+0x12e8> 800742c: | | | | | | | | | | | | | 4613 mov r3, r2 800742e: | | | | | | | | | | | | \-- e7f8 b.n 8007422 <ip4_input+0x13b6> tcp_receive(pcb); 8007430: | | | | | | | | | | | | 4628 mov r0, r5 8007432: | | | | | | | | | | | | f7fb fcd5 bl 8002de0 <tcp_receive> if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) { 8007436: | | | | | | | | | | | | f894 30cc ldrb.w r3, [r4, #204] @ 0xcc 800743a: | | | | | | | | | | | | 06d9 lsls r1, r3, #27 800743c: | | | | | | | | | +--|--|----------------------------- f57f adbb bpl.w 8006fb6 <ip4_input+0xf4a> 8007440: | | | | | | | | | | | | 6d29 ldr r1, [r5, #80] @ 0x50 8007442: | | | | | | | | | | | | f8d4 20d0 ldr.w r2, [r4, #208] @ 0xd0 recv_flags |= TF_CLOSED; 8007446: | | | | | | | | | | | | f894 30f4 ldrb.w r3, [r4, #244] @ 0xf4 if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) { 800744a: | | | | | | | | | | | | 4291 cmp r1, r2 800744c: | | | | | | | | | +--|--|----------------------------- f47f adb3 bne.w 8006fb6 <ip4_input+0xf4a> 8007450: | | | | | | | | | | | | 6eea ldr r2, [r5, #108] @ 0x6c 8007452: | | | | | | | | | | | | 2a00 cmp r2, #0 8007454: | | | | | | | | | +--|--|----------------------------- f47f adaf bne.w 8006fb6 <ip4_input+0xf4a> recv_flags |= TF_CLOSED; 8007458: | | | | | | | | | | | | f043 0310 orr.w r3, r3, #16 800745c: | | | | | | | | | | | | f884 30f4 strb.w r3, [r4, #244] @ 0xf4 8007460: | | | | | | | | | \--|--|----------------------------- e5a9 b.n 8006fb6 <ip4_input+0xf4a> if (recv_acked > 0) { 8007462: | | | | | | | | | \--|----------------------------> f8b4 20d6 ldrh.w r2, [r4, #214] @ 0xd6 8007466: | | | | | | | | | | /-- b12a cbz r2, 8007474 <ip4_input+0x1408> TCP_EVENT_SENT(pcb, (u16_t)acked16, err); 8007468: | | | | | | | | | | | f8d5 3080 ldr.w r3, [r5, #128] @ 0x80 800746c: | | | | | | | | | | /--|-- bb1b cbnz r3, 80074b6 <ip4_input+0x144a> recv_acked = 0; 800746e: | | | | | | | | | | /--|--|-> 2300 movs r3, #0 8007470: | | | | | | | | | | | | | f8a4 30d6 strh.w r3, [r4, #214] @ 0xd6 if (tcp_input_delayed_close(pcb)) { 8007474: | | | | | | | | | | | | \-> 4628 mov r0, r5 8007476: | | | | | | | | | | | | f7fc fdd3 bl 8004020 <tcp_input_delayed_close> 800747a: | | | | | | | | | | | | 2800 cmp r0, #0 800747c: | | | | | | | | +--------------------------------|--------------------|--|----- f47f ab6d bne.w 8006b5a <ip4_input+0xaee> if (recv_data != NULL) { 8007480: | | | | | | | | | | | | f8d4 30f0 ldr.w r3, [r4, #240] @ 0xf0 8007484: | | | | | | | | | | /--|--|----- b363 cbz r3, 80074e0 <ip4_input+0x1474> LWIP_ASSERT("pcb->refused_data == NULL", pcb->refused_data == NULL); 8007486: | | | | | | | | | | | | | 6fab ldr r3, [r5, #120] @ 0x78 8007488: | | | | | | | | | | | | | /-- b15b cbz r3, 80074a2 <ip4_input+0x1436> 800748a: | | | | | | | | | | | | | | b672 cpsid i 800748c: | | | | | | | | | | | | | | 4bb6 ldr r3, [pc, #728] @ (8007768 ) 800748e: | | | | | | | | | | | | | | f8d7 12fc ldr.w r1, [r7, #764] @ 0x2fc 8007492: | | | | | | | | | | | | | | 4ab6 ldr r2, [pc, #728] @ (800776c ) 8007494: | | | | | | | | | | | | | | 9300 str r3, [sp, #0] 8007496: | | | | | | | | | | | | | | 48b6 ldr r0, [pc, #728] @ (8007770 ) 8007498: | | | | | | | | | | | | | | f44f 73f3 mov.w r3, #486 @ 0x1e6 800749c: | | | | | | | | | | | | | | f7f9 ff2c bl 80012f8 <printf_> 80074a0: | | | | | | | | | | | | | | be00 bkpt 0x0000 if (pcb->flags & TF_RXCLOSED) { 80074a2: | | | | | | | | | | | | | \-> 8b6b ldrh r3, [r5, #26] pbuf_free(recv_data); 80074a4: | | | | | | | | | | | | | f8d4 20f0 ldr.w r2, [r4, #240] @ 0xf0 if (pcb->flags & TF_RXCLOSED) { 80074a8: | | | | | | | | | | | | | f013 0310 ands.w r3, r3, #16 80074ac: | | | | | | | | | | | | | /-- d00a beq.n 80074c4 <ip4_input+0x1458> pbuf_free(recv_data); 80074ae: | | | | | | | | | | | | | | 4610 mov r0, r2 80074b0: | | | | | | | | | | | | | | f002 fc84 bl 8009dbc <pbuf_free.isra.0> 80074b4: | | | | | | | | | \-----------------|--|--|--|-- e6c6 b.n 8007244 <ip4_input+0x11d8> TCP_EVENT_SENT(pcb, (u16_t)acked16, err); 80074b6: | | | | | | | | | | | \--|-> 6928 ldr r0, [r5, #16] 80074b8: | | | | | | | | | | | | 4629 mov r1, r5 80074ba: | | | | | | | | | | | | 4798 blx r3 if (err == ERR_ABRT) { 80074bc: | | | | | | | | | | | | 300d adds r0, #13 80074be: | | | | | | | | | | \-----|-- d1d6 bne.n 800746e <ip4_input+0x1402> 80074c0: | | | | | | | | +--------------------------------------------------|--------|-- f7ff bb4b b.w 8006b5a <ip4_input+0xaee> TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err); 80074c4: | | | | | | | | | | \-> f8d5 7084 ldr.w r7, [r5, #132] @ 0x84 80074c8: | | | | | | | | | | /----- b317 cbz r7, 8007510 <ip4_input+0x14a4> 80074ca: | | | | | | | | | | | 6928 ldr r0, [r5, #16] 80074cc: | | | | | | | | | | | 4629 mov r1, r5 80074ce: | | | | | | | | | | | 47b8 blx r7 if (err == ERR_ABRT) { 80074d0: | | | | | | | | | | /--|----> f110 0f0d cmn.w r0, #13 80074d4: | | | | | | | | +--------------------------------------------------|--|--|----- f43f ab41 beq.w 8006b5a <ip4_input+0xaee> if (err != ERR_OK) { 80074d8: | | | | | | | | | +--|--|----- b110 cbz r0, 80074e0 <ip4_input+0x1474> pcb->refused_data = recv_data; 80074da: | | | | | | | | | | | | f8d6 30f0 ldr.w r3, [r6, #240] @ 0xf0 80074de: | | | | | | | | | | | | 67ab str r3, [r5, #120] @ 0x78 if (recv_flags & TF_GOT_FIN) { 80074e0: | | | | | | | | | \--|--|----> f894 30f4 ldrb.w r3, [r4, #244] @ 0xf4 80074e4: | | | | | | | | | | | 069b lsls r3, r3, #26 80074e6: | | | | | | | | | /--|--|----- d505 bpl.n 80074f4 <ip4_input+0x1488> if (pcb->refused_data != NULL) { 80074e8: | | | | | | | | | | | | 6fab ldr r3, [r5, #120] @ 0x78 80074ea: | | | | | | | | | | | | /-- b1bb cbz r3, 800751c <ip4_input+0x14b0> pcb->refused_data->flags |= PBUF_FLAG_TCP_FIN; 80074ec: | | | | | | | | | | | | | 7b5a ldrb r2, [r3, #13] 80074ee: | | | | | | | | | | | | | f042 0220 orr.w r2, r2, #32 80074f2: | | | | | | | | | | | | | 735a strb r2, [r3, #13] tcp_input_pcb = NULL; 80074f4: | | | | | | | | | >--|--|--|-> 2300 movs r3, #0 if (tcp_input_delayed_close(pcb)) { 80074f6: | | | | | | | | | | | | | 4628 mov r0, r5 tcp_input_pcb = NULL; 80074f8: | | | | | | | | | | | | | f8c4 30f8 str.w r3, [r4, #248] @ 0xf8 if (tcp_input_delayed_close(pcb)) { 80074fc: | | | | | | | | | | | | | f7fc fd90 bl 8004020 <tcp_input_delayed_close> 8007500: | | | | | | | | | | | | | 2800 cmp r0, #0 8007502: | | | | | | | | +--------------------------------------------------|--|--|--|-- f47f ab2a bne.w 8006b5a <ip4_input+0xaee> tcp_output(pcb); 8007506: | | | | | | | | | | | | | 4628 mov r0, r5 8007508: | | | | | | | | | | | | | f7fc f884 bl 8003614 <tcp_output> 800750c: | | | | | | | | +--------------------------------------------------|--|--|--|-- f7ff bb25 b.w 8006b5a <ip4_input+0xaee> TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err); 8007510: | | | | | | | | | | | \--|-> 463b mov r3, r7 8007512: | | | | | | | | | | | | 4629 mov r1, r5 8007514: | | | | | | | | | | | | 4638 mov r0, r7 8007516: | | | | | | | | | | | | f7fc fc5b bl 8003dd0 <tcp_recv_null> 800751a: | | | | | | | | | | \-----|-- e7d9 b.n 80074d0 <ip4_input+0x1464> if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) { 800751c: | | | | | | | | | | \-> 8d2b ldrh r3, [r5, #40] @ 0x28 TCP_EVENT_CLOSED(pcb, err); 800751e: | | | | | | | | | | f8d5 6084 ldr.w r6, [r5, #132] @ 0x84 if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) { 8007522: | | | | | | | | | | f5b3 6f06 cmp.w r3, #2144 @ 0x860 pcb->rcv_wnd++; 8007526: | | | | | | | | | | bf1c itt ne 8007528: | | | | | | | | | | 3301 addne r3, #1 800752a: | | | | | | | | | | 852b strhne r3, [r5, #40] @ 0x28 TCP_EVENT_CLOSED(pcb, err); 800752c: | | | | | | | | | | 2e00 cmp r6, #0 800752e: | | | | | | | | | +----------- d0e1 beq.n 80074f4 <ip4_input+0x1488> 8007530: | | | | | | | | | | 2300 movs r3, #0 8007532: | | | | | | | | | | 6928 ldr r0, [r5, #16] 8007534: | | | | | | | | | | 461a mov r2, r3 8007536: | | | | | | | | | | 4629 mov r1, r5 8007538: | | | | | | | | | | 47b0 blx r6 if (err == ERR_ABRT) { 800753a: | | | | | | | | | | 300d adds r0, #13 800753c: | | | | | | | | | \----------- d1da bne.n 80074f4 <ip4_input+0x1488> 800753e: | | | | | | | | \-------------------------------------------------------------- f7ff bb0c b.w 8006b5a <ip4_input+0xaee> ICMP_STATS_INC(icmp.recv); 8007542: | | | | | | | \----------------------------------------------------------------> 89e3 ldrh r3, [r4, #14] iphdr_in = ip4_current_header(); 8007544: | | | | | | | f8d4 8120 ldr.w r8, [r4, #288] @ 0x120 ICMP_STATS_INC(icmp.recv); 8007548: | | | | | | | 3301 adds r3, #1 800754a: | | | | | | | 81e3 strh r3, [r4, #14] hlen = IPH_HL_BYTES(iphdr_in); 800754c: | | | | | | | f898 7000 ldrb.w r7, [r8] 8007550: | | | | | | | f007 070f and.w r7, r7, #15 8007554: | | | | | | | 00bf lsls r7, r7, #2 if (hlen < IP_HLEN) { 8007556: | | | | | | | 2f13 cmp r7, #19 8007558: | | | | | | | /-------------------- f240 80ea bls.w 8007730 <ip4_input+0x16c4> if (p->len < sizeof(u16_t) * 2) { 800755c: | | | | | | | | 8973 ldrh r3, [r6, #10] 800755e: | | | | | | | | 2b03 cmp r3, #3 8007560: | | | | | | | +-------------------- f240 80e6 bls.w 8007730 <ip4_input+0x16c4> type = *((u8_t *)p->payload); 8007564: | | | | | | | | 6873 ldr r3, [r6, #4] 8007566: | | | | | | | | 781b ldrb r3, [r3, #0] switch (type) { 8007568: | | | | | | | | 2b00 cmp r3, #0 800756a: | | | | | +--|-----------------------------------------------|-------------------- f43f a86c beq.w 8006646 <ip4_input+0x5da> 800756e: | | | | | | | | 2b08 cmp r3, #8 8007570: | | | | | | | | /----------------- f040 80d6 bne.w 8007720 <ip4_input+0x16b4> if (ip4_addr_ismulticast(ip4_current_dest_addr())) { 8007574: | | | | | | | | | f8d4 012c ldr.w r0, [r4, #300] @ 0x12c 8007578: | | | | | | | | | f000 03f0 and.w r3, r0, #240 @ 0xf0 800757c: | | | | | | | | | 2be0 cmp r3, #224 @ 0xe0 800757e: | | | | | | | | | /-------------- d055 beq.n 800762c <ip4_input+0x15c0> if (ip4_addr_isbroadcast(ip4_current_dest_addr(), ip_current_netif())) { 8007580: | | | | | | | | | | f8d4 1118 ldr.w r1, [r4, #280] @ 0x118 8007584: | | | | | | | | | | f000 fd64 bl 8008050 <ip4_addr_isbroadcast_u32> 8007588: | | | | | | | | | | 2800 cmp r0, #0 800758a: | | | | | | | | | +-------------- d14f bne.n 800762c <ip4_input+0x15c0> if (p->tot_len < sizeof(struct icmp_echo_hdr)) { 800758c: | | | | | | | | | | 8933 ldrh r3, [r6, #8] 800758e: | | | | | | | | | | 2b07 cmp r3, #7 8007590: | | | | | | | +--|--|-------------- f240 80ce bls.w 8007730 <ip4_input+0x16c4> u16_t inet_chksum_pbuf(struct pbuf *p) { u32_t acc; struct pbuf *q; int swapped = 0; 8007594: | | | | | | | | | | 2200 movs r2, #0 acc = 0; for (q = p; q != NULL; q = q->next) { 8007596: | | | | | | | | | | 46b1 mov r9, r6 acc = 0; 8007598: | | | | | | | | | | 4615 mov r5, r2 acc += LWIP_CHKSUM(q->payload, q->len); 800759a: | | | | | | | | | | /----> f8b9 b00a ldrh.w fp, [r9, #10] 800759e: | | | | | | | | | | | f8d9 0004 ldr.w r0, [r9, #4] 80075a2: | | | | | | | | | | | 9205 str r2, [sp, #20] 80075a4: | | | | | | | | | | | 4659 mov r1, fp 80075a6: | | | | | | | | | | | f000 fdc7 bl 8008138 <lwip_standard_chksum> 80075aa: | | | | | | | | | | | 4428 add r0, r5 acc = FOLD_U32T(acc); 80075ac: | | | | | | | | | | | b285 uxth r5, r0 if (q->len % 2 != 0) { 80075ae: | | | | | | | | | | | f01b 0f01 tst.w fp, #1 80075b2: | | | | | | | | | | | 9a05 ldr r2, [sp, #20] acc = FOLD_U32T(acc); 80075b4: | | | | | | | | | | | eb05 4510 add.w r5, r5, r0, lsr #16 if (q->len % 2 != 0) { 80075b8: | | | | | | | | | | | /-- d006 beq.n 80075c8 <ip4_input+0x155c> swapped = !swapped; acc = SWAP_BYTES_IN_WORD(acc); 80075ba: | | | | | | | | | | | | 022b lsls r3, r5, #8 80075bc: | | | | | | | | | | | | b29b uxth r3, r3 80075be: | | | | | | | | | | | | f3c5 2507 ubfx r5, r5, #8, #8 80075c2: | | | | | | | | | | | | f082 0201 eor.w r2, r2, #1 80075c6: | | | | | | | | | | | | 431d orrs r5, r3 for (q = p; q != NULL; q = q->next) { 80075c8: | | | | | | | | | | | \-> f8d9 9000 ldr.w r9, [r9] 80075cc: | | | | | | | | | | | f1b9 0f00 cmp.w r9, #0 80075d0: | | | | | | | | | | \----- d1e3 bne.n 800759a <ip4_input+0x152e> } } if (swapped) { 80075d2: | | | | | | | | | | /-- b122 cbz r2, 80075de <ip4_input+0x1572> acc = SWAP_BYTES_IN_WORD(acc); 80075d4: | | | | | | | | | | | 022b lsls r3, r5, #8 80075d6: | | | | | | | | | | | b29b uxth r3, r3 80075d8: | | | | | | | | | | | f3c5 2507 ubfx r5, r5, #8, #8 80075dc: | | | | | | | | | | | 431d orrs r5, r3 if (inet_chksum_pbuf(p) != 0) { 80075de: | | | | | | | | | | \-> b2ad uxth r5, r5 80075e0: | | | | | | | | | | f64f 73ff movw r3, #65535 @ 0xffff 80075e4: | | | | | | | | | | 429d cmp r5, r3 80075e6: | | | | | | | | | | /-- d007 beq.n 80075f8 <ip4_input+0x158c> pbuf_free(p); 80075e8: | | | | | | | | | | | 4630 mov r0, r6 80075ea: | | | | | | | | | | | f002 fbe7 bl 8009dbc <pbuf_free.isra.0> ICMP_STATS_INC(icmp.chkerr); 80075ee: | | | | | | | | | | | 8aa3 ldrh r3, [r4, #20] 80075f0: | | | | | | | | | | | 3301 adds r3, #1 80075f2: | | | | | | | | | | | 82a3 strh r3, [r4, #20] return; 80075f4: | | | | | | +-----------------------------------------------|--|--|-----------|-- f7ff b8c2 b.w 800677c <ip4_input+0x710> if (pbuf_add_header(p, hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN)) { 80075f8: | | | | | | | | | | \-> f107 050e add.w r5, r7, #14 return pbuf_add_header_impl(p, header_size_increment, 0); 80075fc: | | | | | | | | | | 2200 movs r2, #0 80075fe: | | | | | | | | | | 4629 mov r1, r5 8007600: | | | | | | | | | | 4630 mov r0, r6 8007602: | | | | | | | | | | f7fa ffa5 bl 8002550 <pbuf_add_header_impl.lto_priv.0> 8007606: | | | | | | | | | | 2800 cmp r0, #0 8007608: | | | | | | | | | | /----------- d077 beq.n 80076fa <ip4_input+0x168e> u16_t alloc_len = (u16_t)(p->tot_len + hlen); 800760a: | | | | | | | | | | | 8933 ldrh r3, [r6, #8] 800760c: | | | | | | | | | | | 18f9 adds r1, r7, r3 800760e: | | | | | | | | | | | b289 uxth r1, r1 if (alloc_len < p->tot_len) { 8007610: | | | | | | | | | | | 428b cmp r3, r1 8007612: | | | | | | | | | +--|----------- d80b bhi.n 800762c <ip4_input+0x15c0> r = pbuf_alloc(PBUF_LINK, alloc_len, PBUF_RAM); 8007614: | | | | | | | | | | | 200e movs r0, #14 8007616: | | | | | | | | | | | f001 fe2f bl 8009278 <pbuf_alloc.constprop.0> if (r == NULL) { 800761a: | | | | | | | | | | | 4605 mov r5, r0 800761c: | | | | | | | | | +--|----------- b130 cbz r0, 800762c <ip4_input+0x15c0> if (r->len < hlen + sizeof(struct icmp_echo_hdr)) { 800761e: | | | | | | | | | | | 8942 ldrh r2, [r0, #10] 8007620: | | | | | | | | | | | f107 0308 add.w r3, r7, #8 8007624: | | | | | | | | | | | 429a cmp r2, r3 8007626: | | | | | | | | | | | /-- d209 bcs.n 800763c <ip4_input+0x15d0> pbuf_free(r); 8007628: | | | | | | | | | | | /-----|-> f002 fbc8 bl 8009dbc <pbuf_free.isra.0> pbuf_free(p); 800762c: | | | | | | | | | >--|--|-----|-> 4630 mov r0, r6 800762e: | | | | | | | | | | | | | f002 fbc5 bl 8009dbc <pbuf_free.isra.0> ICMP_STATS_INC(icmp.err); 8007632: | | | | | | | | | | | | | 8c23 ldrh r3, [r4, #32] 8007634: | | | | | | | | | | | | | 3301 adds r3, #1 8007636: | | | | | | | | | | | | | 8423 strh r3, [r4, #32] return; 8007638: | | | | | | +-----------------------------------------------|--|--|--|--|-----|-- f7ff b8a0 b.w 800677c <ip4_input+0x710> MEMCPY(r->payload, iphdr_in, hlen); 800763c: | | | | | | | | | | | | \-> 4641 mov r1, r8 800763e: | | | | | | | | | | | | 6840 ldr r0, [r0, #4] 8007640: | | | | | | | | | | | | 463a mov r2, r7 8007642: | | | | | | | | | | | | f003 fcc7 bl 800afd4 <memcpy> if (pbuf_remove_header(r, hlen)) { 8007646: | | | | | | | | | | | | 4639 mov r1, r7 8007648: | | | | | | | | | | | | 4628 mov r0, r5 800764a: | | | | | | | | | | | | f7fa ffb9 bl 80025c0 <pbuf_remove_header> 800764e: | | | | | | | | | | | | /----- b168 cbz r0, 800766c <ip4_input+0x1600> LWIP_ASSERT("icmp_input: moving r->payload to icmp header failed", 0); 8007650: | | | | | | | | | | | | | b672 cpsid i 8007652: | | | | | | | | | | | | | 4b48 ldr r3, [pc, #288] @ (8007774 ) 8007654: | | | | | | | | | | | | | 4a48 ldr r2, [pc, #288] @ (8007778 ) 8007656: | | | | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 800765a: | | | | | | | | | | | | | 4b48 ldr r3, [pc, #288] @ (800777c ) 800765c: | | | | | | | | | | | | | 9300 str r3, [sp, #0] 800765e: | | | | | | | | | | | | | 4844 ldr r0, [pc, #272] @ (8007770 ) 8007660: | | | | | | | | | | | | | 23b6 movs r3, #182 @ 0xb6 8007662: | | | | | | | | | | | | | f7f9 fe49 bl 80012f8 <printf_> 8007666: | | | | | | | | | | | | | be00 bkpt 0x0000 pbuf_free(r); 8007668: | | | | | | | | | | | | | /-> 4628 mov r0, r5 800766a: | | | | | | | | | | | \--|--|-- e7dd b.n 8007628 <ip4_input+0x15bc> if (pbuf_copy(r, p) != ERR_OK) { 800766c: | | | | | | | | | | | \--|-> 4631 mov r1, r6 800766e: | | | | | | | | | | | | 4628 mov r0, r5 8007670: | | | | | | | | | | | | f7fb f8ae bl 80027d0 <pbuf_copy> 8007674: | | | | | | | | | | | | 2800 cmp r0, #0 8007676: | | | | | | | | | | | \-- d1f7 bne.n 8007668 <ip4_input+0x15fc> pbuf_free(p); 8007678: | | | | | | | | | | | 4630 mov r0, r6 800767a: | | | | | | | | | | | f002 fb9f bl 8009dbc <pbuf_free.isra.0> p = r; 800767e: | | | | | | | | | | | 462e mov r6, r5 8007680: | | | | | | | | | | | /-> 2200 movs r2, #0 8007682: | | | | | | | | | | | | 4639 mov r1, r7 8007684: | | | | | | | | | | | | 4630 mov r0, r6 iecho = (struct icmp_echo_hdr *)p->payload; 8007686: | | | | | | | | | | | | 6875 ldr r5, [r6, #4] 8007688: | | | | | | | | | | | | f7fa ff62 bl 8002550 <pbuf_add_header_impl.lto_priv.0> if (pbuf_add_header(p, hlen)) { 800768c: | | | | | | | | | | | | 2800 cmp r0, #0 800768e: | | | | | +--|-----------------------------------------------|--|--|--|--------|-- f47e afda bne.w 8006646 <ip4_input+0x5da> struct ip_hdr *iphdr = (struct ip_hdr *)p->payload; 8007692: | | | | | | | | | | | | f8d6 8004 ldr.w r8, [r6, #4] ip4_addr_copy(iphdr->src, *src); 8007696: | | | | | | | | | | | | f8d4 312c ldr.w r3, [r4, #300] @ 0x12c 800769a: | | | | | | | | | | | | f8c8 300c str.w r3, [r8, #12] ip4_addr_copy(iphdr->dest, *ip4_current_src_addr()); 800769e: | | | | | | | | | | | | f8d4 3128 ldr.w r3, [r4, #296] @ 0x128 80076a2: | | | | | | | | | | | | f8c8 3010 str.w r3, [r8, #16] if (iecho->chksum > PP_HTONS(0xffffU - (ICMP_ECHO << 8))) { 80076a6: | | | | | | | | | | | | 886b ldrh r3, [r5, #2] ICMPH_TYPE_SET(iecho, ICMP_ER); 80076a8: | | | | | | | | | | | | 7028 strb r0, [r5, #0] if (iecho->chksum > PP_HTONS(0xffffU - (ICMP_ECHO << 8))) { 80076aa: | | | | | | | | | | | | f64f 72f7 movw r2, #65527 @ 0xfff7 80076ae: | | | | | | | | | | | | 4293 cmp r3, r2 iecho->chksum = (u16_t)(iecho->chksum + PP_HTONS((u16_t)(ICMP_ECHO << 8)) + 1); 80076b0: | | | | | | | | | | | | bf8c ite hi 80076b2: | | | | | | | | | | | | 3309 addhi r3, #9 iecho->chksum = (u16_t)(iecho->chksum + PP_HTONS(ICMP_ECHO << 8)); 80076b4: | | | | | | | | | | | | 3308 addls r3, #8 80076b6: | | | | | | | | | | | | b29b uxth r3, r3 80076b8: | | | | | | | | | | | | 806b strh r3, [r5, #2] IPH_TTL_SET(iphdr, ICMP_TTL); 80076ba: | | | | | | | | | | | | f04f 09ff mov.w r9, #255 @ 0xff IPH_CHKSUM_SET(iphdr, 0); 80076be: | | | | | | | | | | | | 2500 movs r5, #0 return (u16_t)~(unsigned int)LWIP_CHKSUM(dataptr, len); 80076c0: | | | | | | | | | | | | 4639 mov r1, r7 IPH_TTL_SET(iphdr, ICMP_TTL); 80076c2: | | | | | | | | | | | | f888 9008 strb.w r9, [r8, #8] IPH_CHKSUM_SET(iphdr, 0); 80076c6: | | | | | | | | | | | | f888 500a strb.w r5, [r8, #10] 80076ca: | | | | | | | | | | | | f888 500b strb.w r5, [r8, #11] 80076ce: | | | | | | | | | | | | 4640 mov r0, r8 80076d0: | | | | | | | | | | | | f000 fd32 bl 8008138 <lwip_standard_chksum> ICMP_STATS_INC(icmp.xmit); 80076d4: | | | | | | | | | | | | 89a2 ldrh r2, [r4, #12] return ip4_output_if_src(p, src_used, dest, ttl, tos, proto, netif); 80076d6: | | | | | | | | | | | | 492a ldr r1, [pc, #168] @ (8007780 ) 80076d8: | | | | | | | | | | | | 43c0 mvns r0, r0 80076da: | | | | | | | | | | | | 3201 adds r2, #1 80076dc: | | | | | | | | | | | | 2301 movs r3, #1 IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, hlen)); 80076de: | | | | | | | | | | | | f8a8 000a strh.w r0, [r8, #10] ICMP_STATS_INC(icmp.xmit); 80076e2: | | | | | | | | | | | | 81a2 strh r2, [r4, #12] 80076e4: | | | | | | | | | | | | 4630 mov r0, r6 80076e6: | | | | | | | | | | | | e9cd 5300 strd r5, r3, [sp] 80076ea: | | | | | | | | | | | | f8cd a008 str.w sl, [sp, #8] 80076ee: | | | | | | | | | | | | 464b mov r3, r9 80076f0: | | | | | | | | | | | | 462a mov r2, r5 80076f2: | | | | | | | | | | | | f002 fc21 bl 8009f38 <ip4_output_if_src> 80076f6: | | | | | +--|-----------------------------------------------|--|--|--|--------|-- f7fe bfa6 b.w 8006646 <ip4_input+0x5da> if (pbuf_remove_header(p, hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN)) { 80076fa: | | | | | | | | | | \--------|-> 4629 mov r1, r5 80076fc: | | | | | | | | | | | 4630 mov r0, r6 80076fe: | | | | | | | | | | | f7fa ff5f bl 80025c0 <pbuf_remove_header> 8007702: | | | | | | | | | | | 2800 cmp r0, #0 8007704: | | | | | | | | | | \-- d0bc beq.n 8007680 <ip4_input+0x1614> LWIP_ASSERT("icmp_input: restoring original p->payload failed", 0); 8007706: | | | | | | | | | | b672 cpsid i 8007708: | | | | | | | | | | 4b1a ldr r3, [pc, #104] @ (8007774 ) 800770a: | | | | | | | | | | 4a1e ldr r2, [pc, #120] @ (8007784 ) 800770c: | | | | | | | | | | f8d3 12fc ldr.w r1, [r3, #764] @ 0x2fc 8007710: | | | | | | | | | | 4b1a ldr r3, [pc, #104] @ (800777c ) 8007712: | | | | | | | | | | 9300 str r3, [sp, #0] 8007714: | | | | | | | | | | 4816 ldr r0, [pc, #88] @ (8007770 ) 8007716: | | | | | | | | | | 23c7 movs r3, #199 @ 0xc7 8007718: | | | | | | | | | | f7f9 fdee bl 80012f8 <printf_> 800771c: | | | | | | | | | | be00 bkpt 0x0000 goto icmperr; 800771e: | | | | | | | | | \-------------- e785 b.n 800762c <ip4_input+0x15c0> ICMP_STATS_INC(icmp.proterr); 8007720: | | | | | | | | \----------------> 8ba3 ldrh r3, [r4, #28] 8007722: | | | | | | | | 3301 adds r3, #1 8007724: | | | | | | | | 83a3 strh r3, [r4, #28] ICMP_STATS_INC(icmp.drop); 8007726: | | | | | | | | 8a63 ldrh r3, [r4, #18] 8007728: | | | | | | | | 3301 adds r3, #1 800772a: | | | | | | | | 8263 strh r3, [r4, #18] pbuf_free(p); 800772c: | | | | | \--|-----------------------------------------------|-------------------- f7fe bf8b b.w 8006646 <ip4_input+0x5da> pbuf_free(p); 8007730: | | | | | | \-------------------> 4630 mov r0, r6 8007732: | | | | | | f002 fb43 bl 8009dbc <pbuf_free.isra.0> ICMP_STATS_INC(icmp.lenerr); 8007736: | | | | | | 8ae3 ldrh r3, [r4, #22] 8007738: | | | | | | 3301 adds r3, #1 800773a: | | | | | | 82e3 strh r3, [r4, #22] return; 800773c: | | | | | \-------------------------------------------------------------------- f7ff b81e b.w 800677c <ip4_input+0x710> && !ip4_addr_isany_val(*ip4_current_src_addr()) 8007740: | \--|--|--|-------------------------------------------------------------------------> 2c00 cmp r4, #0 8007742: | | | \-------------------------------------------------------------------------- f43e ad35 beq.w 80061b0 <ip4_input+0x144> 8007746: | | | f04f 0800 mov.w r8, #0 if ((ip4_addr_isbroadcast(ip4_current_src_addr(), inp)) || 800774a: | | \----------------------------------------------------------------------------> 4651 mov r1, sl 800774c: | | 4620 mov r0, r4 800774e: | | f000 fc7f bl 8008050 <ip4_addr_isbroadcast_u32> 8007752: | | /-- b920 cbnz r0, 800775e <ip4_input+0x16f2> (ip4_addr_ismulticast(ip4_current_src_addr()))) { 8007754: | | | f004 04f0 and.w r4, r4, #240 @ 0xf0 if ((ip4_addr_isbroadcast(ip4_current_src_addr(), inp)) || 8007758: | | | 2ce0 cmp r4, #224 @ 0xe0 800775a: | \-----------------------------------------------------------------------------|-- f47e ad26 bne.w 80061aa <ip4_input+0x13e> pbuf_free(p); 800775e: | \-> 4630 mov r0, r6 8007760: | f002 fb2c bl 8009dbc <pbuf_free.isra.0> IP_STATS_INC(ip.drop); 8007764: \-------------------------------------------------------------------------------------- f7fe bc9a b.w 800609c <ip4_input+0x30> 8007768: 0800b591 .word 0x0800b591 800776c: 0800c7c4 .word 0x0800c7c4 8007770: 0800b232 .word 0x0800b232 8007774: 20000060 .word 0x20000060 8007778: 0800c7de .word 0x0800c7de 800777c: 0800c4c4 .word 0x0800c4c4 8007780: 20001284 .word 0x20001284 8007784: 0800c812 .word 0x0800c812 08007788 : } /* * Threads */ static void sys_arch_dummy_cb(void *ctx) {(void)ctx;} 8007788: 4770 bx lr 0800778a : } } /*====================================================================================*/ bgrt_proc_t * bgrt_curr_proc(void) { return BGRT_CURR_PROC; 800778a: 4b07 ldr r3, [pc, #28] @ (80077a8 ) 800778c: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90 bgrt_proc_t * proc; proc = bgrt_curr_proc(); BGRT_SPIN_LOCK(proc); proc->flags |= BGRT_PROC_FLG_LOCK; 8007790: 7c1a ldrb r2, [r3, #16] 8007792: f042 0220 orr.w r2, r2, #32 8007796: 741a strb r2, [r3, #16] BGRT_CNT_INC(proc->cnt_lock); 8007798: f8d3 20a4 ldr.w r2, [r3, #164] @ 0xa4 # endif /*BGRT_CONFIG_PANIC*/ #endif /*BGRT_CONFIG_TEST*/ bgrt_cnt_t bgrt_cnt_inc(bgrt_cnt_t val) { if (BGRT_CONFIG_CNT_MAX > val) 800779c: 1c51 adds r1, r2, #1 { return val + (bgrt_cnt_t)1; 800779e: bf18 it ne 80077a0: 3201 addne r2, #1 80077a2: f8c3 20a4 str.w r2, [r3, #164] @ 0xa4 BGRT_SPIN_FREE(proc); } 80077a6: 4770 bx lr 80077a8: 200001b0 .word 0x200001b0 080077ac : 80077ac: 4b05 ldr r3, [pc, #20] @ (80077c4 ) 80077ae: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90 bgrt_proc_t * proc; proc = bgrt_curr_proc(); BGRT_SPIN_LOCK(proc); if (proc->flags & BGRT_PROC_FLG_RT) 80077b2: f993 2010 ldrsb.w r2, [r3, #16] 80077b6: 2a00 cmp r2, #0 { proc->timer = proc->time_quant; 80077b8: bfbc itt lt 80077ba: f8d3 2098 ldrlt.w r2, [r3, #152] @ 0x98 80077be: f8c3 209c strlt.w r2, [r3, #156] @ 0x9c } BGRT_SPIN_FREE(proc); } 80077c2: 4770 bx lr 80077c4: 200001b0 .word 0x200001b0 080077c8 : } /********************************************************************************************** PROC_LOCK **********************************************************************************************/ BGRT_SC_SR(PROC_LOCK, void * arg) { 80077c8: b508 push {r3, lr} (void)arg; bgrt_priv_proc_lock(); 80077ca: f7ff ffde bl 800778a <bgrt_priv_proc_lock> return BGRT_ST_OK; } 80077ce: 2000 movs r0, #0 80077d0: bd08 pop {r3, pc} 080077d2 : } /********************************************************************************************** PROC_RESET_WATCHDOG **********************************************************************************************/ BGRT_SC_SR(PROC_RESET_WATCHDOG, void * arg) { 80077d2: b508 push {r3, lr} (void)arg; bgrt_priv_proc_reset_watchdog(); 80077d4: f7ff ffea bl 80077ac <bgrt_priv_proc_reset_watchdog> return BGRT_ST_OK; } 80077d8: 2000 movs r0, #0 80077da: bd08 pop {r3, pc} 080077dc : BGRT_SC_SR(PROC_GET_PRIO, bgrt_va_wr_t * va) { bgrt_prio_t * prio_ptr; BGRT_PID_T pid; prio_ptr = (bgrt_prio_t *)va_arg(va->list, void *); /* ADLINT:SL:[W0644] valist */ 80077dc: 6803 ldr r3, [r0, #0] 80077de: 1d1a adds r2, r3, #4 80077e0: 6002 str r2, [r0, #0] 80077e2: 461a mov r2, r3 80077e4: f852 1b08 ldr.w r1, [r2], #8 pid = (BGRT_PID_T)va_arg(va->list, void *); 80077e8: 6002 str r2, [r0, #0] 80077ea: 685b ldr r3, [r3, #4] /*====================================================================================*/ bgrt_prio_t bgrt_priv_proc_get_prio(bgrt_proc_t * proc) { bgrt_prio_t ret; if (!proc) 80077ec: /-- b913 cbnz r3, 80077f4 <BGRT_SC_PROC_GET_PRIO_SR+0x18> 80077ee: | 4b03 ldr r3, [pc, #12] @ (80077fc ) 80077f0: | f8d3 3090 ldr.w r3, [r3, #144] @ 0x90 { proc = bgrt_curr_proc(); } BGRT_SPIN_LOCK(proc); ret = proc->base_prio; 80077f4: \-> 7c5b ldrb r3, [r3, #17] *prio_ptr = bgrt_priv_proc_get_prio(BGRT_PID_TO_PROC(pid)); 80077f6: 700b strb r3, [r1, #0] return BGRT_ST_OK; } 80077f8: 2000 movs r0, #0 80077fa: 4770 bx lr 80077fc: 200001b0 .word 0x200001b0 08007800 : 8007800: 4b02 ldr r3, [pc, #8] @ (800780c ) 8007802: f8d3 3090 ldr.w r3, [r3, #144] @ 0x90 BGRT_SC_SR(PROC_GET_ID, void * arg) { bgrt_proc_t * curr_proc; /*Do NOT optimize this as BGRT_PROC_TO_PID may call bgrt_curr_proc more than one time!!!*/ curr_proc = bgrt_curr_proc(); *(BGRT_PID_T *)arg = BGRT_PROC_TO_PID(curr_proc); 8007806: 6003 str r3, [r0, #0] return BGRT_ST_OK; } 8007808: 2000 movs r0, #0 800780a: 4770 bx lr 800780c: 200001b0 .word 0x200001b0 08007810 <_do_nothing_sr>: **********************************************************************************************/ static bgrt_st_t _do_nothing_sr(void * arg) { (void)arg; /* ADLINT:SL:[W0085] no effect*/ return BGRT_ST_SCALL; } 8007810: 2008 movs r0, #8 8007812: 4770 bx lr 08007814 : BGRT_INT_FREE(); } /*====================================================================================*/ __attribute__ ((naked)) void BGRT_SYSCALL_ISR(void) { BGRT_CONTEXT_STORE(); 8007814: f3ef 8009 mrs r0, PSP 8007818: f01e 0f10 tst.w lr, #16 800781c: bf08 it eq 800781e: ed20 8a10 vstmdbeq r0!, {s16-s31} 8007822: e920 4ff0 stmdb r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 8007826: f380 8809 msr PSP, r0 800782a: f3bf 8f4f dsb sy 800782e: f3bf 8f6f isb sy __asm__ __volatile__ ("mrs %0, psp \n\t" :"=r" (ret)::); 8007832: f3ef 8109 mrs r1, PSP saved_sp = _read_psp(); *current_sp = saved_sp; 8007836: 4a1b ldr r2, [pc, #108] @ (80078a4 ) 8007838: 6813 ldr r3, [r2, #0] 800783a: 6019 str r1, [r3, #0] if (BGRT_KBLOCK.hpmap || 800783c: 4b1a ldr r3, [pc, #104] @ (80078a8 ) BGRT_KBLOCK.vic.list.map || 800783e: f8d3 0080 ldr.w r0, [r3, #128] @ 0x80 8007842: f8d3 1088 ldr.w r1, [r3, #136] @ 0x88 8007846: 4301 orrs r1, r0 8007848: f8d3 008c ldr.w r0, [r3, #140] @ 0x8c 800784c: 4301 orrs r1, r0 kernel_mode = 1; 800784e: bf1c itt ne 8007850: 2101 movne r1, #1 8007852: 7111 strbne r1, [r2, #4] if (kernel_mode) 8007854: 7911 ldrb r1, [r2, #4] 8007856: /----- bb11 cbnz r1, 800789e <pend_sv_handler+0x8a> current_sp = &BGRT_CURR_PROC->spointer; 8007858: | f8d3 3090 ldr.w r3, [r3, #144] @ 0x90 800785c: | 33bc adds r3, #188 @ 0xbc bgrt_set_curr_sp(); BGRT_SYS_ICSR |= BGRT_PENDSV_CLR; /* Fix for a hardware race condition. */ 800785e: | /-> f04f 21e0 mov.w r1, #3758153728 @ 0xe000e000 8007862: | | 6013 str r3, [r2, #0] 8007864: | | f8d1 2d04 ldr.w r2, [r1, #3332] @ 0xd04 __asm__ __volatile__ ( 8007868: | | 681b ldr r3, [r3, #0] BGRT_SYS_ICSR |= BGRT_PENDSV_CLR; /* Fix for a hardware race condition. */ 800786a: | | f042 6200 orr.w r2, r2, #134217728 @ 0x8000000 800786e: | | f8c1 2d04 str.w r2, [r1, #3332] @ 0xd04 __asm__ __volatile__ ( 8007872: | | f383 8809 msr PSP, r3 8007876: | | f3bf 8f4f dsb sy 800787a: | | f3bf 8f6f isb sy _write_psp(*current_sp); BGRT_CONTEXT_LOAD(); 800787e: | | f3ef 8009 mrs r0, PSP 8007882: | | e8b0 4ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 8007886: | | f01e 0f10 tst.w lr, #16 800788a: | | bf08 it eq 800788c: | | ecb0 8a10 vldmiaeq r0!, {s16-s31} 8007890: | | f380 8809 msr PSP, r0 8007894: | | f3bf 8f4f dsb sy 8007898: | | f3bf 8f6f isb sy 800789c: | | 4770 bx lr current_sp = &kernel_sp; 800789e: \--|-> 4b03 ldr r3, [pc, #12] @ (80078ac ) 80078a0: \-- e7dd b.n 800785e <pend_sv_handler+0x4a> 80078a2: bf00 nop 80078a4: 20000050 .word 0x20000050 80078a8: 200001b0 .word 0x200001b0 80078ac: 20008100 .word 0x20008100 080078b0 : bgrt_st_t bgrt_sem_try_lock(bgrt_sem_t * sem) { bgrt_st_t ret = BGRT_ST_ROLL; if (!sem) 80078b0: 4603 mov r3, r0 80078b2: /----------- b1d0 cbz r0, 80078ea <bgrt_sem_try_lock+0x3a> { return BGRT_ST_ENULL; } BGRT_INT_LOCK(); 80078b4: | f04f 00f0 mov.w r0, #240 @ 0xf0 80078b8: | f380 8811 msr BASEPRI, r0 80078bc: | f3bf 8f4f dsb sy 80078c0: | f3bf 8f6f isb sy BGRT_SPIN_LOCK(sem); if (sem->counter) 80078c4: | f8d3 2098 ldr.w r2, [r3, #152] @ 0x98 80078c8: | /-------- b16a cbz r2, 80078e6 <bgrt_sem_try_lock+0x36> { sem->counter--; 80078ca: | | 3a01 subs r2, #1 80078cc: | | f8c3 2098 str.w r2, [r3, #152] @ 0x98 ret = BGRT_ST_OK; 80078d0: | | 2300 movs r3, #0 } BGRT_SPIN_FREE(sem); BGRT_INT_FREE(); 80078d2: | | /----> f04f 0000 mov.w r0, #0 80078d6: | | | f380 8811 msr BASEPRI, r0 80078da: | | | f3bf 8f4f dsb sy 80078de: | | | f3bf 8f6f isb sy return ret; } 80078e2: | | | /-> 4618 mov r0, r3 80078e4: | | | | 4770 bx lr bgrt_st_t ret = BGRT_ST_ROLL; 80078e6: | \--|--|-> 2309 movs r3, #9 80078e8: | \--|-- e7f3 b.n 80078d2 <bgrt_sem_try_lock+0x22> return BGRT_ST_ENULL; 80078ea: \--------|-> 2301 movs r3, #1 80078ec: \-- e7f9 b.n 80078e2 <bgrt_sem_try_lock+0x32> 080078ee : gpio_pup @param[in] gpios Unsigned int16. Pin identifiers @ref gpio_pin_id If multiple pins are to be set, use bitwise OR '|' to separate them. */ void gpio_mode_setup(uint32_t gpioport, uint8_t mode, uint8_t pull_up_down, 80078ee: b5f0 push {r4, r5, r6, r7, lr} /* * We want to set the config only for the pins mentioned in gpios, * but keeping the others, so read out the actual config first. */ moder = GPIO_MODER(gpioport); 80078f0: 6803 ldr r3, [r0, #0] pupd = GPIO_PUPDR(gpioport); 80078f2: 68c6 ldr r6, [r0, #12] 80078f4: 2400 movs r4, #0 for (i = 0; i < 16; i++) { if (!((1 << i) & gpios)) { continue; } moder &= ~GPIO_MODE_MASK(i); 80078f6: f04f 0c03 mov.w ip, #3 if (!((1 << i) & gpios)) { 80078fa: /----> fa42 f504 asr.w r5, r2, r4 80078fe: | 07ed lsls r5, r5, #31 8007900: | /-- d509 bpl.n 8007916 <gpio_mode_setup.constprop.0+0x28> moder &= ~GPIO_MODE_MASK(i); 8007902: | | 0065 lsls r5, r4, #1 8007904: | | fa0c f705 lsl.w r7, ip, r5 8007908: | | ea23 0307 bic.w r3, r3, r7 moder |= GPIO_MODE(i, mode); 800790c: | | fa01 f505 lsl.w r5, r1, r5 8007910: | | 432b orrs r3, r5 pupd &= ~GPIO_PUPD_MASK(i); 8007912: | | ea26 0607 bic.w r6, r6, r7 for (i = 0; i < 16; i++) { 8007916: | \-> 3401 adds r4, #1 8007918: | 2c10 cmp r4, #16 800791a: \----- d1ee bne.n 80078fa <gpio_mode_setup.constprop.0+0xc> pupd |= GPIO_PUPD(i, pull_up_down); } /* Set mode and pull up/down control registers. */ GPIO_MODER(gpioport) = moder; 800791c: 6003 str r3, [r0, #0] GPIO_PUPDR(gpioport) = pupd; 800791e: 60c6 str r6, [r0, #12] } 8007920: bdf0 pop {r4, r5, r6, r7, pc} 08007922 : pcounter->counter[p] = (bgrt_cnt_t)0; /* ADLINT:SL:[W0705] Out of range access!*/ } } /* Increment*/ void bgrt_pcounter_inc(bgrt_pcounter_t * pcounter, bgrt_prio_t prio) { 8007922: b537 push {r0, r1, r2, r4, r5, lr} 8007924: 460d mov r5, r1 BGRT_ASSERT(pcounter, "The #pcounter must not be NULL!"); 8007926: 4604 mov r4, r0 8007928: /-- b958 cbnz r0, 8007942 <bgrt_pcounter_inc+0x20> 800792a: | b672 cpsid i 800792c: | 4b0d ldr r3, [pc, #52] @ (8007964 ) 800792e: | 4a0e ldr r2, [pc, #56] @ (8007968 ) 8007930: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007934: | 4b0d ldr r3, [pc, #52] @ (800796c ) 8007936: | 9300 str r3, [sp, #0] 8007938: | 480d ldr r0, [pc, #52] @ (8007970 ) 800793a: | 23a4 movs r3, #164 @ 0xa4 800793c: | f7f9 fcdc bl 80012f8 <printf_> 8007940: | be00 bkpt 0x0000 BGRT_CNT_INC(pcounter->counter[prio]); /* ADLINT:SL:[W0705] Out of range access!*/ 8007942: \-> f854 3025 ldr.w r3, [r4, r5, lsl #2] if (BGRT_CONFIG_CNT_MAX > val) 8007946: 1c5a adds r2, r3, #1 return val + (bgrt_cnt_t)1; 8007948: bf18 it ne 800794a: 3301 addne r3, #1 BGRT_CNT_INC(pcounter->counter[prio]); /* ADLINT:SL:[W0705] Out of range access!*/ 800794c: f844 3025 str.w r3, [r4, r5, lsl #2] pcounter->map |= ((bgrt_map_t)1)<: BGRT_SC_SR(SYNC_GET_OWNER, bgrt_va_wr_t * va) { BGRT_PID_T * pid; bgrt_proc_t * proc; pid = (BGRT_PID_T *)va_arg(va->list, void *); 8007974: 6803 ldr r3, [r0, #0] { 8007976: b537 push {r0, r1, r2, r4, r5, lr} pid = (BGRT_PID_T *)va_arg(va->list, void *); 8007978: 1d1a adds r2, r3, #4 800797a: 6002 str r2, [r0, #0] 800797c: 461a mov r2, r3 800797e: f852 5b08 ldr.w r5, [r2], #8 /*Do NOT optimize this as BGRT_PROC_TO_PID may call va_arg more than one time!!!*/ proc = bgrt_priv_sync_get_owner((bgrt_sync_t *)va_arg(va->list, void *)); 8007982: 6002 str r2, [r0, #0] 8007984: 685c ldr r4, [r3, #4] /*====================================================================================*/ bgrt_proc_t * bgrt_priv_sync_get_owner(bgrt_sync_t * sync) { bgrt_proc_t * ret; BGRT_ASSERT(sync, "The #sync must not be NULL!"); 8007986: /-- b964 cbnz r4, 80079a2 <BGRT_SC_SYNC_GET_OWNER_SR+0x2e> 8007988: | b672 cpsid i 800798a: | 4b09 ldr r3, [pc, #36] @ (80079b0 ) 800798c: | 4a09 ldr r2, [pc, #36] @ (80079b4 ) 800798e: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007992: | 4b09 ldr r3, [pc, #36] @ (80079b8 ) 8007994: | 9300 str r3, [sp, #0] 8007996: | 4809 ldr r0, [pc, #36] @ (80079bc ) 8007998: | f240 1385 movw r3, #389 @ 0x185 800799c: | f7f9 fcac bl 80012f8 <printf_> 80079a0: | be00 bkpt 0x0000 BGRT_SPIN_LOCK(sync); ret = sync->owner; 80079a2: \-> f8d4 3084 ldr.w r3, [r4, #132] @ 0x84 *pid = BGRT_PROC_TO_PID(proc); 80079a6: 602b str r3, [r5, #0] return BGRT_ST_OK; } 80079a8: 2000 movs r0, #0 80079aa: b003 add sp, #12 80079ac: bd30 pop {r4, r5, pc} 80079ae: bf00 nop 80079b0: 200001b0 .word 0x200001b0 80079b4: 0800c941 .word 0x0800c941 80079b8: 0800c95d .word 0x0800c95d 80079bc: 0800b232 .word 0x0800b232 080079c0 : return ret_val; } /*===========================================================================*/ /*Switch sublist head*/ void bgrt_xlist_switch(bgrt_xlist_t * xlist, bgrt_prio_t prio) { 80079c0: b573 push {r0, r1, r4, r5, r6, lr} 80079c2: 460d mov r5, r1 bgrt_item_t ** current; BGRT_ASSERT(xlist, "The #xlist must not be NULL!"); 80079c4: 4604 mov r4, r0 80079c6: /-- b958 cbnz r0, 80079e0 <bgrt_xlist_switch+0x20> 80079c8: | b672 cpsid i 80079ca: | 4b11 ldr r3, [pc, #68] @ (8007a10 ) 80079cc: | 4a11 ldr r2, [pc, #68] @ (8007a14 ) 80079ce: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 80079d2: | 4b11 ldr r3, [pc, #68] @ (8007a18 ) 80079d4: | 9300 str r3, [sp, #0] 80079d6: | 4811 ldr r0, [pc, #68] @ (8007a1c ) 80079d8: | 237d movs r3, #125 @ 0x7d 80079da: | f7f9 fc8d bl 80012f8 <printf_> 80079de: | be00 bkpt 0x0000 current = xlist->item + prio; 80079e0: \-> b22e sxth r6, r5 80079e2: eb04 0585 add.w r5, r4, r5, lsl #2 BGRT_ASSERT(current, "The #current must not be NULL!"); 80079e6: /-- b95d cbnz r5, 8007a00 <bgrt_xlist_switch+0x40> 80079e8: | b672 cpsid i 80079ea: | 4b09 ldr r3, [pc, #36] @ (8007a10 ) 80079ec: | 4a0c ldr r2, [pc, #48] @ (8007a20 ) 80079ee: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 80079f2: | 4b09 ldr r3, [pc, #36] @ (8007a18 ) 80079f4: | 9300 str r3, [sp, #0] 80079f6: | 4809 ldr r0, [pc, #36] @ (8007a1c ) 80079f8: | 2381 movs r3, #129 @ 0x81 80079fa: | f7f9 fc7d bl 80012f8 <printf_> 80079fe: | be00 bkpt 0x0000 *current = (*current)->next; 8007a00: \-> f854 3026 ldr.w r3, [r4, r6, lsl #2] 8007a04: 681b ldr r3, [r3, #0] 8007a06: f844 3026 str.w r3, [r4, r6, lsl #2] /* *current = (bgrt_item_t *)*(bgrt_item_t **)*(bgrt_item_t ***)current; */ } 8007a0a: b002 add sp, #8 8007a0c: bd70 pop {r4, r5, r6, pc} 8007a0e: bf00 nop 8007a10: 200001b0 .word 0x200001b0 8007a14: 0800c970 .word 0x0800c970 8007a18: 0800c98d .word 0x0800c98d 8007a1c: 0800b232 .word 0x0800b232 8007a20: 0800c9a1 .word 0x0800c9a1 08007a24 : *****************************************************************************************/ #include "bugurt.h" /* Инициация*/ /* ADLINT:SF:[W0422,W0256,W0165,W0114,W0268,W0705] Yes we drop some bits, and convert some types */ void bgrt_pitem_init(bgrt_pitem_t * pitem, bgrt_prio_t prio) { 8007a24: b573 push {r0, r1, r4, r5, r6, lr} 8007a26: 460d mov r5, r1 BGRT_ASSERT(pitem, "The #pitem must not be NULL!"); 8007a28: 4604 mov r4, r0 8007a2a: /-- b9b0 cbnz r0, 8007a5a <bgrt_pitem_init+0x36> 8007a2c: | b672 cpsid i 8007a2e: | 4e0e ldr r6, [pc, #56] @ (8007a68 ) 8007a30: | 4b0e ldr r3, [pc, #56] @ (8007a6c ) 8007a32: | f8d6 11ac ldr.w r1, [r6, #428] @ 0x1ac 8007a36: | 4a0e ldr r2, [pc, #56] @ (8007a70 ) 8007a38: | 9300 str r3, [sp, #0] 8007a3a: | 480e ldr r0, [pc, #56] @ (8007a74 ) 8007a3c: | 2354 movs r3, #84 @ 0x54 8007a3e: | f7f9 fc5b bl 80012f8 <printf_> 8007a42: | be00 bkpt 0x0000 /* ADLINT:SF:[W0422] Yes this code is unsafe!*/ /* bgrt_item_t methods. */ /* Initiation */ void bgrt_item_init(bgrt_item_t *item) { BGRT_ASSERT(item, "The #item must not be NULL!"); 8007a44: | b672 cpsid i 8007a46: | 4b0c ldr r3, [pc, #48] @ (8007a78 ) 8007a48: | f8d6 11ac ldr.w r1, [r6, #428] @ 0x1ac 8007a4c: | 4a0b ldr r2, [pc, #44] @ (8007a7c ) 8007a4e: | 9300 str r3, [sp, #0] 8007a50: | 4808 ldr r0, [pc, #32] @ (8007a74 ) 8007a52: | 2355 movs r3, #85 @ 0x55 8007a54: | f7f9 fc50 bl 80012f8 <printf_> 8007a58: | be00 bkpt 0x0000 bgrt_item_init((bgrt_item_t *)pitem); pitem->list = (bgrt_xlist_t *)0; /* ADLINT:SL:[W0567] Int to pointer*/ 8007a5a: \-> 2300 movs r3, #0 item->prev = item; item->next = item; 8007a5c: e9c4 4400 strd r4, r4, [r4] 8007a60: 60a3 str r3, [r4, #8] pitem->prio = prio; 8007a62: 7325 strb r5, [r4, #12] } 8007a64: b002 add sp, #8 8007a66: bd70 pop {r4, r5, r6, pc} 8007a68: 200001b0 .word 0x200001b0 8007a6c: 0800c9dd .word 0x0800c9dd 8007a70: 0800c9c0 .word 0x0800c9c0 8007a74: 0800b232 .word 0x0800b232 8007a78: 0800ca0d .word 0x0800ca0d 8007a7c: 0800c9f1 .word 0x0800c9f1 08007a80 : } pitem->list = xlist; } /* Fast cut*/ void bgrt_pitem_fast_cut(bgrt_pitem_t * pitem) { 8007a80: b573 push {r0, r1, r4, r5, r6, lr} bgrt_prio_t prio; bgrt_xlist_t * xlist; BGRT_ASSERT(pitem, "The #pitem must not be NULL!"); 8007a82: 4604 mov r4, r0 8007a84: /-- b958 cbnz r0, 8007a9e <bgrt_pitem_fast_cut+0x1e> 8007a86: | b672 cpsid i 8007a88: | 4b38 ldr r3, [pc, #224] @ (8007b6c ) 8007a8a: | 4a39 ldr r2, [pc, #228] @ (8007b70 ) 8007a8c: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007a90: | 4b38 ldr r3, [pc, #224] @ (8007b74 ) 8007a92: | 9300 str r3, [sp, #0] 8007a94: | 4838 ldr r0, [pc, #224] @ (8007b78 ) 8007a96: | 237b movs r3, #123 @ 0x7b 8007a98: | f7f9 fc2e bl 80012f8 <printf_> 8007a9c: | be00 bkpt 0x0000 BGRT_ASSERT(pitem->list, "The #pitem->list must not be NULL!"); 8007a9e: \-> 68a3 ldr r3, [r4, #8] 8007aa0: /-- b95b cbnz r3, 8007aba <bgrt_pitem_fast_cut+0x3a> 8007aa2: | b672 cpsid i 8007aa4: | 4b31 ldr r3, [pc, #196] @ (8007b6c ) 8007aa6: | 4a35 ldr r2, [pc, #212] @ (8007b7c ) 8007aa8: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007aac: | 4b31 ldr r3, [pc, #196] @ (8007b74 ) 8007aae: | 9300 str r3, [sp, #0] 8007ab0: | 4831 ldr r0, [pc, #196] @ (8007b78 ) 8007ab2: | 237c movs r3, #124 @ 0x7c 8007ab4: | f7f9 fc20 bl 80012f8 <printf_> 8007ab8: | be00 bkpt 0x0000 prio = pitem->prio; xlist = (bgrt_xlist_t *)pitem->list; /*Check for single element sublist*/ if (((bgrt_item_t *)pitem)->next == (bgrt_item_t *)pitem) 8007aba: \-> 6823 ldr r3, [r4, #0] prio = pitem->prio; 8007abc: 7b21 ldrb r1, [r4, #12] xlist = (bgrt_xlist_t *)pitem->list; 8007abe: 68a0 ldr r0, [r4, #8] if (((bgrt_item_t *)pitem)->next == (bgrt_item_t *)pitem) 8007ac0: 42a3 cmp r3, r4 8007ac2: /-- d10d bne.n 8007ae0 <bgrt_pitem_fast_cut+0x60> { /* Single element, delete sublist!*/ xlist->item[prio] = (bgrt_item_t *)0; /* ADLINT:SL:[W0567] Int to pointer*/ 8007ac4: | 2300 movs r3, #0 8007ac6: | f840 3021 str.w r3, [r0, r1, lsl #2] xlist->map &= ~(((bgrt_map_t)1)< b002 add sp, #8 8007ade: | | bd70 pop {r4, r5, r6, pc} if (xlist->item[(bgrt_prio_t)prio] == (bgrt_item_t *)pitem) 8007ae0: | \-> f850 3021 ldr.w r3, [r0, r1, lsl #2] 8007ae4: | 42a3 cmp r3, r4 8007ae6: | /-- d101 bne.n 8007aec <bgrt_pitem_fast_cut+0x6c> bgrt_xlist_switch(xlist, prio); 8007ae8: | | f7ff ff6a bl 80079c0 <bgrt_xlist_switch> { bgrt_item_t * prev; bgrt_item_t * next; BGRT_ASSERT(item, "The #item must not be NULL!"); BGRT_ASSERT(item->prev, "The #item->prev must not be NULL!"); 8007aec: | \-> 6863 ldr r3, [r4, #4] 8007aee: | /-- b95b cbnz r3, 8007b08 <bgrt_pitem_fast_cut+0x88> 8007af0: | | b672 cpsid i 8007af2: | | 4b1e ldr r3, [pc, #120] @ (8007b6c ) 8007af4: | | 4a22 ldr r2, [pc, #136] @ (8007b80 ) 8007af6: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007afa: | | 4b22 ldr r3, [pc, #136] @ (8007b84 ) 8007afc: | | 9300 str r3, [sp, #0] 8007afe: | | 481e ldr r0, [pc, #120] @ (8007b78 ) 8007b00: | | 2373 movs r3, #115 @ 0x73 8007b02: | | f7f9 fbf9 bl 80012f8 <printf_> 8007b06: | | be00 bkpt 0x0000 BGRT_ASSERT(item->next, "The #item->next must not be NULL!"); 8007b08: | \-> 6823 ldr r3, [r4, #0] 8007b0a: | /-- b95b cbnz r3, 8007b24 <bgrt_pitem_fast_cut+0xa4> 8007b0c: | | b672 cpsid i 8007b0e: | | 4b17 ldr r3, [pc, #92] @ (8007b6c ) 8007b10: | | 4a1d ldr r2, [pc, #116] @ (8007b88 ) 8007b12: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007b16: | | 4b1b ldr r3, [pc, #108] @ (8007b84 ) 8007b18: | | 9300 str r3, [sp, #0] 8007b1a: | | 4817 ldr r0, [pc, #92] @ (8007b78 ) 8007b1c: | | 2374 movs r3, #116 @ 0x74 8007b1e: | | f7f9 fbeb bl 80012f8 <printf_> 8007b22: | | be00 bkpt 0x0000 prev = item->prev; /*Previous item*/ next = item->next; /*Next item*/ 8007b24: | \-> e9d4 6500 ldrd r6, r5, [r4] BGRT_ASSERT(prev->next, "The #prev->next must not be NULL!"); 8007b28: | 682b ldr r3, [r5, #0] 8007b2a: | /-- b95b cbnz r3, 8007b44 <bgrt_pitem_fast_cut+0xc4> 8007b2c: | | b672 cpsid i 8007b2e: | | 4b0f ldr r3, [pc, #60] @ (8007b6c ) 8007b30: | | 4a16 ldr r2, [pc, #88] @ (8007b8c ) 8007b32: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007b36: | | 4b13 ldr r3, [pc, #76] @ (8007b84 ) 8007b38: | | 9300 str r3, [sp, #0] 8007b3a: | | 480f ldr r0, [pc, #60] @ (8007b78 ) 8007b3c: | | 2379 movs r3, #121 @ 0x79 8007b3e: | | f7f9 fbdb bl 80012f8 <printf_> 8007b42: | | be00 bkpt 0x0000 BGRT_ASSERT(next->prev, "The #next->prev must not be NULL!"); 8007b44: | \-> 6873 ldr r3, [r6, #4] 8007b46: | /-- b95b cbnz r3, 8007b60 <bgrt_pitem_fast_cut+0xe0> 8007b48: | | b672 cpsid i 8007b4a: | | 4b08 ldr r3, [pc, #32] @ (8007b6c ) 8007b4c: | | 4a10 ldr r2, [pc, #64] @ (8007b90 ) 8007b4e: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007b52: | | 4b0c ldr r3, [pc, #48] @ (8007b84 ) 8007b54: | | 9300 str r3, [sp, #0] 8007b56: | | 4808 ldr r0, [pc, #32] @ (8007b78 ) 8007b58: | | 237a movs r3, #122 @ 0x7a 8007b5a: | | f7f9 fbcd bl 80012f8 <printf_> 8007b5e: | | be00 bkpt 0x0000 next->prev = prev; 8007b60: | \-> 6075 str r5, [r6, #4] prev->next = next; 8007b62: | 602e str r6, [r5, #0] item->prev = item; item->next = item; 8007b64: | e9c4 4400 strd r4, r4, [r4] } 8007b68: \----- e7b8 b.n 8007adc <bgrt_pitem_fast_cut+0x5c> 8007b6a: bf00 nop 8007b6c: 200001b0 .word 0x200001b0 8007b70: 0800c9c0 .word 0x0800c9c0 8007b74: 0800c9dd .word 0x0800c9dd 8007b78: 0800b232 .word 0x0800b232 8007b7c: 0800ca20 .word 0x0800ca20 8007b80: 0800ca43 .word 0x0800ca43 8007b84: 0800ca0d .word 0x0800ca0d 8007b88: 0800ca65 .word 0x0800ca65 8007b8c: 0800ca87 .word 0x0800ca87 8007b90: 0800caa9 .word 0x0800caa9 08007b94 : /* Cut pitem from xlist*/ void bgrt_pitem_cut(bgrt_pitem_t * pitem) { 8007b94: b513 push {r0, r1, r4, lr} BGRT_ASSERT(pitem, "The #pitem must not be NULL!"); 8007b96: 4604 mov r4, r0 8007b98: /-- b958 cbnz r0, 8007bb2 <bgrt_pitem_cut+0x1e> 8007b9a: | b672 cpsid i 8007b9c: | 4b08 ldr r3, [pc, #32] @ (8007bc0 ) 8007b9e: | 4a09 ldr r2, [pc, #36] @ (8007bc4 ) 8007ba0: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007ba4: | 4b08 ldr r3, [pc, #32] @ (8007bc8 ) 8007ba6: | 9300 str r3, [sp, #0] 8007ba8: | 4808 ldr r0, [pc, #32] @ (8007bcc ) 8007baa: | 2397 movs r3, #151 @ 0x97 8007bac: | f7f9 fba4 bl 80012f8 <printf_> 8007bb0: | be00 bkpt 0x0000 bgrt_pitem_fast_cut(pitem); 8007bb2: \-> 4620 mov r0, r4 8007bb4: f7ff ff64 bl 8007a80 <bgrt_pitem_fast_cut> pitem->list = (bgrt_xlist_t *)0; /* ADLINT:SL:[W0567] Int to pointer*/ 8007bb8: 2300 movs r3, #0 8007bba: 60a3 str r3, [r4, #8] } 8007bbc: b002 add sp, #8 8007bbe: bd10 pop {r4, pc} 8007bc0: 200001b0 .word 0x200001b0 8007bc4: 0800c9c0 .word 0x0800c9c0 8007bc8: 0800c9dd .word 0x0800c9dd 8007bcc: 0800b232 .word 0x0800b232 08007bd0 : /* Decrement*/ bgrt_map_t bgrt_pcounter_dec(bgrt_pcounter_t * pcounter, bgrt_prio_t prio) 8007bd0: b537 push {r0, r1, r2, r4, r5, lr} 8007bd2: 460d mov r5, r1 { bgrt_map_t mask; BGRT_ASSERT(pcounter, "The #pcounter must not be NULL!"); 8007bd4: 4604 mov r4, r0 8007bd6: /-- b958 cbnz r0, 8007bf0 <bgrt_pcounter_dec.isra.0+0x20> 8007bd8: | b672 cpsid i 8007bda: | 4b0f ldr r3, [pc, #60] @ (8007c18 ) 8007bdc: | 4a0f ldr r2, [pc, #60] @ (8007c1c ) 8007bde: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007be2: | 4b0f ldr r3, [pc, #60] @ (8007c20 ) 8007be4: | 9300 str r3, [sp, #0] 8007be6: | 480f ldr r0, [pc, #60] @ (8007c24 ) 8007be8: | 23ad movs r3, #173 @ 0xad 8007bea: | f7f9 fb85 bl 80012f8 <printf_> 8007bee: | be00 bkpt 0x0000 mask = ((bgrt_map_t)1)<counter[prio]); /* ADLINT:SL:[W0705] Out of range access!*/ 8007bf0: \-> f854 3025 ldr.w r3, [r4, r5, lsl #2] if (val) 8007bf4: /----- b94b cbnz r3, 8007c0a <bgrt_pcounter_dec.isra.0+0x3a> if (pcounter->counter[prio] == (bgrt_cnt_t)0) /* ADLINT:SL:[W0705] Out of range access!*/ { pcounter->map &= ~mask; /* ADLINT:SL:[W0578] type conversions */ 8007bf6: /--|----> f8d4 3080 ldr.w r3, [r4, #128] @ 0x80 mask = ((bgrt_map_t)1)<map &= ~mask; /* ADLINT:SL:[W0578] type conversions */ 8007bfe: | | ea23 0302 bic.w r3, r3, r2 8007c02: | | f8c4 3080 str.w r3, [r4, #128] @ 0x80 } return pcounter->map & mask; /* ADLINT:SL:[W0272,W0301] */ } 8007c06: | | /-> b003 add sp, #12 8007c08: | | | bd30 pop {r4, r5, pc} return val - (bgrt_cnt_t)1; 8007c0a: | \--|-> 3b01 subs r3, #1 BGRT_CNT_DEC(pcounter->counter[prio]); /* ADLINT:SL:[W0705] Out of range access!*/ 8007c0c: | | f844 3025 str.w r3, [r4, r5, lsl #2] if (pcounter->counter[prio] == (bgrt_cnt_t)0) /* ADLINT:SL:[W0705] Out of range access!*/ 8007c10: | | 2b00 cmp r3, #0 8007c12: | \-- d1f8 bne.n 8007c06 <bgrt_pcounter_dec.isra.0+0x36> 8007c14: \-------- e7ef b.n 8007bf6 <bgrt_pcounter_dec.isra.0+0x26> 8007c16: bf00 nop 8007c18: 200001b0 .word 0x200001b0 8007c1c: 0800c90a .word 0x0800c90a 8007c20: 0800c92a .word 0x0800c92a 8007c24: 0800b232 .word 0x0800b232 08007c28 : USER **********************************************************************************************/ typedef bgrt_st_t (*bgrt_user_func_t)(bgrt_va_wr_t*); BGRT_SC_SR(USER, bgrt_va_wr_t* va)/* ADLINT:SL:[W0031] va is used!!!*/ { 8007c28: b507 push {r0, r1, r2, lr} bgrt_user_func_t func; bgrt_va_wr_t param; bgrt_st_t ret; va_copy(param.list, va->list); 8007c2a: 6803 ldr r3, [r0, #0] //func = (bgrt_user_func_t)va_arg(param.list, void (*)(void)); func = va_arg(param.list, bgrt_user_func_t); 8007c2c: 1d1a adds r2, r3, #4 8007c2e: 9201 str r2, [sp, #4] ret = (*func)(¶m); 8007c30: 681b ldr r3, [r3, #0] 8007c32: a801 add r0, sp, #4 8007c34: 4798 blx r3 va_end(param.list); return ret; } 8007c36: b003 add sp, #12 8007c38: f85d fb04 ldr.w pc, [sp], #4 08007c3c : { 8007c3c: b513 push {r0, r1, r4, lr} BGRT_ASSERT(xlist, "The #xlist must not be NULL!"); 8007c3e: 4604 mov r4, r0 8007c40: /-- b958 cbnz r0, 8007c5a <bgrt_xlist_head+0x1e> 8007c42: | b672 cpsid i 8007c44: | 4b0a ldr r3, [pc, #40] @ (8007c70 ) 8007c46: | 4a0b ldr r2, [pc, #44] @ (8007c74 ) 8007c48: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007c4c: | 4b0a ldr r3, [pc, #40] @ (8007c78 ) 8007c4e: | 9300 str r3, [sp, #0] 8007c50: | 480a ldr r0, [pc, #40] @ (8007c7c ) 8007c52: | 236d movs r3, #109 @ 0x6d 8007c54: | f7f9 fb50 bl 80012f8 <printf_> 8007c58: | be00 bkpt 0x0000 map = xlist->map; 8007c5a: \-> f8d4 0080 ldr.w r0, [r4, #128] @ 0x80 if (map != (bgrt_map_t)0) 8007c5e: /-- b128 cbz r0, 8007c6c <bgrt_xlist_head+0x30> prio++; mask<<=1; } return prio; #else return BGRT_CONFIG_USER_SEARCH(map); /*User defined search procedure*/ 8007c60: | fa90 f3a0 rbit r3, r0 8007c64: | fab3 f383 clz r3, r3 ret_val = xlist->item[ bgrt_map_search(map)]; /* ADLINT:SL:[W0705] OOR access*/ 8007c68: | f854 0023 ldr.w r0, [r4, r3, lsl #2] } 8007c6c: \-> b002 add sp, #8 8007c6e: bd10 pop {r4, pc} 8007c70: 200001b0 .word 0x200001b0 8007c74: 0800c970 .word 0x0800c970 8007c78: 0800c98d .word 0x0800c98d 8007c7c: 0800b232 .word 0x0800b232 08007c80 <_pctrl_proc_stoped>: { 8007c80: b513 push {r0, r1, r4, lr} BGRT_ASSERT(proc, "The #proc must not be NULL!"); 8007c82: 4604 mov r4, r0 8007c84: /-- b958 cbnz r0, 8007c9e <_pctrl_proc_stoped+0x1e> 8007c86: | b672 cpsid i 8007c88: | 4b0c ldr r3, [pc, #48] @ (8007cbc <_pctrl_proc_stoped+0x3c>) 8007c8a: | 4a0d ldr r2, [pc, #52] @ (8007cc0 <_pctrl_proc_stoped+0x40>) 8007c8c: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007c90: | 4b0c ldr r3, [pc, #48] @ (8007cc4 <_pctrl_proc_stoped+0x44>) 8007c92: | 9300 str r3, [sp, #0] 8007c94: | 480c ldr r0, [pc, #48] @ (8007cc8 <_pctrl_proc_stoped+0x48>) 8007c96: | 235e movs r3, #94 @ 0x5e 8007c98: | f7f9 fb2e bl 80012f8 <printf_> 8007c9c: | be00 bkpt 0x0000 if ((bgrt_map_t)0 != proc->lres.map) 8007c9e: \-> f8d4 3094 ldr.w r3, [r4, #148] @ 0x94 ((bgrt_pitem_t *)proc)->prio = (locker_prio < proc->base_prio)?locker_prio:proc->base_prio; 8007ca2: 7c62 ldrb r2, [r4, #17] if ((bgrt_map_t)0 != proc->lres.map) 8007ca4: /-- b133 cbz r3, 8007cb4 <_pctrl_proc_stoped+0x34> ((bgrt_pitem_t *)proc)->prio = (locker_prio < proc->base_prio)?locker_prio:proc->base_prio; 8007ca6: | fa93 f3a3 rbit r3, r3 8007caa: | fab3 f383 clz r3, r3 8007cae: | 429a cmp r2, r3 8007cb0: | bf28 it cs 8007cb2: | 461a movcs r2, r3 8007cb4: \-> 7322 strb r2, [r4, #12] } 8007cb6: b002 add sp, #8 8007cb8: bd10 pop {r4, pc} 8007cba: bf00 nop 8007cbc: 200001b0 .word 0x200001b0 8007cc0: 0800cacb .word 0x0800cacb 8007cc4: 0800c95d .word 0x0800c95d 8007cc8: 0800b232 .word 0x0800b232 08007ccc : { 8007ccc: b513 push {r0, r1, r4, lr} BGRT_ASSERT(sync, "The #sync must not be NULL!"); 8007cce: 4604 mov r4, r0 8007cd0: /-- b958 cbnz r0, 8007cea <bgrt_priv_sync_prio+0x1e> 8007cd2: | b672 cpsid i 8007cd4: | 4b0c ldr r3, [pc, #48] @ (8007d08 ) 8007cd6: | 4a0d ldr r2, [pc, #52] @ (8007d0c ) 8007cd8: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007cdc: | 4b0c ldr r3, [pc, #48] @ (8007d10 ) 8007cde: | 9300 str r3, [sp, #0] 8007ce0: | 480c ldr r0, [pc, #48] @ (8007d14 ) 8007ce2: | 2381 movs r3, #129 @ 0x81 8007ce4: | f7f9 fb08 bl 80012f8 <printf_> 8007ce8: | be00 bkpt 0x0000 if ((((bgrt_xlist_t *)sync)->map)) 8007cea: \-> f8d4 3080 ldr.w r3, [r4, #128] @ 0x80 sprio = sync->prio; 8007cee: f894 0094 ldrb.w r0, [r4, #148] @ 0x94 if ((((bgrt_xlist_t *)sync)->map)) 8007cf2: /-- b133 cbz r3, 8007d02 <bgrt_priv_sync_prio+0x36> return (wprio < sprio)?wprio:sprio; /* ADLINT:SL:[W0256,W0268] signed/unsigned*/ 8007cf4: | fa93 f3a3 rbit r3, r3 8007cf8: | fab3 f383 clz r3, r3 8007cfc: | 4298 cmp r0, r3 8007cfe: | bf28 it cs 8007d00: | 4618 movcs r0, r3 } 8007d02: \-> b002 add sp, #8 8007d04: bd10 pop {r4, pc} 8007d06: bf00 nop 8007d08: 200001b0 .word 0x200001b0 8007d0c: 0800c941 .word 0x0800c941 8007d10: 0800c95d .word 0x0800c95d 8007d14: 0800b232 .word 0x0800b232 08007d18 : { 8007d18: b082 sub sp, #8 8007d1a: f88d 0007 strb.w r0, [sp, #7] BGRT_INT_LOCK(); 8007d1e: f04f 00f0 mov.w r0, #240 @ 0xf0 8007d22: f380 8811 msr BASEPRI, r0 8007d26: f3bf 8f4f dsb sy 8007d2a: f3bf 8f6f isb sy return BGRT_CURR_PROC; 8007d2e: 4b15 ldr r3, [pc, #84] @ (8007d84 ) udata->scnum = num; 8007d30: f89d 0007 ldrb.w r0, [sp, #7] return BGRT_CURR_PROC; 8007d34: f8d3 2090 ldr.w r2, [r3, #144] @ 0x90 udata->scnum = num; 8007d38: b2c0 uxtb r0, r0 8007d3a: f882 00c4 strb.w r0, [r2, #196] @ 0xc4 udata->scarg = arg; 8007d3e: f8c2 10c0 str.w r1, [r2, #192] @ 0xc0 BGRT_ATM_BSET_ISR(&BGRT_KBLOCK.lpmap, BGRT_KBLOCK_VSCALL); 8007d42: 338c adds r3, #140 @ 0x8c 8007d44: f3bf 8f5b dmb ish 8007d48: /-> e853 0f00 ldrex r0, [r3] 8007d4c: | f040 0001 orr.w r0, r0, #1 8007d50: | e843 0100 strex r1, r0, [r3] 8007d54: | 2900 cmp r1, #0 8007d56: \-- d1f7 bne.n 8007d48 <bgrt_syscall+0x30> 8007d58: f3bf 8f5b dmb ish BGRT_SYS_ICSR |= BGRT_PENDSV_SET; 8007d5c: f04f 21e0 mov.w r1, #3758153728 @ 0xe000e000 8007d60: f8d1 3d04 ldr.w r3, [r1, #3332] @ 0xd04 8007d64: f043 5380 orr.w r3, r3, #268435456 @ 0x10000000 8007d68: f8c1 3d04 str.w r3, [r1, #3332] @ 0xd04 BGRT_INT_FREE(); 8007d6c: f04f 0000 mov.w r0, #0 8007d70: f380 8811 msr BASEPRI, r0 8007d74: f3bf 8f4f dsb sy 8007d78: f3bf 8f6f isb sy } 8007d7c: f892 00c5 ldrb.w r0, [r2, #197] @ 0xc5 8007d80: b002 add sp, #8 8007d82: 4770 bx lr 8007d84: 200001b0 .word 0x200001b0 08007d88 : PROC_TERMINATE **********************************************************************************************/ /*Terminate a process after pmain return.*/ void bgrt_proc_terminate(void) { BGRT_SYSCALL_N(PROC_TERMINATE, (void *)0); /* ADLINT:SL:[W0567,W1059,W1073] conversion*/ 8007d88: 2100 movs r1, #0 8007d8a: 2004 movs r0, #4 8007d8c: e7c4 b.n 8007d18 <bgrt_syscall> 08007d8e : return (BGRT_SC_TBL_READ(syscall_handler[syscall_num]))(syscall_arg); /* ADLINT:SL:[W0147,W0644] type conversion,void val */ } } /*Variadic version of bgrt_syscall*/ bgrt_st_t bgrt_syscall_var(bgrt_syscall_t num, ...) { 8007d8e: b40f push {r0, r1, r2, r3} 8007d90: b507 push {r0, r1, r2, lr} bgrt_va_wr_t varg; bgrt_st_t ret; va_start(varg.list, num); /* ADLINT:SL:[W0459,W0085] */ 8007d92: ab05 add r3, sp, #20 ret = bgrt_syscall(num, (void *)&varg); /* ADLINT:SL:[W0459,W0085] */ 8007d94: f89d 0010 ldrb.w r0, [sp, #16] va_start(varg.list, num); /* ADLINT:SL:[W0459,W0085] */ 8007d98: 9301 str r3, [sp, #4] ret = bgrt_syscall(num, (void *)&varg); /* ADLINT:SL:[W0459,W0085] */ 8007d9a: a901 add r1, sp, #4 8007d9c: f7ff ffbc bl 8007d18 <bgrt_syscall> va_end(varg.list); /* ADLINT:SL:[W0085] no side effect*/ return ret; } 8007da0: b003 add sp, #12 8007da2: f85d eb04 ldr.w lr, [sp], #4 8007da6: b004 add sp, #16 8007da8: 4770 bx lr 08007daa : return ret; } bgrt_st_t bgrt_sem_lock(bgrt_sem_t * sem) { 8007daa: b51f push {r0, r1, r2, r3, r4, lr} volatile bgrt_flag_t touch = 0; 8007dac: 2300 movs r3, #0 8007dae: f88d 300f strb.w r3, [sp, #15] volatile bgrt_flag_t state = 0; if (!sem) 8007db2: 4602 mov r2, r0 volatile bgrt_flag_t state = 0; 8007db4: f88d 300e strb.w r3, [sp, #14] if (!sem) 8007db8: /----- b158 cbz r0, 8007dd2 <bgrt_sem_lock+0x28> { return BGRT_ST_ENULL; } else { return BGRT_SYSCALL_NVAR(USER, _sem_lock_fsm, (void *)sem, (void *)&touch, (void *)&state); 8007dba: | f10d 030e add.w r3, sp, #14 8007dbe: | 9300 str r3, [sp, #0] 8007dc0: | 4905 ldr r1, [pc, #20] @ (8007dd8 ) 8007dc2: | f10d 030f add.w r3, sp, #15 8007dc6: | 2014 movs r0, #20 8007dc8: | f7ff ffe1 bl 8007d8e <bgrt_syscall_var> } } 8007dcc: | /-> b005 add sp, #20 8007dce: | | f85d fb04 ldr.w pc, [sp], #4 return BGRT_ST_ENULL; 8007dd2: \--|-> 2001 movs r0, #1 8007dd4: \-- e7fa b.n 8007dcc <bgrt_sem_lock+0x22> 8007dd6: bf00 nop 8007dd8: 08008e9d .word 0x08008e9d 08007ddc : BGRT_RESCHED_PROC(proc); } /*====================================================================================*/ /* Cut a process from ready or expired list, update load information.*/ void bgrt_sched_proc_stop(bgrt_proc_t * proc , bgrt_flag_t state) { 8007ddc: b537 push {r0, r1, r2, r4, r5, lr} 8007dde: 460d mov r5, r1 xlist_lock = &bgrt_kernel.sched[proc->core_id].lock; /* ADLINT:SL:[W0705] out of range*/ bgrt_spin_lock(xlist_lock); #endif /*BGRT_CONFIG_MP*/ BGRT_ASSERT(proc, "The #proc must not be NULL!"); 8007de0: 4604 mov r4, r0 8007de2: /-- b960 cbnz r0, 8007dfe <bgrt_sched_proc_stop+0x22> 8007de4: | b672 cpsid i 8007de6: | 4b0d ldr r3, [pc, #52] @ (8007e1c ) 8007de8: | 4a0d ldr r2, [pc, #52] @ (8007e20 ) 8007dea: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007dee: | 4b0d ldr r3, [pc, #52] @ (8007e24 ) 8007df0: | 9300 str r3, [sp, #0] 8007df2: | 480d ldr r0, [pc, #52] @ (8007e28 ) 8007df4: | f44f 7381 mov.w r3, #258 @ 0x102 8007df8: | f7f9 fa7e bl 80012f8 <printf_> 8007dfc: | be00 bkpt 0x0000 BGRT_PROC_SET_STATE(proc, state); /* ADLINT:SL:[W0447] coma operator*/ 8007dfe: \-> 7c23 ldrb r3, [r4, #16] 8007e00: f023 030f bic.w r3, r3, #15 8007e04: 431d orrs r5, r3 bgrt_pitem_cut((bgrt_pitem_t *)proc); 8007e06: 4620 mov r0, r4 BGRT_PROC_SET_STATE(proc, state); /* ADLINT:SL:[W0447] coma operator*/ 8007e08: 7425 strb r5, [r4, #16] bgrt_pitem_cut((bgrt_pitem_t *)proc); 8007e0a: f7ff fec3 bl 8007b94 <bgrt_pitem_cut> bgrt_atm_bset(&BGRT_KBLOCK.lpmap, BGRT_KBLOCK_VRESCH); 8007e0e: 4807 ldr r0, [pc, #28] @ (8007e2c ) 8007e10: 2104 movs r1, #4 #ifdef BGRT_CONFIG_MP bgrt_spin_free(xlist_lock); #endif /*BGRT_CONFIG_MP*/ BGRT_RESCHED_PROC(proc); } 8007e12: b003 add sp, #12 8007e14: e8bd 4030 ldmia.w sp!, {r4, r5, lr} 8007e18: f7f9 ba32 b.w 8001280 <bgrt_atm_bset.lto_priv.0.lto_priv.0> 8007e1c: 200001b0 .word 0x200001b0 8007e20: 0800cacb .word 0x0800cacb 8007e24: 0800cae7 .word 0x0800cae7 8007e28: 0800b232 .word 0x0800b232 8007e2c: 2000023c .word 0x2000023c 08007e30 : { 8007e30: b537 push {r0, r1, r2, r4, r5, lr} 8007e32: 460d mov r5, r1 BGRT_ASSERT(proc, "The #proc must not be NULL!"); 8007e34: 4604 mov r4, r0 8007e36: /-- b958 cbnz r0, 8007e50 <bgrt_priv_proc_stop_ensure+0x20> 8007e38: | b672 cpsid i 8007e3a: | 4b0b ldr r3, [pc, #44] @ (8007e68 ) 8007e3c: | 4a0b ldr r2, [pc, #44] @ (8007e6c ) 8007e3e: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007e42: | 4b0b ldr r3, [pc, #44] @ (8007e70 ) 8007e44: | 9300 str r3, [sp, #0] 8007e46: | 480b ldr r0, [pc, #44] @ (8007e74 ) 8007e48: | 2357 movs r3, #87 @ 0x57 8007e4a: | f7f9 fa55 bl 80012f8 <printf_> 8007e4e: | be00 bkpt 0x0000 if (BGRT_PROC_RUN_TEST(proc)) 8007e50: \-> 7c23 ldrb r3, [r4, #16] 8007e52: 079b lsls r3, r3, #30 8007e54: /-- d505 bpl.n 8007e62 <bgrt_priv_proc_stop_ensure+0x32> bgrt_sched_proc_stop(proc, state); 8007e56: | 4629 mov r1, r5 8007e58: | 4620 mov r0, r4 } 8007e5a: | b003 add sp, #12 8007e5c: | e8bd 4030 ldmia.w sp!, {r4, r5, lr} bgrt_sched_proc_stop(proc, state); 8007e60: | e7bc b.n 8007ddc <bgrt_sched_proc_stop> } 8007e62: \-> b003 add sp, #12 8007e64: bd30 pop {r4, r5, pc} 8007e66: bf00 nop 8007e68: 200001b0 .word 0x200001b0 8007e6c: 0800cacb .word 0x0800cacb 8007e70: 0800cafb .word 0x0800cafb 8007e74: 0800b232 .word 0x0800b232 08007e78 : return BGRT_CURR_PROC; 8007e78: 4b0f ldr r3, [pc, #60] @ (8007eb8 ) { 8007e7a: b510 push {r4, lr} 8007e7c: f8d3 4090 ldr.w r4, [r3, #144] @ 0x90 BGRT_CNT_DEC(proc->cnt_lock); 8007e80: f8d4 30a4 ldr.w r3, [r4, #164] @ 0xa4 if (val) 8007e84: /-------- b98b cbnz r3, 8007eaa <bgrt_priv_proc_free+0x32> proc->flags &= ~BGRT_PROC_FLG_LOCK; 8007e86: /--|-------> 7c23 ldrb r3, [r4, #16] 8007e88: | | f023 0320 bic.w r3, r3, #32 8007e8c: | | 7423 strb r3, [r4, #16] if (BGRT_PROC_PRE_STOP_TEST(proc)) /* ADLINT:SL:[W0734,W0559,W0432] Operators in macro*/ 8007e8e: | | /----> 7c23 ldrb r3, [r4, #16] 8007e90: | | | f003 0330 and.w r3, r3, #48 @ 0x30 8007e94: | | | 2b10 cmp r3, #16 8007e96: | | | /-- d107 bne.n 8007ea8 <bgrt_priv_proc_free+0x30> bgrt_priv_proc_stop_ensure(proc, BGRT_PROC_STATE_STOPED); 8007e98: | | | | 2100 movs r1, #0 8007e9a: | | | | 4620 mov r0, r4 8007e9c: | | | | f7ff ffc8 bl 8007e30 <bgrt_priv_proc_stop_ensure> proc->flags &= ~BGRT_PROC_FLG_PRE_STOP; 8007ea0: | | | | 7c23 ldrb r3, [r4, #16] 8007ea2: | | | | f023 0310 bic.w r3, r3, #16 8007ea6: | | | | 7423 strb r3, [r4, #16] } 8007ea8: | | | \-> bd10 pop {r4, pc} return val - (bgrt_cnt_t)1; 8007eaa: | \--|----> 3b01 subs r3, #1 BGRT_CNT_DEC(proc->cnt_lock); 8007eac: | | f8c4 30a4 str.w r3, [r4, #164] @ 0xa4 if (((bgrt_cnt_t)0) == proc->cnt_lock) 8007eb0: | | 2b00 cmp r3, #0 8007eb2: | \----- d1ec bne.n 8007e8e <bgrt_priv_proc_free+0x16> 8007eb4: \----------- e7e7 b.n 8007e86 <bgrt_priv_proc_free+0xe> 8007eb6: bf00 nop 8007eb8: 200001b0 .word 0x200001b0 08007ebc : { 8007ebc: b508 push {r3, lr} bgrt_priv_proc_free(); 8007ebe: f7ff ffdb bl 8007e78 <bgrt_priv_proc_free> } 8007ec2: 2000 movs r0, #0 8007ec4: bd08 pop {r3, pc} 08007ec6 : { 8007ec6: b510 push {r4, lr} if (!proc) 8007ec8: /-- b910 cbnz r0, 8007ed0 <BGRT_SC_PROC_STOP_SR+0xa> 8007eca: | 4b08 ldr r3, [pc, #32] @ (8007eec ) 8007ecc: | f8d3 0090 ldr.w r0, [r3, #144] @ 0x90 if (proc->flags & (BGRT_PROC_FLG_LOCK_MASK|BGRT_PROC_FLG_PRE_STOP|BGRT_PROC_STATE_WAIT_MASK)) 8007ed0: \-> 7c03 ldrb r3, [r0, #16] 8007ed2: f013 0438 ands.w r4, r3, #56 @ 0x38 8007ed6: /----- d005 beq.n 8007ee4 <BGRT_SC_PROC_STOP_SR+0x1e> proc->flags |= BGRT_PROC_FLG_PRE_STOP; 8007ed8: | f043 0310 orr.w r3, r3, #16 8007edc: | 7403 strb r3, [r0, #16] bgrt_st_t ret = BGRT_ST_EAGAIN; 8007ede: | 2407 movs r4, #7 } 8007ee0: | /-> 4620 mov r0, r4 8007ee2: | | bd10 pop {r4, pc} bgrt_priv_proc_stop_ensure(proc, BGRT_PROC_STATE_STOPED); 8007ee4: \--|-> 4621 mov r1, r4 8007ee6: | f7ff ffa3 bl 8007e30 <bgrt_priv_proc_stop_ensure> ret = BGRT_ST_OK; /* ADLINT:SL:[W0085] Side effects*/ 8007eea: \-- e7f9 b.n 8007ee0 <BGRT_SC_PROC_STOP_SR+0x1a> 8007eec: 200001b0 .word 0x200001b0 08007ef0 : { 8007ef0: b508 push {r3, lr} bgrt_priv_proc_stop_ensure(proc, BGRT_PROC_STATE_STOPED); 8007ef2: 4b04 ldr r3, [pc, #16] @ (8007f04 ) 8007ef4: 2100 movs r1, #0 8007ef6: f8d3 0090 ldr.w r0, [r3, #144] @ 0x90 8007efa: f7ff ff99 bl 8007e30 <bgrt_priv_proc_stop_ensure> } 8007efe: 2000 movs r0, #0 8007f00: bd08 pop {r3, pc} 8007f02: bf00 nop 8007f04: 200001b0 .word 0x200001b0 08007f08 : 8007f08: 4b09 ldr r3, [pc, #36] @ (8007f30 ) { 8007f0a: b510 push {r4, lr} 8007f0c: f8d3 4090 ldr.w r4, [r3, #144] @ 0x90 bgrt_priv_proc_stop_ensure(proc, BGRT_PROC_STATE_STOPED); 8007f10: 2100 movs r1, #0 8007f12: 4620 mov r0, r4 8007f14: f7ff ff8c bl 8007e30 <bgrt_priv_proc_stop_ensure> if (proc->flags & BGRT_PROC_FLG_LOCK_MASK) 8007f18: 7c23 ldrb r3, [r4, #16] 8007f1a: 069a lsls r2, r3, #26 proc->flags |= BGRT_PROC_STATE_DEAD; 8007f1c: bf4c ite mi 8007f1e: f043 0305 orrmi.w r3, r3, #5 proc->flags |= BGRT_PROC_STATE_END; 8007f22: f043 0301 orrpl.w r3, r3, #1 proc->flags &= ~BGRT_PROC_FLG_PRE_STOP; 8007f26: f023 0310 bic.w r3, r3, #16 8007f2a: 7423 strb r3, [r4, #16] } 8007f2c: 2000 movs r0, #0 8007f2e: bd10 pop {r4, pc} 8007f30: 200001b0 .word 0x200001b0 08007f34 <_sync_owner_block>: } return BGRT_ST_ROLL; } /*====================================================================================*/ static void _sync_owner_block(bgrt_proc_t * owner) { 8007f34: b513 push {r0, r1, r4, lr} BGRT_ASSERT(owner, "The #owner must not be NULL!"); 8007f36: 4604 mov r4, r0 8007f38: /-- b960 cbnz r0, 8007f54 <_sync_owner_block+0x20> 8007f3a: | b672 cpsid i 8007f3c: | 4b0a ldr r3, [pc, #40] @ (8007f68 <_sync_owner_block+0x34>) 8007f3e: | 4a0b ldr r2, [pc, #44] @ (8007f6c <_sync_owner_block+0x38>) 8007f40: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8007f44: | 4b0a ldr r3, [pc, #40] @ (8007f70 <_sync_owner_block+0x3c>) 8007f46: | 9300 str r3, [sp, #0] 8007f48: | 480a ldr r0, [pc, #40] @ (8007f74 <_sync_owner_block+0x40>) 8007f4a: | f240 23c1 movw r3, #705 @ 0x2c1 8007f4e: | f7f9 f9d3 bl 80012f8 <printf_> 8007f52: | be00 bkpt 0x0000 BGRT_SPIN_LOCK(owner); owner->sync = (bgrt_sync_t *)0; /* ADLINT:SL:[W0567] int to pinter*/ 8007f54: \-> 2300 movs r3, #0 bgrt_priv_proc_stop_ensure(owner, BGRT_PROC_STATE_SYNC_SLEEP); 8007f56: 2109 movs r1, #9 8007f58: 4620 mov r0, r4 owner->sync = (bgrt_sync_t *)0; /* ADLINT:SL:[W0567] int to pinter*/ 8007f5a: f8c4 30a0 str.w r3, [r4, #160] @ 0xa0 BGRT_SPIN_FREE(owner); } 8007f5e: b002 add sp, #8 8007f60: e8bd 4010 ldmia.w sp!, {r4, lr} bgrt_priv_proc_stop_ensure(owner, BGRT_PROC_STATE_SYNC_SLEEP); 8007f64: e764 b.n 8007e30 <bgrt_priv_proc_stop_ensure> 8007f66: bf00 nop 8007f68: 200001b0 .word 0x200001b0 8007f6c: 0800cb0e .word 0x0800cb0e 8007f70: 0800c95d .word 0x0800c95d 8007f74: 0800b232 .word 0x0800b232 08007f78 : { 8007f78: e92d 41f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, lr} va_copy(param, va->list); 8007f7c: 6803 ldr r3, [r0, #0] sync = (bgrt_sync_t *)va_arg(param, void *); 8007f7e: 1d1a adds r2, r3, #4 8007f80: 9201 str r2, [sp, #4] pid = (BGRT_PID_T *)va_arg(param, void *); 8007f82: e9d3 5600 ldrd r5, r6, [r3] block = (bgrt_flag_t )va_arg(param, int ); 8007f86: f8d3 8008 ldr.w r8, [r3, #8] if (!pid) 8007f8a: /-------------------------------- b3a6 cbz r6, 8007ff6 <BGRT_SC_SYNC_WAIT_SR+0x7e> proc = BGRT_PID_TO_PROC(*pid); 8007f8c: | 6834 ldr r4, [r6, #0] bgrt_proc_t * owner; bgrt_st_t status; BGRT_ASSERT(proc, "The #proc must not be NULL!"); bgrt_priv_proc_reset_watchdog(); 8007f8e: | f7ff fc0d bl 80077ac <bgrt_priv_proc_reset_watchdog> if (!sync) 8007f92: | /----------------------------- b355 cbz r5, 8007fea <BGRT_SC_SYNC_WAIT_SR+0x72> 8007f94: | | 4b1f ldr r3, [pc, #124] @ (8008014 ) 8007f96: | | f8d3 2090 ldr.w r2, [r3, #144] @ 0x90 } current = bgrt_curr_proc(); BGRT_SPIN_LOCK(current); if (BGRT_PROC_STATE_TO_RUNNING == BGRT_PROC_GET_STATE(current)) 8007f9a: | | 7c13 ldrb r3, [r2, #16] 8007f9c: | | f003 010f and.w r1, r3, #15 8007fa0: | | 2907 cmp r1, #7 8007fa2: | | /-- d109 bne.n 8007fb8 <BGRT_SC_SYNC_WAIT_SR+0x40> { BGRT_PROC_SET_STATE(current, BGRT_PROC_STATE_RUNNING); /* ADLINT:SL:[W0447] coma operator*/ 8007fa4: | | | f023 030f bic.w r3, r3, #15 8007fa8: | | | f043 0303 orr.w r3, r3, #3 8007fac: | | | 7413 strb r3, [r2, #16] BGRT_SPIN_FREE(current); return BGRT_ST_ETIMEOUT; 8007fae: | | | 2005 movs r0, #5 *pid = BGRT_PROC_TO_PID(proc); 8007fb0: | | /-----------------|-> 6034 str r4, [r6, #0] } 8007fb2: | | /--|-----------------|-> b002 add sp, #8 8007fb4: | | | | | e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} { BGRT_SPIN_FREE(current); } BGRT_SPIN_LOCK(sync); owner = sync->owner; 8007fb8: | | | | \-> f8d5 7084 ldr.w r7, [r5, #132] @ 0x84 if (owner != current) 8007fbc: | | | | 4297 cmp r7, r2 8007fbe: | | | | /----------------- d116 bne.n 8007fee <BGRT_SC_SYNC_WAIT_SR+0x76> { BGRT_SPIN_FREE(sync); return BGRT_ST_EOWN; } if (sync->dirty) 8007fc0: | | | | | f8d5 3088 ldr.w r3, [r5, #136] @ 0x88 8007fc4: | | | | | /----- b123 cbz r3, 8007fd0 <BGRT_SC_SYNC_WAIT_SR+0x58> { _sync_owner_block(owner); 8007fc6: | | | | | | 4638 mov r0, r7 8007fc8: | | | | | | f7ff ffb4 bl 8007f34 <_sync_owner_block> BGRT_SPIN_FREE(sync); return BGRT_ST_ROLL; 8007fcc: | | /--|--|--|-----------|----> 2009 movs r0, #9 8007fce: | | | | +--|-----------|----- e7ef b.n 8007fb0 <BGRT_SC_SYNC_WAIT_SR+0x38> } if (!*proc) 8007fd0: | | | | | | \--/-X b91c cbnz r4, 8007fda <BGRT_SC_SYNC_WAIT_SR+0x62> { *proc = (bgrt_proc_t *)bgrt_xlist_head(((bgrt_xlist_t *)sync)); 8007fd2: | | | | | | | 4628 mov r0, r5 8007fd4: | | | | | | | f7ff fe32 bl 8007c3c <bgrt_xlist_head> 8007fd8: | | | | | | | 4604 mov r4, r0 } status = (block)?BGRT_ST_ROLL:BGRT_ST_EEMPTY; 8007fda: | | | | | | \-> fa5f f388 uxtb.w r3, r8 8007fde: | | | | | | /----------- b963 cbnz r3, 8007ffa <BGRT_SC_SYNC_WAIT_SR+0x82> if (*proc) 8007fe0: | | | | | | | /-- b90c cbnz r4, 8007fe6 <BGRT_SC_SYNC_WAIT_SR+0x6e> 8007fe2: | | | | | | /--|--------|-> 2003 movs r0, #3 8007fe4: | | | | +--|--|--|--------|-- e7e4 b.n 8007fb0 <BGRT_SC_SYNC_WAIT_SR+0x38> status = (block)?BGRT_ST_ROLL:BGRT_ST_EEMPTY; 8007fe6: | | | | | | | | \-> 2303 movs r3, #3 8007fe8: | | | | | | | | /-------- e009 b.n 8007ffe <BGRT_SC_SYNC_WAIT_SR+0x86> return BGRT_ST_ENULL; 8007fea: | \--|--|--|--|--|--|--|-------> 2001 movs r0, #1 8007fec: | | | +--|--|--|--|-------- e7e0 b.n 8007fb0 <BGRT_SC_SYNC_WAIT_SR+0x38> return BGRT_ST_EOWN; 8007fee: | | | | \--|--|--|-------> 2002 movs r0, #2 8007ff0: | | | +-----|--|--|-------- e7de b.n 8007fb0 <BGRT_SC_SYNC_WAIT_SR+0x38> { BGRT_SPIN_LOCK((*proc)); if ((*proc)->sync == sync) { status = BGRT_ST_OK; 8007ff2: | | | | | | | /----> 2000 movs r0, #0 8007ff4: | | | \-----|--|--|--|----- e7dc b.n 8007fb0 <BGRT_SC_SYNC_WAIT_SR+0x38> return BGRT_ST_ENULL; 8007ff6: \-----|--|--------|--|--|--|----> 2001 movs r0, #1 8007ff8: | \--------|--|--|--|----- e7db b.n 8007fb2 <BGRT_SC_SYNC_WAIT_SR+0x3a> if (*proc) 8007ffa: | | \--|--|--/-X b134 cbz r4, 800800a <BGRT_SC_SYNC_WAIT_SR+0x92> status = (block)?BGRT_ST_ROLL:BGRT_ST_EEMPTY; 8007ffc: | | | | | 2309 movs r3, #9 if ((*proc)->sync == sync) 8007ffe: | | \--|--|-> f8d4 20a0 ldr.w r2, [r4, #160] @ 0xa0 8008002: | | | | 4295 cmp r5, r2 8008004: | | \--|-- d0f5 beq.n 8007ff2 <BGRT_SC_SYNC_WAIT_SR+0x7a> } BGRT_SPIN_FREE((*proc)); }/*else BGRT_ST_ROLL/BGRT_ST_EEMPTY*/ if (status == BGRT_ST_ROLL) 8008006: | | | 2b09 cmp r3, #9 8008008: | \-----------|-- d1eb bne.n 8007fe2 <BGRT_SC_SYNC_WAIT_SR+0x6a> { BGRT_SPIN_LOCK(owner); bgrt_priv_proc_stop_ensure(owner, BGRT_PROC_STATE_SYNC_WAIT); 800800a: | \-> 2108 movs r1, #8 800800c: | 4638 mov r0, r7 800800e: | f7ff ff0f bl 8007e30 <bgrt_priv_proc_stop_ensure> 8008012: \-------------------------- e7db b.n 8007fcc <BGRT_SC_SYNC_WAIT_SR+0x54> 8008014: 200001b0 .word 0x200001b0 08008018 : { 8008018: b508 push {r3, lr} bgrt_kernel.timer.val++; 800801a: 4b0b ldr r3, [pc, #44] @ (8008048 ) 800801c: f8d3 21ac ldr.w r2, [r3, #428] @ 0x1ac 8008020: 3201 adds r2, #1 8008022: f8c3 21ac str.w r2, [r3, #428] @ 0x1ac if (bgrt_kernel.timer.tick != (void (*)(void))0)bgrt_kernel.timer.tick(); 8008026: f8d3 31a8 ldr.w r3, [r3, #424] @ 0x1a8 800802a: /-- b103 cbz r3, 800802e <sys_tick_handler+0x16> 800802c: | 4798 blx r3 bgrt_atm_bset(&BGRT_KBLOCK.lpmap, BGRT_KBLOCK_VTMR); 800802e: \-> 4807 ldr r0, [pc, #28] @ (800804c ) 8008030: 2102 movs r1, #2 8008032: f7f9 f925 bl 8001280 <bgrt_atm_bset.lto_priv.0.lto_priv.0> BGRT_ISR_END(); 8008036: f04f 22e0 mov.w r2, #3758153728 @ 0xe000e000 800803a: f8d2 3d04 ldr.w r3, [r2, #3332] @ 0xd04 800803e: f043 5380 orr.w r3, r3, #268435456 @ 0x10000000 8008042: f8c2 3d04 str.w r3, [r2, #3332] @ 0xd04 } 8008046: bd08 pop {r3, pc} 8008048: 200001b0 .word 0x200001b0 800804c: 2000023c .word 0x2000023c 08008050 : if ((~addr == IPADDR_ANY) || 8008050: 1e43 subs r3, r0, #1 8008052: 3303 adds r3, #3 { 8008054: 4602 mov r2, r0 if ((~addr == IPADDR_ANY) || 8008056: /-------- d812 bhi.n 800807e <ip4_addr_isbroadcast_u32+0x2e> } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) { 8008058: | f891 3035 ldrb.w r3, [r1, #53] @ 0x35 800805c: | f013 0002 ands.w r0, r3, #2 8008060: | /----- d010 beq.n 8008084 <ip4_addr_isbroadcast_u32+0x34> } else if (addr == ip4_addr_get_u32(netif_ip4_addr(netif))) { 8008062: | | 680b ldr r3, [r1, #0] 8008064: | | 429a cmp r2, r3 8008066: | | /-- d00c beq.n 8008082 <ip4_addr_isbroadcast_u32+0x32> } else if (ip4_addr_net_eq(&ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif)) 8008068: | | | 6849 ldr r1, [r1, #4] 800806a: | | | 4053 eors r3, r2 800806c: | | | 420b tst r3, r1 800806e: | | +-- d108 bne.n 8008082 <ip4_addr_isbroadcast_u32+0x32> && ((addr & ~ip4_addr_get_u32(netif_ip4_netmask(netif))) == 8008070: | | | 43cb mvns r3, r1 8008072: | | | ea22 0201 bic.w r2, r2, r1 8008076: | | | 1ad3 subs r3, r2, r3 8008078: | | | 4258 negs r0, r3 800807a: | | | 4158 adcs r0, r3 800807c: | | | 4770 bx lr return 1; 800807e: \--|--|-> 2001 movs r0, #1 8008080: | | 4770 bx lr return 0; 8008082: | \-> 2000 movs r0, #0 } 8008084: \----> 4770 bx lr 08008086 : { 8008086: b510 push {r4, lr} if (msg->msg.common.errtfunc != NULL) { 8008088: 68c4 ldr r4, [r0, #12] { 800808a: 4603 mov r3, r0 return msg->msg.common.errtfunc(msg->netif); 800808c: 6840 ldr r0, [r0, #4] if (msg->msg.common.errtfunc != NULL) { 800808e: /-- b11c cbz r4, 8008098 <netifapi_do_netif_common.lto_priv.0+0x12> return msg->msg.common.errtfunc(msg->netif); 8008090: | 4623 mov r3, r4 } 8008092: | e8bd 4010 ldmia.w sp!, {r4, lr} return msg->msg.common.errtfunc(msg->netif); 8008096: | 4718 bx r3 msg->msg.common.voidfunc(msg->netif); 8008098: \-> 689b ldr r3, [r3, #8] 800809a: 4798 blx r3 } 800809c: 4620 mov r0, r4 800809e: bd10 pop {r4, pc} 080080a0 : * @return ERR_OK if the packet was sent, any other err_t on failure */ err_t ethernet_output(struct netif * netif, struct pbuf * p, const struct eth_addr * src, const struct eth_addr * dst, u16_t eth_type) { 80080a0: e92d 41f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, lr} 80080a4: f8bd 4020 ldrh.w r4, [sp, #32] 80080a8: 460e mov r6, r1 80080aa: 0224 lsls r4, r4, #8 80080ac: 4605 mov r5, r0 80080ae: 4617 mov r7, r2 80080b0: f044 0408 orr.w r4, r4, #8 80080b4: 2200 movs r2, #0 80080b6: 210e movs r1, #14 80080b8: 4630 mov r0, r6 80080ba: 4698 mov r8, r3 80080bc: b2a4 uxth r4, r4 80080be: f7fa fa47 bl 8002550 <pbuf_add_header_impl.lto_priv.0> eth_type_be = PP_HTONS(ETHTYPE_VLAN); } else #endif /* ETHARP_SUPPORT_VLAN && (defined(LWIP_HOOK_VLAN_SET) || LWIP_VLAN_PCP) */ { if (pbuf_add_header(p, SIZEOF_ETH_HDR) != 0) { 80080c2: /----- bb20 cbnz r0, 800810e <ethernet_output+0x6e> } } LWIP_ASSERT_CORE_LOCKED(); ethhdr = (struct eth_hdr *)p->payload; 80080c4: | 6871 ldr r1, [r6, #4] ethhdr->type = eth_type_be; 80080c6: | 818c strh r4, [r1, #12] SMEMCPY(ðhdr->dest, dst, ETH_HWADDR_LEN); 80080c8: | f8d8 3000 ldr.w r3, [r8] 80080cc: | 600b str r3, [r1, #0] 80080ce: | f8b8 3004 ldrh.w r3, [r8, #4] 80080d2: | 808b strh r3, [r1, #4] SMEMCPY(ðhdr->src, src, ETH_HWADDR_LEN); 80080d4: | 683b ldr r3, [r7, #0] 80080d6: | f8c1 3006 str.w r3, [r1, #6] 80080da: | 88bb ldrh r3, [r7, #4] 80080dc: | 814b strh r3, [r1, #10] LWIP_ASSERT("netif->hwaddr_len must be 6 for ethernet_output!", 80080de: | f895 3034 ldrb.w r3, [r5, #52] @ 0x34 80080e2: | 2b06 cmp r3, #6 80080e4: | /-- d00c beq.n 8008100 <ethernet_output+0x60> 80080e6: | | b672 cpsid i return bgrt_kernel.timer.val; 80080e8: | | 4b0d ldr r3, [pc, #52] @ (8008120 ) 80080ea: | | 4a0e ldr r2, [pc, #56] @ (8008124 ) 80080ec: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 80080f0: | | 4b0d ldr r3, [pc, #52] @ (8008128 ) 80080f2: | | 9300 str r3, [sp, #0] 80080f4: | | 480d ldr r0, [pc, #52] @ (800812c ) 80080f6: | | f44f 739d mov.w r3, #314 @ 0x13a 80080fa: | | f7f9 f8fd bl 80012f8 <printf_> 80080fe: | | be00 bkpt 0x0000 (netif->hwaddr_len == ETH_HWADDR_LEN)); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("ethernet_output: sending packet %p\n", (void *)p)); /* send the packet */ return netif->linkoutput(netif, p); 8008100: | \-> 696b ldr r3, [r5, #20] 8008102: | 4631 mov r1, r6 8008104: | 4628 mov r0, r5 pbuf_header_failed: LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("ethernet_output: could not allocate room for header.\n")); LINK_STATS_INC(link.lenerr); return ERR_BUF; } 8008106: | b002 add sp, #8 8008108: | e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr} return netif->linkoutput(netif, p); 800810c: | 4718 bx r3 LINK_STATS_INC(link.lenerr); 800810e: \----> 4a08 ldr r2, [pc, #32] @ (8008130 ) 8008110: 8953 ldrh r3, [r2, #10] } 8008112: f06f 0001 mvn.w r0, #1 LINK_STATS_INC(link.lenerr); 8008116: 3301 adds r3, #1 8008118: 8153 strh r3, [r2, #10] } 800811a: b002 add sp, #8 800811c: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} 8008120: 200001b0 .word 0x200001b0 8008124: 0800cb2b .word 0x0800cb2b 8008128: 0800cb5c .word 0x0800cb5c 800812c: 0800b232 .word 0x0800b232 8008130: 20001104 .word 0x20001104 08008134 : */ u32_t lwip_htonl(u32_t n) { return PP_HTONL(n); } 8008134: ba00 rev r0, r0 8008136: 4770 bx lr 08008138 : { 8008138: b5f0 push {r4, r5, r6, r7, lr} if (odd && len > 0) { 800813a: f010 0501 ands.w r5, r0, #1 u16_t t = 0; 800813e: f04f 0300 mov.w r3, #0 if (odd && len > 0) { 8008142: /-- d005 beq.n 8008150 <lwip_standard_chksum+0x18> 8008144: +-- b121 cbz r1, 8008150 <lwip_standard_chksum+0x18> ((u8_t *)&t)[1] = *pb++; 8008146: | f810 2b01 ldrb.w r2, [r0], #1 len--; 800814a: | 3901 subs r1, #1 ((u8_t *)&t)[1] = *pb++; 800814c: | f362 231f bfi r3, r2, #8, #24 while (len > 1) { 8008150: \-> f021 0401 bic.w r4, r1, #1 8008154: 084e lsrs r6, r1, #1 8008156: 4404 add r4, r0 u32_t sum = 0; 8008158: 2200 movs r2, #0 while (len > 1) { 800815a: /-------> 42a0 cmp r0, r4 800815c: | /----- d118 bne.n 8008190 <lwip_standard_chksum+0x58> if (len > 0) { 800815e: | | f06f 0401 mvn.w r4, #1 8008162: | | fb04 1106 mla r1, r4, r6, r1 8008166: | | 2901 cmp r1, #1 ((u8_t *)&t)[0] = *(const u8_t *)ps; 8008168: | | bf02 ittt eq 800816a: | | 7801 ldrbeq r1, [r0, #0] 800816c: | | f361 0307 bfieq r3, r1, #0, #8 8008170: | | b29b uxtheq r3, r3 sum += t; 8008172: | | 4413 add r3, r2 sum = FOLD_U32T(sum); 8008174: | | b29a uxth r2, r3 8008176: | | eb02 4313 add.w r3, r2, r3, lsr #16 sum = FOLD_U32T(sum); 800817a: | | b298 uxth r0, r3 800817c: | | eb00 4013 add.w r0, r0, r3, lsr #16 if (odd) { 8008180: | | /-- b125 cbz r5, 800818c <lwip_standard_chksum+0x54> sum = SWAP_BYTES_IN_WORD(sum); 8008182: | | | 0203 lsls r3, r0, #8 8008184: | | | b29b uxth r3, r3 8008186: | | | f3c0 2007 ubfx r0, r0, #8, #8 800818a: | | | 4318 orrs r0, r3 } 800818c: | | \-> b280 uxth r0, r0 800818e: | | bdf0 pop {r4, r5, r6, r7, pc} sum += *ps++; 8008190: | \----> f830 7b02 ldrh.w r7, [r0], #2 8008194: | 443a add r2, r7 len -= 2; 8008196: \-------- e7e0 b.n 800815a <lwip_standard_chksum+0x22> 08008198 : } #else void bgrt_crit_sec_enter(void) { BGRT_INT_LOCK(); 8008198: f04f 00f0 mov.w r0, #240 @ 0xf0 800819c: f380 8811 msr BASEPRI, r0 80081a0: f3bf 8f4f dsb sy 80081a4: f3bf 8f6f isb sy BGRT_CNT_INC(bgrt_kernel.sched.nested_crit_sec); 80081a8: 4a04 ldr r2, [pc, #16] @ (80081bc ) 80081aa: f8d2 31a4 ldr.w r3, [r2, #420] @ 0x1a4 if (BGRT_CONFIG_CNT_MAX > val) 80081ae: 1c59 adds r1, r3, #1 return val + (bgrt_cnt_t)1; 80081b0: bf18 it ne 80081b2: 3301 addne r3, #1 80081b4: f8c2 31a4 str.w r3, [r2, #420] @ 0x1a4 } 80081b8: 4770 bx lr 80081ba: bf00 nop 80081bc: 200001b0 .word 0x200001b0 080081c0 : void bgrt_crit_sec_exit(void) { BGRT_CNT_DEC(bgrt_kernel.sched.nested_crit_sec); 80081c0: 4a09 ldr r2, [pc, #36] @ (80081e8 ) 80081c2: f8d2 31a4 ldr.w r3, [r2, #420] @ 0x1a4 if (val) 80081c6: /-- b943 cbnz r3, 80081da <bgrt_crit_sec_exit+0x1a> if (bgrt_kernel.sched.nested_crit_sec == (bgrt_cnt_t)0) { BGRT_INT_FREE(); 80081c8: /--|-> f04f 0000 mov.w r0, #0 80081cc: | | f380 8811 msr BASEPRI, r0 80081d0: | | f3bf 8f4f dsb sy 80081d4: | | f3bf 8f6f isb sy } } 80081d8: | | 4770 bx lr return val - (bgrt_cnt_t)1; 80081da: | \-> 3b01 subs r3, #1 BGRT_CNT_DEC(bgrt_kernel.sched.nested_crit_sec); 80081dc: | f8c2 31a4 str.w r3, [r2, #420] @ 0x1a4 if (bgrt_kernel.sched.nested_crit_sec == (bgrt_cnt_t)0) 80081e0: | 2b00 cmp r3, #0 80081e2: \----- d0f1 beq.n 80081c8 <bgrt_crit_sec_exit+0x8> } 80081e4: 4770 bx lr 80081e6: bf00 nop 80081e8: 200001b0 .word 0x200001b0 080081ec : * @param size the size in bytes of the memory needed * @return a pointer to the allocated memory or NULL if the pool is empty */ void * mem_malloc(mem_size_t size) { 80081ec: b513 push {r0, r1, r4, lr} void *ret; struct memp_malloc_helper *element = NULL; memp_t poolnr; mem_size_t required_size = size + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper)); 80081ee: 3004 adds r0, #4 80081f0: b280 uxth r0, r0 for (poolnr = MEMP_POOL_FIRST; poolnr <= MEMP_POOL_LAST; poolnr = (memp_t)(poolnr + 1)) { /* is this pool big enough to hold an element of the required size plus a struct memp_malloc_helper that saves the pool this element came from? */ if (required_size <= memp_pools[poolnr]->size) { 80081f2: 2854 cmp r0, #84 @ 0x54 80081f4: /-------------------- d915 bls.n 8008222 <mem_malloc+0x36> 80081f6: | f5b0 7f01 cmp.w r0, #516 @ 0x204 80081fa: | /-------------- d914 bls.n 8008226 <mem_malloc+0x3a> 80081fc: | | f240 4304 movw r3, #1028 @ 0x404 8008200: | | 4298 cmp r0, r3 8008202: | | /----------- d912 bls.n 800822a <mem_malloc+0x3e> 8008204: | | | f240 6304 movw r3, #1540 @ 0x604 8008208: | | | 4298 cmp r0, r3 800820a: | /--|--|----------- d814 bhi.n 8008236 <mem_malloc+0x4a> for (poolnr = MEMP_POOL_FIRST; poolnr <= MEMP_POOL_LAST; poolnr = (memp_t)(poolnr + 1)) { 800820c: | | | | 240f movs r4, #15 element = (struct memp_malloc_helper *)memp_malloc(poolnr); 800820e: | | | | /-------> 4620 mov r0, r4 8008210: | | | | | f7f9 ff6c bl 80020ec <memp_malloc> if (element == NULL) { 8008214: | | | | | /----- b958 cbnz r0, 800822e <mem_malloc+0x42> break; } } if (poolnr > MEMP_POOL_LAST) { LWIP_ASSERT("mem_malloc(): no pool is that big!", 0); MEM_STATS_INC_LOCKED(err); 8008216: /--|--|--|--|--|--|----> f7ff ffbf bl 8008198 <bgrt_crit_sec_enter> 800821a: | | | | | | | f7ff ffd1 bl 80081c0 <bgrt_crit_sec_exit> return NULL; 800821e: | | | | | | | 2000 movs r0, #0 8008220: | | | | | | | /-- e007 b.n 8008232 <mem_malloc+0x46> for (poolnr = MEMP_POOL_FIRST; poolnr <= MEMP_POOL_LAST; poolnr = (memp_t)(poolnr + 1)) { 8008222: | \--|--|--|--|--|--|-> 240c movs r4, #12 8008224: | | | | +--|--|-- e7f3 b.n 800820e <mem_malloc+0x22> 8008226: | | \--|--|--|--|-> 240d movs r4, #13 8008228: | | | +--|--|-- e7f1 b.n 800820e <mem_malloc+0x22> 800822a: | | \--|--|--|-> 240e movs r4, #14 800822c: | | \--|--|-- e7ef b.n 800820e <mem_malloc+0x22> return NULL; } /* save the pool number this element came from */ element->poolnr = poolnr; 800822e: | | \--|-> f800 4b04 strb.w r4, [r0], #4 #if MEMP_OVERFLOW_CHECK /* initialize unused memory (diff between requested size and selected pool's size) */ memset((u8_t *)ret + size, 0xcd, memp_pools[poolnr]->size - size); #endif /* MEMP_OVERFLOW_CHECK */ return ret; } 8008232: | | \-> b002 add sp, #8 8008234: | | bd10 pop {r4, pc} LWIP_ASSERT("mem_malloc(): no pool is that big!", 0); 8008236: | \----------------> b672 cpsid i 8008238: | 4b06 ldr r3, [pc, #24] @ (8008254 ) 800823a: | 4a07 ldr r2, [pc, #28] @ (8008258 ) 800823c: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008240: | 4b06 ldr r3, [pc, #24] @ (800825c ) 8008242: | 9300 str r3, [sp, #0] 8008244: | 4806 ldr r0, [pc, #24] @ (8008260 ) 8008246: | f44f 738b mov.w r3, #278 @ 0x116 800824a: | f7f9 f855 bl 80012f8 <printf_> 800824e: | be00 bkpt 0x0000 8008250: \----------------------- e7e1 b.n 8008216 <mem_malloc+0x2a> 8008252: bf00 nop 8008254: 200001b0 .word 0x200001b0 8008258: 0800cb76 .word 0x0800cb76 800825c: 0800cb99 .word 0x0800cb99 8008260: 0800b232 .word 0x0800b232 08008264 : { 8008264: b513 push {r0, r1, r4, lr} BGRT_ASSERT(xlist, "The #xlist must not be NULL!"); 8008266: 4604 mov r4, r0 8008268: /-- b958 cbnz r0, 8008282 <bgrt_xlist_init+0x1e> 800826a: | b672 cpsid i 800826c: | 4b0a ldr r3, [pc, #40] @ (8008298 ) 800826e: | 4a0b ldr r2, [pc, #44] @ (800829c ) 8008270: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008274: | 4b0a ldr r3, [pc, #40] @ (80082a0 ) 8008276: | 9300 str r3, [sp, #0] 8008278: | 480a ldr r0, [pc, #40] @ (80082a4 ) 800827a: | 235d movs r3, #93 @ 0x5d 800827c: | f7f9 f83c bl 80012f8 <printf_> 8008280: | be00 bkpt 0x0000 xlist->map = (bgrt_map_t)0; 8008282: \-> 2100 movs r1, #0 xlist->item[i] = (bgrt_item_t *)0; /* ADLINT:SL:[W0567] type conversion */ 8008284: 2280 movs r2, #128 @ 0x80 8008286: 4620 mov r0, r4 xlist->map = (bgrt_map_t)0; 8008288: f8c4 1080 str.w r1, [r4, #128] @ 0x80 } 800828c: b002 add sp, #8 800828e: e8bd 4010 ldmia.w sp!, {r4, lr} xlist->item[i] = (bgrt_item_t *)0; /* ADLINT:SL:[W0567] type conversion */ 8008292: f002 be1f b.w 800aed4 <memset> 8008296: bf00 nop 8008298: 200001b0 .word 0x200001b0 800829c: 0800c970 .word 0x0800c970 80082a0: 0800c98d .word 0x0800c98d 80082a4: 0800b232 .word 0x0800b232 080082a8 : return bgrt_sem_free_cs(q->deq); } bgrt_st_t bgrt_queue_fetch_fn(bgrt_queue_t *q, void **msg, _queue_sem_t sem_lock_fn) { 80082a8: b5f8 push {r3, r4, r5, r6, r7, lr} bool q_sw = !!(q->flags & Q_SW); 80082aa: 8806 ldrh r6, [r0, #0] { 80082ac: 4604 mov r4, r0 bool q_cs = !!(q->flags & Q_CS); bgrt_st_t st; void **p; void *t; if ((st = sem_lock_fn(q->deq)) != BGRT_ST_OK) 80082ae: 68c0 ldr r0, [r0, #12] { 80082b0: 460d mov r5, r1 if ((st = sem_lock_fn(q->deq)) != BGRT_ST_OK) 80082b2: 4790 blx r2 80082b4: 2800 cmp r0, #0 80082b6: /----------- d133 bne.n 8008320 <bgrt_queue_fetch_fn+0x78> enqueue ^= !!(q->flags & Q_REV); 80082b8: | 8823 ldrh r3, [r4, #0] idx = *obj; 80082ba: | f3bf 8f5b dmb ish obj = enqueue ? &q->head : &q->tail; 80082be: | 07df lsls r7, r3, #31 80082c0: | bf4c ite mi 80082c2: | 1d22 addmi r2, r4, #4 80082c4: | 1da2 addpl r2, r4, #6 idx = *obj; 80082c6: | 8813 ldrh r3, [r2, #0] 80082c8: | f3bf 8f5b dmb ish 80082cc: | b29b uxth r3, r3 } while(!atomic_compare_exchange_strong(obj, &idx, next)); 80082ce: | /-------> 8867 ldrh r7, [r4, #2] 80082d0: | | f3bf 8f5b dmb ish next = (idx + 1) & q->size; 80082d4: | | 1c59 adds r1, r3, #1 } while(!atomic_compare_exchange_strong(obj, &idx, next)); 80082d6: | | 4039 ands r1, r7 80082d8: | | /----> e8d2 7f5f ldrexh r7, [r2] 80082dc: | | | 429f cmp r7, r3 80082de: | | | /-- d104 bne.n 80082ea <bgrt_queue_fetch_fn+0x42> 80082e0: | | | | e8c2 1f5c strexh ip, r1, [r2] 80082e4: | | | | f1bc 0f00 cmp.w ip, #0 80082e8: | | \--|-- d1f6 bne.n 80082d8 <bgrt_queue_fetch_fn+0x30> 80082ea: | | \-> f3bf 8f5b dmb ish 80082ee: | | b2bb uxth r3, r7 80082f0: | \-------- d1ed bne.n 80082ce <bgrt_queue_fetch_fn+0x26> return st; p = _queue_idx_inc(q, false); t = *p; 80082f2: | eb04 0383 add.w r3, r4, r3, lsl #2 if (q_sw) *p = *msg; 80082f6: | 07b1 lsls r1, r6, #30 80082f8: | bf48 it mi 80082fa: | 6829 ldrmi r1, [r5, #0] t = *p; 80082fc: | 691a ldr r2, [r3, #16] if (q_sw) *p = *msg; 80082fe: | bf48 it mi 8008300: | 6119 strmi r1, [r3, #16] *msg = t; return q_cs ? atomic_fetch_add(&q->enq.counter, 1), BGRT_ST_OK : 8008302: | 0773 lsls r3, r6, #29 *msg = t; 8008304: | 602a str r2, [r5, #0] atomic_fetch_add(&q->enq.counter, 1), BGRT_ST_OK : 8008306: | /----- d50c bpl.n 8008322 <bgrt_queue_fetch_fn+0x7a> 8008308: | | f3bf 8f5b dmb ish 800830c: | | 3408 adds r4, #8 800830e: | | /-> e854 3f00 ldrex r3, [r4] 8008312: | | | 3301 adds r3, #1 8008314: | | | e844 3200 strex r2, r3, [r4] 8008318: | | | 2a00 cmp r2, #0 800831a: | | \-- d1f8 bne.n 800830e <bgrt_queue_fetch_fn+0x66> 800831c: | | f3bf 8f5b dmb ish bgrt_sem_free(q->enq.sem); } 8008320: >-----|----> bdf8 pop {r3, r4, r5, r6, r7, pc} bgrt_sem_free(q->enq.sem); 8008322: | \----> 68a2 ldr r2, [r4, #8] return ret; } bgrt_st_t bgrt_sem_free(bgrt_sem_t * sem) { if (!sem) 8008324: | /-- b122 cbz r2, 8008330 <bgrt_queue_fetch_fn+0x88> } 8008326: | | e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr} { return BGRT_ST_ENULL; } else { return BGRT_SYSCALL_NVAR(USER, _sem_free_payload, (void *)sem); 800832a: | | 4902 ldr r1, [pc, #8] @ (8008334 ) 800832c: | | 2014 movs r0, #20 800832e: | | e52e b.n 8007d8e <bgrt_syscall_var> return BGRT_ST_ENULL; 8008330: | \-> 2001 movs r0, #1 8008332: \----------- e7f5 b.n 8008320 <bgrt_queue_fetch_fn+0x78> 8008334: 0800894d .word 0x0800894d 08008338 : u32_t sys_arch_mbox_fetch (sys_mbox_t *mbox, void **msg, u32_t timeout) 8008338: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} LWIP_ASSERT("mbox->queue != NULL", mbox->queue != NULL); 800833c: 4e27 ldr r6, [pc, #156] @ (80083dc ) 800833e: 6833 ldr r3, [r6, #0] u32_t sys_arch_mbox_fetch (sys_mbox_t *mbox, void **msg, u32_t timeout) 8008340: b085 sub sp, #20 8008342: 4605 mov r5, r0 8008344: 460c mov r4, r1 LWIP_ASSERT("mbox->queue != NULL", mbox->queue != NULL); 8008346: /-- b95b cbnz r3, 8008360 <sys_arch_mbox_fetch.constprop.0+0x28> 8008348: | b672 cpsid i return bgrt_kernel.timer.val; 800834a: | 4b25 ldr r3, [pc, #148] @ (80083e0 ) LWIP_ASSERT("mbox->queue != NULL", mbox->queue != NULL); 800834c: | 4a25 ldr r2, [pc, #148] @ (80083e4 ) return bgrt_kernel.timer.val; 800834e: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac LWIP_ASSERT("mbox->queue != NULL", mbox->queue != NULL); 8008352: | 4b25 ldr r3, [pc, #148] @ (80083e8 ) 8008354: | 9300 str r3, [sp, #0] 8008356: | 4825 ldr r0, [pc, #148] @ (80083ec ) 8008358: | 23dd movs r3, #221 @ 0xdd 800835a: | f7f8 ffcd bl 80012f8 <printf_> 800835e: | be00 bkpt 0x0000 st = bgrt_queue_fetch(mbox->queue, msg); 8008360: \-> 6830 ldr r0, [r6, #0] if (!timeout) { 8008362: /-------- b324 cbz r4, 80083ae <sys_arch_mbox_fetch.constprop.0+0x76> st = bgrt_queue_try_fetch(mbox->queue, msg); 8008364: | 4f22 ldr r7, [pc, #136] @ (80083f0 ) return bgrt_kernel.timer.val; 8008366: | f8df 8078 ldr.w r8, [pc, #120] @ 80083e0 LWIP_ASSERT("st == BGRT_ST_ROLL", st == BGRT_ST_ROLL); 800836a: | f8df 907c ldr.w r9, [pc, #124] @ 80083e8 while(timeout--) { 800836e: | 3c01 subs r4, #1 st = bgrt_queue_try_fetch(mbox->queue, msg); 8008370: | /----> 6830 ldr r0, [r6, #0] 8008372: | | 463a mov r2, r7 8008374: | | 4629 mov r1, r5 8008376: | | f7ff ff97 bl 80082a8 <bgrt_queue_fetch_fn> if (st == BGRT_ST_OK) return 0; 800837a: /--|--|----- b1e8 cbz r0, 80083b8 <sys_arch_mbox_fetch.constprop.0+0x80> LWIP_ASSERT("st == BGRT_ST_ROLL", st == BGRT_ST_ROLL); 800837c: | | | 2809 cmp r0, #9 800837e: | | | /-- d00a beq.n 8008396 <sys_arch_mbox_fetch.constprop.0+0x5e> 8008380: | | | | b672 cpsid i 8008382: | | | | 4a1c ldr r2, [pc, #112] @ (80083f4 ) return bgrt_kernel.timer.val; 8008384: | | | | f8d8 11ac ldr.w r1, [r8, #428] @ 0x1ac LWIP_ASSERT("st == BGRT_ST_ROLL", st == BGRT_ST_ROLL); 8008388: | | | | 4818 ldr r0, [pc, #96] @ (80083ec ) 800838a: | | | | f8cd 9000 str.w r9, [sp] 800838e: | | | | 23e8 movs r3, #232 @ 0xe8 8008390: | | | | f7f8 ffb2 bl 80012f8 <printf_> 8008394: | | | | be00 bkpt 0x0000 BGRT_SYSCALL_N(SCHED_PROC_YIELD, (void *)&ret); /* ADLINT:SL:[W0459,W0021,W1059,W1073] conversion of ret, enum, result discarded*/ 8008396: | | | \-> f10d 010f add.w r1, sp, #15 800839a: | | | 200b movs r0, #11 800839c: | | | f7ff fcbc bl 8007d18 <bgrt_syscall> while(timeout--) { 80083a0: | | | 3c01 subs r4, #1 return ret; 80083a2: | | | f89d 300f ldrb.w r3, [sp, #15] 80083a6: | | \----- d2e3 bcs.n 8008370 <sys_arch_mbox_fetch.constprop.0+0x38> *msg = NULL; 80083a8: | | 2300 movs r3, #0 80083aa: | | 602b str r3, [r5, #0] return SYS_ARCH_TIMEOUT; 80083ac: | | /----- e005 b.n 80083ba <sys_arch_mbox_fetch.constprop.0+0x82> st = bgrt_queue_fetch(mbox->queue, msg); 80083ae: | \--|----> 4a12 ldr r2, [pc, #72] @ (80083f8 ) 80083b0: | | 4629 mov r1, r5 80083b2: | | f7ff ff79 bl 80082a8 <bgrt_queue_fetch_fn> LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 80083b6: | | /-- b920 cbnz r0, 80083c2 <sys_arch_mbox_fetch.constprop.0+0x8a> return 0; 80083b8: >-----|--|-> 2400 movs r4, #0 } 80083ba: | \--|-> 4620 mov r0, r4 80083bc: | | b005 add sp, #20 80083be: | | e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 80083c2: | \-> b672 cpsid i return bgrt_kernel.timer.val; 80083c4: | 4b06 ldr r3, [pc, #24] @ (80083e0 ) LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 80083c6: | 4a0d ldr r2, [pc, #52] @ (80083fc ) return bgrt_kernel.timer.val; 80083c8: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 80083cc: | 4b06 ldr r3, [pc, #24] @ (80083e8 ) 80083ce: | 9300 str r3, [sp, #0] 80083d0: | 4806 ldr r0, [pc, #24] @ (80083ec ) 80083d2: | 23e1 movs r3, #225 @ 0xe1 80083d4: | f7f8 ff90 bl 80012f8 <printf_> 80083d8: | be00 bkpt 0x0000 80083da: \----------- e7ed b.n 80083b8 <sys_arch_mbox_fetch.constprop.0+0x80> 80083dc: 20001208 .word 0x20001208 80083e0: 200001b0 .word 0x200001b0 80083e4: 0800cbad .word 0x0800cbad 80083e8: 0800cbc1 .word 0x0800cbc1 80083ec: 0800b232 .word 0x0800b232 80083f0: 080078b1 .word 0x080078b1 80083f4: 0800cbd9 .word 0x0800cbd9 80083f8: 08007dab .word 0x08007dab 80083fc: 0800b221 .word 0x0800b221 08008400 : { 8008400: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} 8008402: 460d mov r5, r1 BGRT_ASSERT(pitem, "The #pitem must not be NULL!"); 8008404: 4604 mov r4, r0 8008406: /-- b9a8 cbnz r0, 8008434 <bgrt_pitem_insert+0x34> 8008408: | b672 cpsid i 800840a: | 4f2b ldr r7, [pc, #172] @ (80084b8 ) 800840c: | 4e2b ldr r6, [pc, #172] @ (80084bc ) 800840e: | f8d7 11ac ldr.w r1, [r7, #428] @ 0x1ac 8008412: | 4a2b ldr r2, [pc, #172] @ (80084c0 ) 8008414: | 9600 str r6, [sp, #0] 8008416: | 2361 movs r3, #97 @ 0x61 8008418: | 482a ldr r0, [pc, #168] @ (80084c4 ) 800841a: | f7f8 ff6d bl 80012f8 <printf_> 800841e: | be00 bkpt 0x0000 BGRT_ASSERT(pitem, "The #xlist must not be xlist!"); 8008420: | b672 cpsid i 8008422: | 4a29 ldr r2, [pc, #164] @ (80084c8 ) 8008424: | f8d7 11ac ldr.w r1, [r7, #428] @ 0x1ac 8008428: | 4826 ldr r0, [pc, #152] @ (80084c4 ) 800842a: | 9600 str r6, [sp, #0] 800842c: | 2362 movs r3, #98 @ 0x62 800842e: | f7f8 ff63 bl 80012f8 <printf_> 8008432: | be00 bkpt 0x0000 prio = pitem->prio; 8008434: \-> 7b23 ldrb r3, [r4, #12] if ((xlist->map)& mask) 8008436: f8d5 2080 ldr.w r2, [r5, #128] @ 0x80 mask = ((bgrt_map_t)1)<map)& mask) 800843e: 420a tst r2, r1 head = (bgrt_item_t **)xlist + prio; /* ADLINT:SL:[W1052] Int to pointer*/ 8008440: b21b sxth r3, r3 if ((xlist->map)& mask) 8008442: /----- d032 beq.n 80084aa <bgrt_pitem_insert+0xaa> bgrt_item_insert((bgrt_item_t *)pitem, *head); 8008444: | f855 6023 ldr.w r6, [r5, r3, lsl #2] BGRT_ASSERT(head, "The #head must not be NULL!"); 8008448: | /-- b95e cbnz r6, 8008462 <bgrt_pitem_insert+0x62> 800844a: | | b672 cpsid i 800844c: | | 4b1a ldr r3, [pc, #104] @ (80084b8 ) 800844e: | | 4a1f ldr r2, [pc, #124] @ (80084cc ) 8008450: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008454: | | 4b1e ldr r3, [pc, #120] @ (80084d0 ) 8008456: | | 9300 str r3, [sp, #0] 8008458: | | 481a ldr r0, [pc, #104] @ (80084c4 ) 800845a: | | 2360 movs r3, #96 @ 0x60 800845c: | | f7f8 ff4c bl 80012f8 <printf_> 8008460: | | be00 bkpt 0x0000 BGRT_ASSERT(head->prev, "The #head->prev must not be NULL!"); 8008462: | \-> 6873 ldr r3, [r6, #4] 8008464: | /-- b95b cbnz r3, 800847e <bgrt_pitem_insert+0x7e> 8008466: | | b672 cpsid i 8008468: | | 4b13 ldr r3, [pc, #76] @ (80084b8 ) 800846a: | | 4a1a ldr r2, [pc, #104] @ (80084d4 ) 800846c: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008470: | | 4b17 ldr r3, [pc, #92] @ (80084d0 ) 8008472: | | 9300 str r3, [sp, #0] 8008474: | | 4813 ldr r0, [pc, #76] @ (80084c4 ) 8008476: | | 2361 movs r3, #97 @ 0x61 8008478: | | f7f8 ff3e bl 80012f8 <printf_> 800847c: | | be00 bkpt 0x0000 BGRT_ASSERT(head->next, "The #head->next must not be NULL!"); 800847e: | \-> 6833 ldr r3, [r6, #0] 8008480: | /-- b95b cbnz r3, 800849a <bgrt_pitem_insert+0x9a> 8008482: | | b672 cpsid i 8008484: | | 4b0c ldr r3, [pc, #48] @ (80084b8 ) 8008486: | | 4a14 ldr r2, [pc, #80] @ (80084d8 ) 8008488: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800848c: | | 4b10 ldr r3, [pc, #64] @ (80084d0 ) 800848e: | | 9300 str r3, [sp, #0] 8008490: | | 480c ldr r0, [pc, #48] @ (80084c4 ) 8008492: | | 2362 movs r3, #98 @ 0x62 8008494: | | f7f8 ff30 bl 80012f8 <printf_> 8008498: | | be00 bkpt 0x0000 tail = head->prev; 800849a: | \-> 6873 ldr r3, [r6, #4] item->next = head; 800849c: | e9c4 6300 strd r6, r3, [r4] head->prev = item; 80084a0: | 6074 str r4, [r6, #4] tail->next = item; 80084a2: | 601c str r4, [r3, #0] pitem->list = xlist; 80084a4: | /-> 60a5 str r5, [r4, #8] } 80084a6: | | b003 add sp, #12 80084a8: | | bdf0 pop {r4, r5, r6, r7, pc} xlist->map |= mask; 80084aa: \--|-> 430a orrs r2, r1 *head = (bgrt_item_t *)pitem; 80084ac: | f845 4023 str.w r4, [r5, r3, lsl #2] xlist->map |= mask; 80084b0: | f8c5 2080 str.w r2, [r5, #128] @ 0x80 80084b4: \-- e7f6 b.n 80084a4 <bgrt_pitem_insert+0xa4> 80084b6: bf00 nop 80084b8: 200001b0 .word 0x200001b0 80084bc: 0800c9dd .word 0x0800c9dd 80084c0: 0800c9c0 .word 0x0800c9c0 80084c4: 0800b232 .word 0x0800b232 80084c8: 0800cbec .word 0x0800cbec 80084cc: 0800cc0a .word 0x0800cc0a 80084d0: 0800ca0d .word 0x0800ca0d 80084d4: 0800cc26 .word 0x0800cc26 80084d8: 0800cc48 .word 0x0800cc48 080084dc : { 80084dc: b573 push {r0, r1, r4, r5, r6, lr} 80084de: 4e10 ldr r6, [pc, #64] @ (8008520 ) 80084e0: 460d mov r5, r1 BGRT_ASSERT(proc, "The #proc must not be NULL!"); 80084e2: 4604 mov r4, r0 80084e4: /-- b950 cbnz r0, 80084fc <bgrt_sched_proc_run+0x20> 80084e6: | b672 cpsid i 80084e8: | 4b0e ldr r3, [pc, #56] @ (8008524 ) 80084ea: | f8d6 11ac ldr.w r1, [r6, #428] @ 0x1ac 80084ee: | 4a0e ldr r2, [pc, #56] @ (8008528 ) 80084f0: | 9300 str r3, [sp, #0] 80084f2: | 480e ldr r0, [pc, #56] @ (800852c ) 80084f4: | 23e9 movs r3, #233 @ 0xe9 80084f6: | f7f8 feff bl 80012f8 <printf_> 80084fa: | be00 bkpt 0x0000 BGRT_PROC_SET_STATE(proc, state); /* ADLINT:SL:[W0447] coma operator*/ 80084fc: \-> 7c23 ldrb r3, [r4, #16] 80084fe: f023 030f bic.w r3, r3, #15 8008502: 431d orrs r5, r3 8008504: 7425 strb r5, [r4, #16] bgrt_pitem_insert((bgrt_pitem_t *)proc, sched->ready); 8008506: f8d6 1094 ldr.w r1, [r6, #148] @ 0x94 800850a: 4620 mov r0, r4 800850c: f7ff ff78 bl 8008400 <bgrt_pitem_insert> bgrt_atm_bset(&BGRT_KBLOCK.lpmap, BGRT_KBLOCK_VRESCH); 8008510: 4807 ldr r0, [pc, #28] @ (8008530 ) 8008512: 2104 movs r1, #4 } 8008514: b002 add sp, #8 8008516: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} 800851a: f7f8 beb1 b.w 8001280 <bgrt_atm_bset.lto_priv.0.lto_priv.0> 800851e: bf00 nop 8008520: 200001b0 .word 0x200001b0 8008524: 0800cae7 .word 0x0800cae7 8008528: 0800cacb .word 0x0800cacb 800852c: 0800b232 .word 0x0800b232 8008530: 2000023c .word 0x2000023c 08008534 : { 8008534: b510 push {r4, lr} if (!proc) 8008536: /-------- b140 cbz r0, 800854a <BGRT_SC_PROC_RUN_SR+0x16> if (BGRT_PROC_STATE_STOPED != BGRT_PROC_GET_STATE(proc)) 8008538: | 7c04 ldrb r4, [r0, #16] 800853a: | f014 040f ands.w r4, r4, #15 800853e: | /----- d106 bne.n 800854e <BGRT_SC_PROC_RUN_SR+0x1a> bgrt_sched_proc_run(proc, BGRT_PROC_STATE_READY); 8008540: | | 2102 movs r1, #2 8008542: | | f7ff ffcb bl 80084dc <bgrt_sched_proc_run> } 8008546: | | /-> 4620 mov r0, r4 8008548: | | | bd10 pop {r4, pc} return BGRT_ST_ENULL; 800854a: \--|--|-> 2401 movs r4, #1 800854c: | +-- e7fb b.n 8008546 <BGRT_SC_PROC_RUN_SR+0x12> ret = BGRT_ST_EAGAIN; 800854e: \--|-> 2407 movs r4, #7 8008550: \-- e7f9 b.n 8008546 <BGRT_SC_PROC_RUN_SR+0x12> 08008552 : { 8008552: b538 push {r3, r4, r5, lr} if (!proc) 8008554: 4604 mov r4, r0 8008556: 2800 cmp r0, #0 8008558: /-------- d047 beq.n 80085ea <BGRT_SC_PROC_RESTART_SR+0x98> if (proc->flags & (BGRT_PROC_FLG_LOCK_MASK|BGRT_PROC_STATE_RESTART_MASK)) 800855a: | 7c03 ldrb r3, [r0, #16] 800855c: | f013 0528 ands.w r5, r3, #40 @ 0x28 8008560: | /----- d145 bne.n 80085ee <BGRT_SC_PROC_RESTART_SR+0x9c> proc->flags = (proc->flags & BGRT_PROC_FLG_RT)?BGRT_PROC_FLG_RT:(bgrt_flag_t)0; 8008562: | | f023 037f bic.w r3, r3, #127 @ 0x7f 8008566: | | 7403 strb r3, [r0, #16] pcounter->map = (bgrt_map_t)0; 8008568: | | f8c0 5094 str.w r5, [r0, #148] @ 0x94 pcounter->counter[p] = (bgrt_cnt_t)0; /* ADLINT:SL:[W0705] Out of range access!*/ 800856c: | | 2280 movs r2, #128 @ 0x80 800856e: | | 4629 mov r1, r5 8008570: | | 3014 adds r0, #20 8008572: | | f002 fcaf bl 800aed4 <memset> proc->timer = proc->time_quant; 8008576: | | f8d4 3098 ldr.w r3, [r4, #152] @ 0x98 800857a: | | f8c4 309c str.w r3, [r4, #156] @ 0x9c if (proc->sstart) 800857e: | | f8d4 30b8 ldr.w r3, [r4, #184] @ 0xb8 8008582: | | /-- b363 cbz r3, 80085de <BGRT_SC_PROC_RESTART_SR+0x8c> proc->spointer = bgrt_proc_stack_init(proc->sstart, (bgrt_code_t)proc->pmain, (void *)proc->arg, (void (*)(void))bgrt_proc_terminate); 8008584: | | | f8d4 10a8 ldr.w r1, [r4, #168] @ 0xa8 8008588: | | | f8d4 20b4 ldr.w r2, [r4, #180] @ 0xb4 *(--sstart) = (bgrt_stack_t)arg; /* r0 !!! arg !!! */ 800858c: | | | f843 2c1c str.w r2, [r3, #-28] *sstart = (bgrt_stack_t)0x01000000; /* psr */ 8008590: | | | f04f 7080 mov.w r0, #16777216 @ 0x1000000 *(--sstart) = (bgrt_stack_t)pmain; /* pc !!! pmain !!! */ 8008594: | | | e943 1001 strd r1, r0, [r3, #-4] *(--sstart) = (bgrt_stack_t)return_address; /* lr !!! return_address !!! */ 8008598: | | | 4916 ldr r1, [pc, #88] @ (80085f4 ) 800859a: | | | f843 1c08 str.w r1, [r3, #-8] *(--sstart) = (bgrt_stack_t)0x03; /* r3 */ 800859e: | | | 2012 movs r0, #18 80085a0: | | | 2103 movs r1, #3 80085a2: | | | e943 1004 strd r1, r0, [r3, #-16] *(--sstart) = (bgrt_stack_t)0x01; /* r1 */ 80085a6: | | | f04f 0c02 mov.w ip, #2 80085aa: | | | 2101 movs r1, #1 *(--sstart) = (bgrt_stack_t)0x11; /* r11 */ 80085ac: | | | 2211 movs r2, #17 80085ae: | | | f06f 0e02 mvn.w lr, #2 *(--sstart) = (bgrt_stack_t)0x01; /* r1 */ 80085b2: | | | e943 1c06 strd r1, ip, [r3, #-24] *(--sstart) = (bgrt_stack_t)0x11; /* r11 */ 80085b6: | | | e943 2e09 strd r2, lr, [r3, #-36] @ 0x24 *(--sstart) = (bgrt_stack_t)0x09; /* r9 */ 80085ba: | | | 2110 movs r1, #16 80085bc: | | | 2209 movs r2, #9 80085be: | | | e943 210b strd r2, r1, [r3, #-44] @ 0x2c *(--sstart) = (bgrt_stack_t)0x07; /* r7 */ 80085c2: | | | 2008 movs r0, #8 80085c4: | | | 2207 movs r2, #7 80085c6: | | | e943 200d strd r2, r0, [r3, #-52] @ 0x34 *(--sstart) = (bgrt_stack_t)0x05; /* r5 */ 80085ca: | | | f04f 0c06 mov.w ip, #6 80085ce: | | | 2205 movs r2, #5 80085d0: | | | e943 2c0f strd r2, ip, [r3, #-60] @ 0x3c *(--sstart) = (bgrt_stack_t)0x04; /* r4 */ 80085d4: | | | 2204 movs r2, #4 80085d6: | | | f843 2d40 str.w r2, [r3, #-64]! 80085da: | | | f8c4 30bc str.w r3, [r4, #188] @ 0xbc bgrt_sched_proc_run(proc, BGRT_PROC_STATE_READY); 80085de: | | \-> 2102 movs r1, #2 80085e0: | | 4620 mov r0, r4 80085e2: | | f7ff ff7b bl 80084dc <bgrt_sched_proc_run> } 80085e6: | | /-> 4628 mov r0, r5 80085e8: | | | bd38 pop {r3, r4, r5, pc} return BGRT_ST_ENULL; 80085ea: \--|--|-> 2501 movs r5, #1 80085ec: | +-- e7fb b.n 80085e6 <BGRT_SC_PROC_RESTART_SR+0x94> ret = BGRT_ST_ESTAT; 80085ee: \--|-> 2506 movs r5, #6 80085f0: \-- e7f9 b.n 80085e6 <BGRT_SC_PROC_RESTART_SR+0x94> 80085f2: bf00 nop 80085f4: 08007d89 .word 0x08007d89 080085f8 <_pctrl_proc_run_high>: { 80085f8: b537 push {r0, r1, r2, r4, r5, lr} 80085fa: 460d mov r5, r1 BGRT_ASSERT(proc, "The #proc must not be NULL!"); 80085fc: 4604 mov r4, r0 80085fe: /-- b958 cbnz r0, 8008618 <_pctrl_proc_run_high+0x20> 8008600: | b672 cpsid i 8008602: | 4b0c ldr r3, [pc, #48] @ (8008634 <_pctrl_proc_run_high+0x3c>) 8008604: | 4a0c ldr r2, [pc, #48] @ (8008638 <_pctrl_proc_run_high+0x40>) 8008606: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800860a: | 4b0c ldr r3, [pc, #48] @ (800863c <_pctrl_proc_run_high+0x44>) 800860c: | 9300 str r3, [sp, #0] 800860e: | 480c ldr r0, [pc, #48] @ (8008640 <_pctrl_proc_run_high+0x48>) 8008610: | 2354 movs r3, #84 @ 0x54 8008612: | f7f8 fe71 bl 80012f8 <printf_> 8008616: | be00 bkpt 0x0000 BGRT_PROC_LRES_INC(proc, 0); 8008618: \-> f104 0014 add.w r0, r4, #20 800861c: 2100 movs r1, #0 800861e: f7ff f980 bl 8007922 <bgrt_pcounter_inc> ((bgrt_pitem_t *)proc)->prio = (bgrt_prio_t)0; 8008622: 2300 movs r3, #0 bgrt_sched_proc_run(proc, state); 8008624: 4629 mov r1, r5 8008626: 4620 mov r0, r4 ((bgrt_pitem_t *)proc)->prio = (bgrt_prio_t)0; 8008628: 7323 strb r3, [r4, #12] } 800862a: b003 add sp, #12 800862c: e8bd 4030 ldmia.w sp!, {r4, r5, lr} bgrt_sched_proc_run(proc, state); 8008630: e754 b.n 80084dc <bgrt_sched_proc_run> 8008632: bf00 nop 8008634: 200001b0 .word 0x200001b0 8008638: 0800cacb .word 0x0800cacb 800863c: 0800c95d .word 0x0800c95d 8008640: 0800b232 .word 0x0800b232 08008644 <_sync_do_wake>: { 8008644: b573 push {r0, r1, r4, r5, r6, lr} 8008646: 460d mov r5, r1 8008648: 4616 mov r6, r2 BGRT_ASSERT(proc, "The #proc must not be NULL!"); 800864a: 4604 mov r4, r0 800864c: /-- b958 cbnz r0, 8008666 <_sync_do_wake+0x22> 800864e: | b672 cpsid i 8008650: | 4b23 ldr r3, [pc, #140] @ (80086e0 <_sync_do_wake+0x9c>) 8008652: | 4a24 ldr r2, [pc, #144] @ (80086e4 <_sync_do_wake+0xa0>) 8008654: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008658: | 4b23 ldr r3, [pc, #140] @ (80086e8 <_sync_do_wake+0xa4>) 800865a: | 9300 str r3, [sp, #0] 800865c: | 4823 ldr r0, [pc, #140] @ (80086ec <_sync_do_wake+0xa8>) 800865e: | 2393 movs r3, #147 @ 0x93 8008660: | f7f8 fe4a bl 80012f8 <printf_> 8008664: | be00 bkpt 0x0000 BGRT_ASSERT(sync, "The #sync must not be NULL!"); 8008666: /--\-X b95d cbnz r5, 8008680 <_sync_do_wake+0x3c> 8008668: | b672 cpsid i 800866a: | 4b1d ldr r3, [pc, #116] @ (80086e0 <_sync_do_wake+0x9c>) 800866c: | 4a20 ldr r2, [pc, #128] @ (80086f0 <_sync_do_wake+0xac>) 800866e: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008672: | 4b1d ldr r3, [pc, #116] @ (80086e8 <_sync_do_wake+0xa4>) 8008674: | 9300 str r3, [sp, #0] 8008676: | 481d ldr r0, [pc, #116] @ (80086ec <_sync_do_wake+0xa8>) 8008678: | 2394 movs r3, #148 @ 0x94 800867a: | f7f8 fe3d bl 80012f8 <printf_> 800867e: | be00 bkpt 0x0000 proc->sync = (void *)0; /* ADLINT:SL:[W0567] type conversion*/ 8008680: \----> 2300 movs r3, #0 8008682: f8c4 30a0 str.w r3, [r4, #160] @ 0xa0 if (BGRT_PROC_STATE_PI_PEND == BGRT_PROC_GET_STATE(proc)) 8008686: 7c23 ldrb r3, [r4, #16] 8008688: f003 020f and.w r2, r3, #15 800868c: 2a0c cmp r2, #12 800868e: /-- d110 bne.n 80086b2 <_sync_do_wake+0x6e> BGRT_PROC_SET_STATE (proc, BGRT_PROC_STATE_PI_DONE); /* ADLINT:SL:[W0447] coma operator*/ 8008690: | f023 030f bic.w r3, r3, #15 8008694: | f043 030d orr.w r3, r3, #13 8008698: | 7423 strb r3, [r4, #16] if (chown) 800869a: /--|-- b1fe cbz r6, 80086dc <_sync_do_wake+0x98> BGRT_PROC_LRES_INC(proc, BGRT_SYNC_PRIO(sync)); 800869c: | | 4628 mov r0, r5 800869e: | | f7ff fb15 bl 8007ccc <bgrt_priv_sync_prio> 80086a2: | | 4601 mov r1, r0 80086a4: | | f104 0014 add.w r0, r4, #20 } 80086a8: | | b002 add sp, #8 80086aa: | | e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} BGRT_PROC_LRES_INC(proc, BGRT_SYNC_PRIO(sync)); 80086ae: | | f7ff b938 b.w 8007922 <bgrt_pcounter_inc> bgrt_pitem_cut((bgrt_pitem_t *)proc); 80086b2: | \-> 4620 mov r0, r4 80086b4: | f7ff fa6e bl 8007b94 <bgrt_pitem_cut> if (chown) 80086b8: | /-- b156 cbz r6, 80086d0 <_sync_do_wake+0x8c> BGRT_PROC_LRES_INC(proc, BGRT_SYNC_PRIO(sync)); 80086ba: | | 4628 mov r0, r5 80086bc: | | f7ff fb06 bl 8007ccc <bgrt_priv_sync_prio> 80086c0: | | 4601 mov r1, r0 80086c2: | | f104 0014 add.w r0, r4, #20 80086c6: | | f7ff f92c bl 8007922 <bgrt_pcounter_inc> _pctrl_proc_stoped(proc); 80086ca: | | 4620 mov r0, r4 80086cc: | | f7ff fad8 bl 8007c80 <_pctrl_proc_stoped> _pctrl_proc_run_high(proc, BGRT_PROC_STATE_SYNC_READY); 80086d0: | \-> 210a movs r1, #10 80086d2: | 4620 mov r0, r4 } 80086d4: | b002 add sp, #8 80086d6: | e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} _pctrl_proc_run_high(proc, BGRT_PROC_STATE_SYNC_READY); 80086da: | e78d b.n 80085f8 <_pctrl_proc_run_high> } 80086dc: \----> b002 add sp, #8 80086de: bd70 pop {r4, r5, r6, pc} 80086e0: 200001b0 .word 0x200001b0 80086e4: 0800cacb .word 0x0800cacb 80086e8: 0800c95d .word 0x0800c95d 80086ec: 0800b232 .word 0x0800b232 80086f0: 0800c941 .word 0x0800c941 080086f4 <_sync_do_pending_wake>: { 80086f4: b513 push {r0, r1, r4, lr} BGRT_ASSERT(sync, "The #sync must not be NULL!"); 80086f6: 4604 mov r4, r0 80086f8: /-- b958 cbnz r0, 8008712 <_sync_do_pending_wake+0x1e> 80086fa: | b672 cpsid i 80086fc: | 4b0d ldr r3, [pc, #52] @ (8008734 <_sync_do_pending_wake+0x40>) 80086fe: | 4a0e ldr r2, [pc, #56] @ (8008738 <_sync_do_pending_wake+0x44>) 8008700: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008704: | 4b0d ldr r3, [pc, #52] @ (800873c <_sync_do_pending_wake+0x48>) 8008706: | 9300 str r3, [sp, #0] 8008708: | 480d ldr r0, [pc, #52] @ (8008740 <_sync_do_pending_wake+0x4c>) 800870a: | 23b4 movs r3, #180 @ 0xb4 800870c: | f7f8 fdf4 bl 80012f8 <printf_> 8008710: | be00 bkpt 0x0000 proc = (bgrt_proc_t *)bgrt_xlist_head((bgrt_xlist_t *)sync); 8008712: \-> 4620 mov r0, r4 8008714: f7ff fa92 bl 8007c3c <bgrt_xlist_head> if (proc) 8008718: /-- b150 cbz r0, 8008730 <_sync_do_pending_wake+0x3c> sync->pwake--; 800871a: | f8d4 3090 ldr.w r3, [r4, #144] @ 0x90 _sync_do_wake(proc, sync, (bgrt_flag_t)0); 800871e: | 2200 movs r2, #0 sync->pwake--; 8008720: | 3b01 subs r3, #1 _sync_do_wake(proc, sync, (bgrt_flag_t)0); 8008722: | 4621 mov r1, r4 sync->pwake--; 8008724: | f8c4 3090 str.w r3, [r4, #144] @ 0x90 } 8008728: | b002 add sp, #8 800872a: | e8bd 4010 ldmia.w sp!, {r4, lr} _sync_do_wake(proc, sync, (bgrt_flag_t)0); 800872e: | e789 b.n 8008644 <_sync_do_wake> } 8008730: \-> b002 add sp, #8 8008732: bd10 pop {r4, pc} 8008734: 200001b0 .word 0x200001b0 8008738: 0800c941 .word 0x0800c941 800873c: 0800c95d .word 0x0800c95d 8008740: 0800b232 .word 0x0800b232 08008744 <_sync_touch_prio_up>: { 8008744: b537 push {r0, r1, r2, r4, r5, lr} 8008746: 460c mov r4, r1 BGRT_ASSERT(sync, "The #sync must not be NULL!"); 8008748: 4605 mov r5, r0 800874a: /-- b960 cbnz r0, 8008766 <_sync_touch_prio_up+0x22> 800874c: | b672 cpsid i 800874e: | 4b13 ldr r3, [pc, #76] @ (800879c <_sync_touch_prio_up+0x58>) 8008750: | 4a13 ldr r2, [pc, #76] @ (80087a0 <_sync_touch_prio_up+0x5c>) 8008752: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008756: | 4b13 ldr r3, [pc, #76] @ (80087a4 <_sync_touch_prio_up+0x60>) 8008758: | 9300 str r3, [sp, #0] 800875a: | 4813 ldr r0, [pc, #76] @ (80087a8 <_sync_touch_prio_up+0x64>) 800875c: | f44f 73e5 mov.w r3, #458 @ 0x1ca 8008760: | f7f8 fdca bl 80012f8 <printf_> 8008764: | be00 bkpt 0x0000 BGRT_ASSERT(proc, "The #proc must not be NULL!"); 8008766: /--\-X b964 cbnz r4, 8008782 <_sync_touch_prio_up+0x3e> 8008768: | b672 cpsid i 800876a: | 4b0c ldr r3, [pc, #48] @ (800879c <_sync_touch_prio_up+0x58>) 800876c: | 4a0f ldr r2, [pc, #60] @ (80087ac <_sync_touch_prio_up+0x68>) 800876e: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008772: | 4b0c ldr r3, [pc, #48] @ (80087a4 <_sync_touch_prio_up+0x60>) 8008774: | 9300 str r3, [sp, #0] 8008776: | 480c ldr r0, [pc, #48] @ (80087a8 <_sync_touch_prio_up+0x64>) 8008778: | f240 13cb movw r3, #459 @ 0x1cb 800877c: | f7f8 fdbc bl 80012f8 <printf_> 8008780: | be00 bkpt 0x0000 bgrt_priv_proc_stop_ensure(proc, BGRT_PROC_STATE_STOPED); 8008782: \----> 4620 mov r0, r4 8008784: 2100 movs r1, #0 8008786: f7ff fb53 bl 8007e30 <bgrt_priv_proc_stop_ensure> _pctrl_proc_run_high(proc, BGRT_PROC_STATE_RUNNING); 800878a: 2103 movs r1, #3 800878c: 4620 mov r0, r4 proc->sync = sync; 800878e: f8c4 50a0 str.w r5, [r4, #160] @ 0xa0 } 8008792: b003 add sp, #12 8008794: e8bd 4030 ldmia.w sp!, {r4, r5, lr} _pctrl_proc_run_high(proc, BGRT_PROC_STATE_RUNNING); 8008798: e72e b.n 80085f8 <_pctrl_proc_run_high> 800879a: bf00 nop 800879c: 200001b0 .word 0x200001b0 80087a0: 0800c941 .word 0x0800c941 80087a4: 0800c95d .word 0x0800c95d 80087a8: 0800b232 .word 0x0800b232 80087ac: 0800cacb .word 0x0800cacb 080087b0 : bgrt_st_t bgrt_priv_sync_touch(bgrt_sync_t * sync) 80087b0: b508 push {r3, lr} BGRT_CNT_INC(sync->dirty); 80087b2: f8d0 3088 ldr.w r3, [r0, #136] @ 0x88 if (BGRT_CONFIG_CNT_MAX > val) 80087b6: 1c59 adds r1, r3, #1 return val + (bgrt_cnt_t)1; 80087b8: bf18 it ne 80087ba: 3301 addne r3, #1 80087bc: f8c0 3088 str.w r3, [r0, #136] @ 0x88 BGRT_CNT_INC(sync->snum); /*Increment sleeping process counter. Caller is going to sleep.*/ 80087c0: f8d0 308c ldr.w r3, [r0, #140] @ 0x8c if (BGRT_CONFIG_CNT_MAX > val) 80087c4: 1c5a adds r2, r3, #1 return val + (bgrt_cnt_t)1; 80087c6: bf18 it ne 80087c8: 3301 addne r3, #1 80087ca: f8c0 308c str.w r3, [r0, #140] @ 0x8c return BGRT_CURR_PROC; 80087ce: 4b03 ldr r3, [pc, #12] @ (80087dc ) _sync_touch_prio_up(sync, current); 80087d0: f8d3 1090 ldr.w r1, [r3, #144] @ 0x90 80087d4: f7ff ffb6 bl 8008744 <_sync_touch_prio_up> } 80087d8: 2000 movs r0, #0 80087da: bd08 pop {r3, pc} 80087dc: 200001b0 .word 0x200001b0 080087e0 : if (!sync) 80087e0: /-- b100 cbz r0, 80087e4 <BGRT_SC_SYNC_TOUCH_SR+0x4> 80087e2: | e7e5 b.n 80087b0 <bgrt_priv_sync_touch.part.0> } 80087e4: \-> 2001 movs r0, #1 80087e6: 4770 bx lr 080087e8 <_pctrl_proc_run>: { 80087e8: b537 push {r0, r1, r2, r4, r5, lr} 80087ea: 460d mov r5, r1 BGRT_ASSERT(proc, "The #proc must not be NULL!"); 80087ec: 4604 mov r4, r0 80087ee: /-- b958 cbnz r0, 8008808 <_pctrl_proc_run+0x20> 80087f0: | b672 cpsid i 80087f2: | 4b0a ldr r3, [pc, #40] @ (800881c <_pctrl_proc_run+0x34>) 80087f4: | 4a0a ldr r2, [pc, #40] @ (8008820 <_pctrl_proc_run+0x38>) 80087f6: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 80087fa: | 4b0a ldr r3, [pc, #40] @ (8008824 <_pctrl_proc_run+0x3c>) 80087fc: | 9300 str r3, [sp, #0] 80087fe: | 480a ldr r0, [pc, #40] @ (8008828 <_pctrl_proc_run+0x40>) 8008800: | 236f movs r3, #111 @ 0x6f 8008802: | f7f8 fd79 bl 80012f8 <printf_> 8008806: | be00 bkpt 0x0000 _pctrl_proc_stoped(proc); 8008808: \-> 4620 mov r0, r4 800880a: f7ff fa39 bl 8007c80 <_pctrl_proc_stoped> bgrt_sched_proc_run(proc, state); 800880e: 4629 mov r1, r5 8008810: 4620 mov r0, r4 } 8008812: b003 add sp, #12 8008814: e8bd 4030 ldmia.w sp!, {r4, r5, lr} bgrt_sched_proc_run(proc, state); 8008818: e660 b.n 80084dc <bgrt_sched_proc_run> 800881a: bf00 nop 800881c: 200001b0 .word 0x200001b0 8008820: 0800cacb .word 0x0800cacb 8008824: 0800c95d .word 0x0800c95d 8008828: 0800b232 .word 0x0800b232 0800882c <_pctrl_proc_running>: { 800882c: b537 push {r0, r1, r2, r4, r5, lr} 800882e: 460d mov r5, r1 BGRT_ASSERT(proc, "The #proc must not be NULL!"); 8008830: 4604 mov r4, r0 8008832: /-- b958 cbnz r0, 800884c <_pctrl_proc_running+0x20> 8008834: | b672 cpsid i 8008836: | 4b0a ldr r3, [pc, #40] @ (8008860 <_pctrl_proc_running+0x34>) 8008838: | 4a0a ldr r2, [pc, #40] @ (8008864 <_pctrl_proc_running+0x38>) 800883a: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800883e: | 4b0a ldr r3, [pc, #40] @ (8008868 <_pctrl_proc_running+0x3c>) 8008840: | 9300 str r3, [sp, #0] 8008842: | 480a ldr r0, [pc, #40] @ (800886c <_pctrl_proc_running+0x40>) 8008844: | 2377 movs r3, #119 @ 0x77 8008846: | f7f8 fd57 bl 80012f8 <printf_> 800884a: | be00 bkpt 0x0000 bgrt_priv_proc_stop_ensure(proc, BGRT_PROC_STATE_STOPED); 800884c: \-> 4620 mov r0, r4 800884e: 2100 movs r1, #0 8008850: f7ff faee bl 8007e30 <bgrt_priv_proc_stop_ensure> _pctrl_proc_run(proc, state); 8008854: 4629 mov r1, r5 8008856: 4620 mov r0, r4 } 8008858: b003 add sp, #12 800885a: e8bd 4030 ldmia.w sp!, {r4, r5, lr} _pctrl_proc_run(proc, state); 800885e: e7c3 b.n 80087e8 <_pctrl_proc_run> 8008860: 200001b0 .word 0x200001b0 8008864: 0800cacb .word 0x0800cacb 8008868: 0800c95d .word 0x0800c95d 800886c: 0800b232 .word 0x0800b232 08008870 : BGRT_SPIN_FREE(sync); return status; } /*====================================================================================*/ bgrt_st_t bgrt_priv_sync_wake(bgrt_sync_t * sync, bgrt_proc_t * proc, bgrt_flag_t chown) { 8008870: b5f8 push {r3, r4, r5, r6, r7, lr} 8008872: 4606 mov r6, r0 8008874: 460c mov r4, r1 8008876: 4615 mov r5, r2 bgrt_proc_t * owner; bgrt_st_t status; bgrt_priv_proc_reset_watchdog(); 8008878: f7fe ff98 bl 80077ac <bgrt_priv_proc_reset_watchdog> if (!sync) 800887c: 2800 cmp r0, #0 800887e: /-------------------- d051 beq.n 8008924 <bgrt_priv_sync_wake+0xb4> { return BGRT_ST_ENULL; } BGRT_SPIN_LOCK(sync); owner = sync->owner; 8008880: | f8d0 7084 ldr.w r7, [r0, #132] @ 0x84 /*Check sync ownership*/ if (owner) 8008884: | /-- b16f cbz r7, 80088a2 <bgrt_priv_sync_wake+0x32> 8008886: | | 4b2a ldr r3, [pc, #168] @ (8008930 ) { if (bgrt_curr_proc() != owner) 8008888: | | f8d3 3090 ldr.w r3, [r3, #144] @ 0x90 800888c: | | 429f cmp r7, r3 800888e: | /--------------|-- d14b bne.n 8008928 <bgrt_priv_sync_wake+0xb8> BGRT_SPIN_FREE(sync); return BGRT_ST_EOWN; } /*Check for dirty priority inheritance transactions*/ if (sync->dirty) 8008890: | | | f8d0 3088 ldr.w r3, [r0, #136] @ 0x88 8008894: | | /-----|-- b193 cbz r3, 80088bc <bgrt_priv_sync_wake+0x4c> { _sync_owner_block(owner); 8008896: | | | | 4638 mov r0, r7 8008898: | | | | f7ff fb4c bl 8007f34 <_sync_owner_block> BGRT_SPIN_FREE(sync); return BGRT_ST_ROLL; 800889c: | | | | 2409 movs r4, #9 BGRT_SPIN_FREE(owner); } BGRT_SPIN_FREE(sync); return status; } 800889e: | | /-----|-----|-> 4620 mov r0, r4 80088a0: | | | | | bdf8 pop {r3, r4, r5, r6, r7, pc} if (proc) 80088a2: | | | | \-> 2900 cmp r1, #0 80088a4: | +--|-----|-------- d140 bne.n 8008928 <bgrt_priv_sync_wake+0xb8> if (sync->dirty) 80088a6: | | | | f8d0 3088 ldr.w r3, [r0, #136] @ 0x88 80088aa: | | | | /----- b173 cbz r3, 80088ca <bgrt_priv_sync_wake+0x5a> if (sync->pwake < sync->snum) 80088ac: | | | | | e9d0 2323 ldrd r2, r3, [r0, #140] @ 0x8c 80088b0: | | | | | 4293 cmp r3, r2 80088b2: | | | /--|--|----- d23b bcs.n 800892c <bgrt_priv_sync_wake+0xbc> sync->pwake++; 80088b4: | | | | | | 3301 adds r3, #1 80088b6: | | | | | | f8c0 3090 str.w r3, [r0, #144] @ 0x90 status = BGRT_ST_OK; 80088ba: | | +--|--|--|----- e7f0 b.n 800889e <bgrt_priv_sync_wake+0x2e> if (proc) /* ADLINT:SL:[W0613] always false??? WTF??!*/ 80088bc: | | | | \--+----X b129 cbz r1, 80088ca <bgrt_priv_sync_wake+0x5a> if (proc->sync != sync) 80088be: | | | | | f8d1 30a0 ldr.w r3, [r1, #160] @ 0xa0 80088c2: | | | | | 4283 cmp r3, r0 80088c4: | | | | | /-- d006 beq.n 80088d4 <bgrt_priv_sync_wake+0x64> return BGRT_ST_ESYNC; 80088c6: | | | | | | 2404 movs r4, #4 80088c8: | | +--|-----|--|-- e7e9 b.n 800889e <bgrt_priv_sync_wake+0x2e> proc = (bgrt_proc_t *)bgrt_xlist_head((bgrt_xlist_t *)sync); 80088ca: | | | | \--|-> 4630 mov r0, r6 80088cc: | | | | | f7ff f9b6 bl 8007c3c <bgrt_xlist_head> 80088d0: | | | | | 4604 mov r4, r0 if (owner) 80088d2: | | | | /--|-- b15f cbz r7, 80088ec <bgrt_priv_sync_wake+0x7c> bgrt_sched_proc_stop(owner, BGRT_PROC_STATE_STOPED); 80088d4: | | | | | \-> 2100 movs r1, #0 80088d6: | | | | | 4638 mov r0, r7 80088d8: | | | | | f7ff fa80 bl 8007ddc <bgrt_sched_proc_stop> BGRT_PROC_LRES_DEC(owner, BGRT_SYNC_PRIO(sync)); /* ADLINT:SL:[W1073] retval discarded*/ 80088dc: | | | | | 4630 mov r0, r6 80088de: | | | | | f7ff f9f5 bl 8007ccc <bgrt_priv_sync_prio> 80088e2: | | | | | 4601 mov r1, r0 80088e4: | | | | | f107 0014 add.w r0, r7, #20 80088e8: | | | | | f7ff f972 bl 8007bd0 <bgrt_pcounter_dec.isra.0> if (chown) 80088ec: | | | | \--/-X b10d cbz r5, 80088f2 <bgrt_priv_sync_wake+0x82> sync->owner = proc; 80088ee: | | | | | f8c6 4084 str.w r4, [r6, #132] @ 0x84 if (proc) 80088f2: | | | | /-----\-X b1ac cbz r4, 8008920 <bgrt_priv_sync_wake+0xb0> _sync_do_wake(proc, sync, chown); 80088f4: | | | | | 4620 mov r0, r4 80088f6: | | | | | 462a mov r2, r5 80088f8: | | | | | 4631 mov r1, r6 80088fa: | | | | | f7ff fea3 bl 8008644 <_sync_do_wake> status = BGRT_ST_OK; 80088fe: | | | | | 2400 movs r4, #0 if (owner) 8008900: | | | | | /----> 2f00 cmp r7, #0 8008902: | | +--|--|--|----- d0cc beq.n 800889e <bgrt_priv_sync_wake+0x2e> if (!chown) 8008904: | | | | | | /-- b93d cbnz r5, 8008916 <bgrt_priv_sync_wake+0xa6> BGRT_PROC_LRES_INC(owner, BGRT_SYNC_PRIO(sync)); 8008906: | | | | | | | 4630 mov r0, r6 8008908: | | | | | | | f7ff f9e0 bl 8007ccc <bgrt_priv_sync_prio> 800890c: | | | | | | | 4601 mov r1, r0 800890e: | | | | | | | f107 0014 add.w r0, r7, #20 8008912: | | | | | | | f7ff f806 bl 8007922 <bgrt_pcounter_inc> _pctrl_proc_run(owner, BGRT_PROC_STATE_READY); 8008916: | | | | | | \-> 2102 movs r1, #2 8008918: | | | | | | 4638 mov r0, r7 800891a: | | | | | | f7ff ff65 bl 80087e8 <_pctrl_proc_run> 800891e: | | +--|--|--|----- e7be b.n 800889e <bgrt_priv_sync_wake+0x2e> status = BGRT_ST_EEMPTY; 8008920: | | | | \--|----> 2403 movs r4, #3 8008922: | | | | \----- e7ed b.n 8008900 <bgrt_priv_sync_wake+0x90> return BGRT_ST_ENULL; 8008924: \--|--|--|----------> 2401 movs r4, #1 8008926: | +--|----------- e7ba b.n 800889e <bgrt_priv_sync_wake+0x2e> return BGRT_ST_EOWN; 8008928: \--|--|----------> 2402 movs r4, #2 800892a: +--|----------- e7b8 b.n 800889e <bgrt_priv_sync_wake+0x2e> status = BGRT_ST_EEMPTY; /*We can,t wake more processes.*/ 800892c: | \----------> 2403 movs r4, #3 800892e: \-------------- e7b6 b.n 800889e <bgrt_priv_sync_wake+0x2e> 8008930: 200001b0 .word 0x200001b0 08008934 : { 8008934: b507 push {r0, r1, r2, lr} va_copy(param, va->list); 8008936: 6803 ldr r3, [r0, #0] sync = (bgrt_sync_t *)va_arg(param, void *); 8008938: 1d1a adds r2, r3, #4 800893a: 9201 str r2, [sp, #4] return bgrt_priv_sync_wake(sync, BGRT_PID_TO_PROC(pid), chown); 800893c: e9d3 0100 ldrd r0, r1, [r3] 8008940: 7a1a ldrb r2, [r3, #8] 8008942: f7ff ff95 bl 8008870 <bgrt_priv_sync_wake> } 8008946: b003 add sp, #12 8008948: f85d fb04 ldr.w pc, [sp], #4 0800894c <_sem_free_payload>: { 800894c: b513 push {r0, r1, r4, lr} BGRT_ASSERT(va, "The #va must not be NULL!"); 800894e: 4604 mov r4, r0 8008950: /-- b958 cbnz r0, 800896a <_sem_free_payload+0x1e> 8008952: | b672 cpsid i 8008954: | 4b15 ldr r3, [pc, #84] @ (80089ac <_sem_free_payload+0x60>) 8008956: | 4a16 ldr r2, [pc, #88] @ (80089b0 <_sem_free_payload+0x64>) 8008958: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800895c: | 4b15 ldr r3, [pc, #84] @ (80089b4 <_sem_free_payload+0x68>) 800895e: | 9300 str r3, [sp, #0] 8008960: | 4815 ldr r0, [pc, #84] @ (80089b8 <_sem_free_payload+0x6c>) 8008962: | 23dd movs r3, #221 @ 0xdd 8008964: | f7f8 fcc8 bl 80012f8 <printf_> 8008968: | be00 bkpt 0x0000 sem = (bgrt_sem_t *)va_arg(va->list, void *); 800896a: \-> 6823 ldr r3, [r4, #0] 800896c: 1d1a adds r2, r3, #4 800896e: 6022 str r2, [r4, #0] 8008970: 681c ldr r4, [r3, #0] BGRT_ASSERT(sem, "The #sem must not be NULL!"); 8008972: /-- b95c cbnz r4, 800898c <_sem_free_payload+0x40> 8008974: | b672 cpsid i 8008976: | 4b0d ldr r3, [pc, #52] @ (80089ac <_sem_free_payload+0x60>) 8008978: | 4a10 ldr r2, [pc, #64] @ (80089bc <_sem_free_payload+0x70>) 800897a: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800897e: | 4b0d ldr r3, [pc, #52] @ (80089b4 <_sem_free_payload+0x68>) 8008980: | 9300 str r3, [sp, #0] 8008982: | 480d ldr r0, [pc, #52] @ (80089b8 <_sem_free_payload+0x6c>) 8008984: | 23e1 movs r3, #225 @ 0xe1 8008986: | f7f8 fcb7 bl 80012f8 <printf_> 800898a: | be00 bkpt 0x0000 ret = bgrt_priv_sync_wake((bgrt_sync_t *)sem, (bgrt_proc_t *)0, (bgrt_flag_t)0); 800898c: \-> 2200 movs r2, #0 800898e: 4611 mov r1, r2 8008990: 4620 mov r0, r4 8008992: f7ff ff6d bl 8008870 <bgrt_priv_sync_wake> if (BGRT_ST_EEMPTY == ret) 8008996: 2803 cmp r0, #3 sem->counter++; 8008998: bf01 itttt eq 800899a: f8d4 3098 ldreq.w r3, [r4, #152] @ 0x98 ret = BGRT_ST_OK; 800899e: 2000 moveq r0, #0 sem->counter++; 80089a0: 3301 addeq r3, #1 80089a2: f8c4 3098 streq.w r3, [r4, #152] @ 0x98 } 80089a6: b002 add sp, #8 80089a8: bd10 pop {r4, pc} 80089aa: bf00 nop 80089ac: 200001b0 .word 0x200001b0 80089b0: 0800cc6a .word 0x0800cc6a 80089b4: 0800cc84 .word 0x0800cc84 80089b8: 0800b232 .word 0x0800b232 80089bc: 0800cc9b .word 0x0800cc9b 080089c0 : { 80089c0: b5f8 push {r3, r4, r5, r6, r7, lr} sched = BGRT_SCHED_INIT(); /* ADLINT:SL:[W0567,W0705] Int to pointer, OOR*/ BGRT_ASSERT(sched, "The #sched must not be NULL!"); proc = sched->current_proc; 80089c2: 4e21 ldr r6, [pc, #132] @ (8008a48 ) 80089c4: f8d6 5090 ldr.w r5, [r6, #144] @ 0x90 BGRT_SPIN_LOCK(proc); if (BGRT_PROC_RUN_TEST(proc)) 80089c8: 7c2b ldrb r3, [r5, #16] 80089ca: f013 0402 ands.w r4, r3, #2 80089ce: 4607 mov r7, r0 80089d0: /----------- d017 beq.n 8008a02 <BGRT_SC_SCHED_PROC_YIELD_SR+0x42> { if (proc->flags & BGRT_PROC_FLG_RT) 80089d2: | 061b lsls r3, r3, #24 80089d4: | /-------- d522 bpl.n 8008a1c <BGRT_SC_SCHED_PROC_YIELD_SR+0x5c> { bgrt_prio_t prio; bgrt_map_t mask = ~(bgrt_map_t)0; mask <<= ((bgrt_pitem_t *)proc)->prio; /* ADLINT:SL:[W0165] type conversion*/ 80089d6: | | 7b2c ldrb r4, [r5, #12] prio = ((bgrt_pitem_t *)proc)->prio; BGRT_SPIN_LOCK(sched); bgrt_xlist_switch(sched->ready, prio); /* ADLINT:SL:[W1026] 1st arg type*/ 80089d8: | | f8d6 0094 ldr.w r0, [r6, #148] @ 0x94 80089dc: | | 4621 mov r1, r4 80089de: | | f7fe ffef bl 80079c0 <bgrt_xlist_switch> /* Is there any other process in proc sublist? If none, then we probably can save power...*/ save_power = (bgrt_bool_t)(sched->ready->item[prio] == (bgrt_item_t *)proc);/* ADLINT:SL:[W0567,W0608,W0705] type conversions*/ 80089e2: | | f8d6 3094 ldr.w r3, [r6, #148] @ 0x94 BGRT_SPIN_FREE(sched); /*Are there higher prio processes in sched->ready?*/ proc_map &= mask; /* ADLINT:SL:[W0165] type conversions*/ /* If there are some processes with proc->parent->group->prio >= prio, then we can't save power.*/ save_power = save_power || ((bgrt_bool_t)!proc_map); /* ADLINT:SL:[W0608,W0168] type conversions*/ 80089e6: | | f853 2024 ldr.w r2, [r3, r4, lsl #2] 80089ea: | | 4295 cmp r5, r2 80089ec: | | /----- d014 beq.n 8008a18 <BGRT_SC_SCHED_PROC_YIELD_SR+0x58> proc_map = sched->ready->map; 80089ee: | | | f8d3 2080 ldr.w r2, [r3, #128] @ 0x80 mask <<= ((bgrt_pitem_t *)proc)->prio; /* ADLINT:SL:[W0165] type conversion*/ 80089f2: | | | f04f 33ff mov.w r3, #4294967295 @ 0xffffffff 80089f6: | | | 40a3 lsls r3, r4 save_power = save_power || ((bgrt_bool_t)!proc_map); /* ADLINT:SL:[W0608,W0168] type conversions*/ 80089f8: | | | 439a bics r2, r3 80089fa: | | | bf0c ite eq 80089fc: | | | 2401 moveq r4, #1 80089fe: | | | 2400 movne r4, #0 8008a00: | | | /-> b2e4 uxtb r4, r4 save_power = (bgrt_bool_t)!proc_map; /* ADLINT:SL:[W0608,W0168] type conversions*/ } } proc->timer = proc->time_quant; /* reset timer*/ 8008a02: >--|--|--|-> f8d5 3098 ldr.w r3, [r5, #152] @ 0x98 bgrt_atm_bset(&BGRT_KBLOCK.lpmap, BGRT_KBLOCK_VRESCH); 8008a06: | | | | 4811 ldr r0, [pc, #68] @ (8008a4c ) 8008a08: | | | | f8c5 309c str.w r3, [r5, #156] @ 0x9c 8008a0c: | | | | 2104 movs r1, #4 8008a0e: | | | | f7f8 fc37 bl 8001280 <bgrt_atm_bset.lto_priv.0.lto_priv.0> *(bgrt_bool_t *)arg = ret; 8008a12: | | | | 703c strb r4, [r7, #0] } 8008a14: | | | | 2000 movs r0, #0 8008a16: | | | | bdf8 pop {r3, r4, r5, r6, r7, pc} save_power = save_power || ((bgrt_bool_t)!proc_map); /* ADLINT:SL:[W0608,W0168] type conversions*/ 8008a18: | | \--|-> 2401 movs r4, #1 8008a1a: | | \-- e7f1 b.n 8008a00 <BGRT_SC_SCHED_PROC_YIELD_SR+0x40> proc_map = sched->expired->map; 8008a1c: | \-------> f8d6 3098 ldr.w r3, [r6, #152] @ 0x98 bgrt_pitem_fast_cut((bgrt_pitem_t *)proc); 8008a20: | 4628 mov r0, r5 proc_map = sched->expired->map; 8008a22: | f8d3 4080 ldr.w r4, [r3, #128] @ 0x80 bgrt_pitem_fast_cut((bgrt_pitem_t *)proc); 8008a26: | f7ff f82b bl 8007a80 <bgrt_pitem_fast_cut> proc_map |= sched->ready->map; /* ADLINT:SL:[W0165] type conversions*/ 8008a2a: | f8d6 3094 ldr.w r3, [r6, #148] @ 0x94 bgrt_pitem_insert((bgrt_pitem_t *)proc, sched->expired); /* ADLINT:SL:[W1026] 2nd arg type*/ 8008a2e: | f8d6 1098 ldr.w r1, [r6, #152] @ 0x98 proc_map |= sched->ready->map; /* ADLINT:SL:[W0165] type conversions*/ 8008a32: | f8d3 3080 ldr.w r3, [r3, #128] @ 0x80 8008a36: | 431c orrs r4, r3 bgrt_pitem_insert((bgrt_pitem_t *)proc, sched->expired); /* ADLINT:SL:[W1026] 2nd arg type*/ 8008a38: | 4628 mov r0, r5 save_power = (bgrt_bool_t)!proc_map; /* ADLINT:SL:[W0608,W0168] type conversions*/ 8008a3a: | fab4 f484 clz r4, r4 bgrt_pitem_insert((bgrt_pitem_t *)proc, sched->expired); /* ADLINT:SL:[W1026] 2nd arg type*/ 8008a3e: | f7ff fcdf bl 8008400 <bgrt_pitem_insert> save_power = (bgrt_bool_t)!proc_map; /* ADLINT:SL:[W0608,W0168] type conversions*/ 8008a42: | 0964 lsrs r4, r4, #5 8008a44: \----------- e7dd b.n 8008a02 <BGRT_SC_SCHED_PROC_YIELD_SR+0x42> 8008a46: bf00 nop 8008a48: 200001b0 .word 0x200001b0 8008a4c: 2000023c .word 0x2000023c 08008a50 <_pctrl_propagate>: { 8008a50: b573 push {r0, r1, r4, r5, r6, lr} BGRT_ASSERT(proc, "The #proc must not be NULL!"); 8008a52: 4604 mov r4, r0 8008a54: /-- b958 cbnz r0, 8008a6e <_pctrl_propagate+0x1e> 8008a56: | b672 cpsid i 8008a58: | 4b39 ldr r3, [pc, #228] @ (8008b40 <_pctrl_propagate+0xf0>) 8008a5a: | 4a3a ldr r2, [pc, #232] @ (8008b44 <_pctrl_propagate+0xf4>) 8008a5c: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008a60: | 4b39 ldr r3, [pc, #228] @ (8008b48 <_pctrl_propagate+0xf8>) 8008a62: | 9300 str r3, [sp, #0] 8008a64: | 4839 ldr r0, [pc, #228] @ (8008b4c <_pctrl_propagate+0xfc>) 8008a66: | 23cf movs r3, #207 @ 0xcf 8008a68: | f7f8 fc46 bl 80012f8 <printf_> 8008a6c: | be00 bkpt 0x0000 switch(BGRT_PROC_GET_STATE(proc)) 8008a6e: \-> 7c23 ldrb r3, [r4, #16] 8008a70: f003 010f and.w r1, r3, #15 8008a74: 290f cmp r1, #15 8008a76: /-------------- d861 bhi.n 8008b3c <_pctrl_propagate+0xec> 8008a78: | e8df f001 tbb [pc, r1] 8008a7c: | 08085a5a .word 0x08085a5a 8008a80: | 08085a5a .word 0x08085a5a 8008a84: | 08080d15 .word 0x08080d15 8008a88: | 08086060 .word 0x08086060 _pctrl_proc_running(proc, state); 8008a8c: | 4620 mov r0, r4 } 8008a8e: | b002 add sp, #8 8008a90: | e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} _pctrl_proc_running(proc, state); 8008a94: | e6ca b.n 800882c <_pctrl_proc_running> BGRT_PROC_SET_STATE(proc, BGRT_PROC_STATE_PI_PEND); /* ADLINT:SL:[W0447] coma operator*/ 8008a96: | f023 030f bic.w r3, r3, #15 sync = proc->sync; 8008a9a: | f8d4 50a0 ldr.w r5, [r4, #160] @ 0xa0 BGRT_PROC_SET_STATE(proc, BGRT_PROC_STATE_PI_PEND); /* ADLINT:SL:[W0447] coma operator*/ 8008a9e: | f043 030c orr.w r3, r3, #12 8008aa2: | 7423 strb r3, [r4, #16] if ((bgrt_sync_t *)0 == sync) /* ADLINT:SL:[W0567] type conversion*/ 8008aa4: | /-- b92d cbnz r5, 8008ab2 <_pctrl_propagate+0x62> _pctrl_proc_run(proc, BGRT_PROC_STATE_READY); 8008aa6: | | 2102 movs r1, #2 8008aa8: | | 4620 mov r0, r4 } 8008aaa: | | b002 add sp, #8 8008aac: | | e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} _pctrl_proc_run(proc, BGRT_PROC_STATE_READY); 8008ab0: | | e69a b.n 80087e8 <_pctrl_proc_run> old_prio = BGRT_SYNC_PRIO(sync); /* Get sync prio to keep sync->owner priority data consistent*/ 8008ab2: | \-> 4628 mov r0, r5 8008ab4: | f7ff f90a bl 8007ccc <bgrt_priv_sync_prio> 8008ab8: | 4606 mov r6, r0 bgrt_pitem_cut((bgrt_pitem_t *)proc); 8008aba: | 4620 mov r0, r4 8008abc: | f7ff f86a bl 8007b94 <bgrt_pitem_cut> if (BGRT_PROC_STATE_PI_PEND == BGRT_PROC_GET_STATE(proc)) 8008ac0: | 7c23 ldrb r3, [r4, #16] 8008ac2: | f003 030f and.w r3, r3, #15 8008ac6: | 2b0c cmp r3, #12 8008ac8: | /----------- d130 bne.n 8008b2c <_pctrl_propagate+0xdc> if (sync->owner) 8008aca: | | f8d5 3084 ldr.w r3, [r5, #132] @ 0x84 8008ace: | | /-- b15b cbz r3, 8008ae8 <_pctrl_propagate+0x98> BGRT_CNT_INC(sync->dirty); 8008ad0: | | | f8d5 3088 ldr.w r3, [r5, #136] @ 0x88 if (BGRT_CONFIG_CNT_MAX > val) 8008ad4: | | | 1c5a adds r2, r3, #1 return val + (bgrt_cnt_t)1; 8008ad6: | | | bf18 it ne 8008ad8: | | | 3301 addne r3, #1 8008ada: | | | f8c5 3088 str.w r3, [r5, #136] @ 0x88 _pctrl_proc_run_high(proc, BGRT_PROC_STATE_PI_READY); 8008ade: | | | 210e movs r1, #14 _pctrl_proc_run_high(proc, BGRT_PROC_STATE_SYNC_READY); 8008ae0: | | /-----|-> 4620 mov r0, r4 8008ae2: | | | | f7ff fd89 bl 80085f8 <_pctrl_proc_run_high> 8008ae6: | | | /--|-- e00c b.n 8008b02 <_pctrl_propagate+0xb2> _pctrl_proc_stoped(proc); 8008ae8: | | | | \-> 4620 mov r0, r4 8008aea: | | | | f7ff f8c9 bl 8007c80 <_pctrl_proc_stoped> BGRT_PROC_SET_STATE(proc, BGRT_PROC_STATE_SYNC_SLEEP); /* ADLINT:SL:[W0447] coma operator*/ 8008aee: | | | | 7c23 ldrb r3, [r4, #16] 8008af0: | | | | f023 030f bic.w r3, r3, #15 8008af4: | | | | f043 0309 orr.w r3, r3, #9 8008af8: | | | | 7423 strb r3, [r4, #16] bgrt_pitem_insert((bgrt_pitem_t *)proc, (bgrt_xlist_t *)sync); 8008afa: | | | | 4629 mov r1, r5 8008afc: | | | | 4620 mov r0, r4 8008afe: | | | | f7ff fc7f bl 8008400 <bgrt_pitem_insert> proc = sync->owner; 8008b02: | | | \----> f8d5 4084 ldr.w r4, [r5, #132] @ 0x84 if (proc) 8008b06: +--|--|-------- b1cc cbz r4, 8008b3c <_pctrl_propagate+0xec> new_prio = BGRT_SYNC_PRIO(sync); 8008b08: | | | 4628 mov r0, r5 8008b0a: | | | f7ff f8df bl 8007ccc <bgrt_priv_sync_prio> if (new_prio != old_prio) 8008b0e: | | | 4286 cmp r6, r0 new_prio = BGRT_SYNC_PRIO(sync); 8008b10: | | | 4605 mov r5, r0 if (new_prio != old_prio) 8008b12: +--|--|-------- d013 beq.n 8008b3c <_pctrl_propagate+0xec> BGRT_PROC_LRES_DEC(proc, old_prio); /* ADLINT:SL:[W1073] retval discarded*/ 8008b14: | | | 3414 adds r4, #20 8008b16: | | | 4631 mov r1, r6 8008b18: | | | 4620 mov r0, r4 8008b1a: | | | f7ff f859 bl 8007bd0 <bgrt_pcounter_dec.isra.0> BGRT_PROC_LRES_INC(proc, new_prio); 8008b1e: | | | 4629 mov r1, r5 8008b20: | | | 4620 mov r0, r4 } 8008b22: | | | b002 add sp, #8 8008b24: | | | e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} BGRT_PROC_LRES_INC(proc, new_prio); 8008b28: | | | f7fe befb b.w 8007922 <bgrt_pcounter_inc> _pctrl_proc_run_high(proc, BGRT_PROC_STATE_SYNC_READY); 8008b2c: | \--|-------> 210a movs r1, #10 8008b2e: | \-------- e7d7 b.n 8008ae0 <_pctrl_propagate+0x90> _pctrl_proc_stoped(proc); 8008b30: | 4620 mov r0, r4 } 8008b32: | b002 add sp, #8 8008b34: | e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} _pctrl_proc_stoped(proc); 8008b38: | f7ff b8a2 b.w 8007c80 <_pctrl_proc_stoped> } 8008b3c: \-------------> b002 add sp, #8 8008b3e: bd70 pop {r4, r5, r6, pc} 8008b40: 200001b0 .word 0x200001b0 8008b44: 0800cacb .word 0x0800cacb 8008b48: 0800c95d .word 0x0800c95d 8008b4c: 0800b232 .word 0x0800b232 08008b50 : pid = (BGRT_PID_T)va_arg(va->list, void *); 8008b50: 6802 ldr r2, [r0, #0] 8008b52: 1d11 adds r1, r2, #4 { 8008b54: b508 push {r3, lr} pid = (BGRT_PID_T)va_arg(va->list, void *); 8008b56: 6001 str r1, [r0, #0] 8008b58: 4611 mov r1, r2 { 8008b5a: 4603 mov r3, r0 pid = (BGRT_PID_T)va_arg(va->list, void *); 8008b5c: f851 0b08 ldr.w r0, [r1], #8 bgrt_priv_proc_set_prio(BGRT_PID_TO_PROC(pid), (bgrt_prio_t)va_arg(va->list, int)); 8008b60: 6019 str r1, [r3, #0] 8008b62: 7913 ldrb r3, [r2, #4] if (!proc) 8008b64: /-- b910 cbnz r0, 8008b6c <BGRT_SC_PROC_SET_PRIO_SR+0x1c> return BGRT_CURR_PROC; 8008b66: | 4a04 ldr r2, [pc, #16] @ (8008b78 ) 8008b68: | f8d2 0090 ldr.w r0, [r2, #144] @ 0x90 proc->base_prio = prio; 8008b6c: \-> 7443 strb r3, [r0, #17] BGRT_PROC_PS_PI_PRIO_PROPAGATE(proc); /* ADLINT:SL:[W0553,W0021] function type conversion, volatile discarded*/ 8008b6e: f7ff ff6f bl 8008a50 <_pctrl_propagate> } 8008b72: 2000 movs r0, #0 8008b74: bd08 pop {r3, pc} 8008b76: bf00 nop 8008b78: 200001b0 .word 0x200001b0 08008b7c : { 8008b7c: b5f8 push {r3, r4, r5, r6, r7, lr} 8008b7e: 4604 mov r4, r0 bgrt_st_t bgrt_priv_sync_proc_timeout(bgrt_proc_t * proc) { bgrt_st_t status; bgrt_sync_t * sync; bgrt_priv_proc_reset_watchdog(); 8008b80: f7fe fe14 bl 80077ac <bgrt_priv_proc_reset_watchdog> status = BGRT_ST_OK; if (!proc) 8008b84: 2800 cmp r0, #0 8008b86: /----------------- d052 beq.n 8008c2e <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0xb2> { return BGRT_ST_ENULL; } BGRT_SPIN_LOCK(proc); sync = proc->sync; 8008b88: | f8d0 50a0 ldr.w r5, [r0, #160] @ 0xa0 BGRT_SPIN_FREE(proc); if ((bgrt_sync_t *)0 == sync) /* ADLINT:SL:[W0567] type conversion*/ 8008b8c: | /----- b97d cbnz r5, 8008bae <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0x32> { BGRT_KERNEL_PREEMPT(); /* ADLINT:SL:[W0705,W0067] OOR access*/ BGRT_SPIN_LOCK(proc); switch(BGRT_PROC_GET_STATE(proc)) 8008b8e: | | 7c03 ldrb r3, [r0, #16] 8008b90: | | f003 030f and.w r3, r3, #15 8008b94: | | 2b08 cmp r3, #8 8008b96: | | /-- d005 beq.n 8008ba4 <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0x28> 8008b98: | | | f1b3 0009 subs.w r0, r3, #9 8008b9c: | | | bf18 it ne 8008b9e: | | | 2001 movne r0, #1 8008ba0: | | | 0080 lsls r0, r0, #2 } 8008ba2: | /--------|--|-> bdf8 pop {r3, r4, r5, r6, r7, pc} { case BGRT_PROC_STATE_SYNC_WAIT: { /*Is waiting on empty sync, wake up*/ status = BGRT_ST_OK; bgrt_sched_proc_run(proc, BGRT_PROC_STATE_TO_READY); 8008ba4: | | | \-> 2106 movs r1, #6 8008ba6: | | | f7ff fc99 bl 80084dc <bgrt_sched_proc_run> status = BGRT_ST_OK; 8008baa: | | /-----|----> 2000 movs r0, #0 8008bac: | +--|-----|----- e7f9 b.n 8008ba2 <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0x26> } else { bgrt_cnt_t pwake; pwake = sync->pwake; 8008bae: | | | \----> f8d5 3090 ldr.w r3, [r5, #144] @ 0x90 if ((pwake)&&(pwake >= sync->snum)) 8008bb2: | | | /-- b11b cbz r3, 8008bbc <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0x40> 8008bb4: | | | | f8d5 208c ldr.w r2, [r5, #140] @ 0x8c 8008bb8: | | | | 4293 cmp r3, r2 8008bba: | | +--------|-- d2f6 bcs.n 8008baa <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0x2e> return BGRT_ST_OK; } } switch(BGRT_PROC_GET_STATE(proc)) 8008bbc: | | | \-> 7c23 ldrb r3, [r4, #16] 8008bbe: | | | f003 030f and.w r3, r3, #15 8008bc2: | | | 2b0c cmp r3, #12 8008bc4: | | | /-------- d031 beq.n 8008c2a <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0xae> 8008bc6: | | | | /----- d82d bhi.n 8008c24 <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0xa8> 8008bc8: | | | | | 2b09 cmp r3, #9 8008bca: | | +--|--|----- d1ee bne.n 8008baa <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0x2e> case BGRT_PROC_STATE_SYNC_SLEEP: { /*Undo BGRT_SYNC_SLEEP*/ bgrt_prio_t old_prio; BGRT_CNT_DEC(sync->snum); /*One sleeping proc less*/ 8008bcc: | | | | | f8d5 308c ldr.w r3, [r5, #140] @ 0x8c if (val) 8008bd0: | | | | | /-- b103 cbz r3, 8008bd4 <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0x58> return val - (bgrt_cnt_t)1; 8008bd2: | | | | | | 3b01 subs r3, #1 8008bd4: | | | | | \-> f8c5 308c str.w r3, [r5, #140] @ 0x8c old_prio = BGRT_SYNC_PRIO(sync); 8008bd8: | | | | | 4628 mov r0, r5 8008bda: | | | | | f7ff f877 bl 8007ccc <bgrt_priv_sync_prio> 8008bde: | | | | | 4606 mov r6, r0 bgrt_pitem_cut((bgrt_pitem_t *)proc); 8008be0: | | | | | 4620 mov r0, r4 8008be2: | | | | | f7fe ffd7 bl 8007b94 <bgrt_pitem_cut> proc->sync = (bgrt_sync_t *)0; /* ADLINT:SL:[W0567] type conversion*/ 8008be6: | | | | | 2300 movs r3, #0 8008be8: | | | | | f8c4 30a0 str.w r3, [r4, #160] @ 0xa0 bgrt_sched_proc_run(proc, BGRT_PROC_STATE_TO_READY); 8008bec: | | | | | 2106 movs r1, #6 8008bee: | | | | | 4620 mov r0, r4 8008bf0: | | | | | f7ff fc74 bl 80084dc <bgrt_sched_proc_run> BGRT_SPIN_FREE(proc); proc = sync->owner; 8008bf4: | | | | | f8d5 7084 ldr.w r7, [r5, #132] @ 0x84 if (proc) 8008bf8: | | | | | 2f00 cmp r7, #0 8008bfa: | | +--|--|----- d0d6 beq.n 8008baa <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0x2e> { bgrt_prio_t new_prio; new_prio = BGRT_SYNC_PRIO(sync); 8008bfc: | | | | | 4628 mov r0, r5 8008bfe: | | | | | f7ff f865 bl 8007ccc <bgrt_priv_sync_prio> if (new_prio != old_prio) 8008c02: | | | | | 4286 cmp r6, r0 new_prio = BGRT_SYNC_PRIO(sync); 8008c04: | | | | | 4604 mov r4, r0 if (new_prio != old_prio) 8008c06: | | +--|--|----- d0d0 beq.n 8008baa <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0x2e> { BGRT_SPIN_LOCK(proc); BGRT_PROC_LRES_DEC(proc, old_prio); /* ADLINT:SL:[W1073] int to pointer*/ 8008c08: | | | | | f107 0514 add.w r5, r7, #20 8008c0c: | | | | | 4631 mov r1, r6 8008c0e: | | | | | 4628 mov r0, r5 8008c10: | | | | | f7fe ffde bl 8007bd0 <bgrt_pcounter_dec.isra.0> BGRT_PROC_LRES_INC(proc, new_prio); 8008c14: | | | | | 4628 mov r0, r5 8008c16: | | | | | 4621 mov r1, r4 8008c18: | | | | | f7fe fe83 bl 8007922 <bgrt_pcounter_inc> BGRT_SYNC_PI_PRIO_PROPAGATE(proc, sync); /* ADLINT:SL:[W0553] function pointer cast*/ 8008c1c: | | | | | 4638 mov r0, r7 8008c1e: | | | | | f7ff ff17 bl 8008a50 <_pctrl_propagate> 8008c22: | | +--|--|----- e7c2 b.n 8008baa <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0x2e> switch(BGRT_PROC_GET_STATE(proc)) 8008c24: | | | | \----> 3b0e subs r3, #14 8008c26: | | | | 2b01 cmp r3, #1 8008c28: | | \--|-------- d8bf bhi.n 8008baa <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0x2e> 8008c2a: | | \-------> 2007 movs r0, #7 8008c2c: | +-------------- e7b9 b.n 8008ba2 <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0x26> return BGRT_ST_ENULL; 8008c2e: \--|-------------> 2001 movs r0, #1 8008c30: \-------------- e7b7 b.n 8008ba2 <BGRT_SC_SYNC_PROC_TIMEOUT_SR+0x26> 08008c32 <_sync_assign_owner>: { 8008c32: b537 push {r0, r1, r2, r4, r5, lr} 8008c34: 460c mov r4, r1 BGRT_ASSERT(sync, "The #sync must not be NULL!"); 8008c36: 4605 mov r5, r0 8008c38: /-- b960 cbnz r0, 8008c54 <_sync_assign_owner+0x22> 8008c3a: | b672 cpsid i 8008c3c: | 4b14 ldr r3, [pc, #80] @ (8008c90 <_sync_assign_owner+0x5e>) 8008c3e: | 4a15 ldr r2, [pc, #84] @ (8008c94 <_sync_assign_owner+0x62>) 8008c40: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008c44: | 4b14 ldr r3, [pc, #80] @ (8008c98 <_sync_assign_owner+0x66>) 8008c46: | 9300 str r3, [sp, #0] 8008c48: | 4814 ldr r0, [pc, #80] @ (8008c9c <_sync_assign_owner+0x6a>) 8008c4a: | f240 138f movw r3, #399 @ 0x18f 8008c4e: | f7f8 fb53 bl 80012f8 <printf_> 8008c52: | be00 bkpt 0x0000 BGRT_ASSERT(proc, "The #proc must not be NULL!"); 8008c54: /--\-X b964 cbnz r4, 8008c70 <_sync_assign_owner+0x3e> 8008c56: | b672 cpsid i 8008c58: | 4b0d ldr r3, [pc, #52] @ (8008c90 <_sync_assign_owner+0x5e>) 8008c5a: | 4a11 ldr r2, [pc, #68] @ (8008ca0 <_sync_assign_owner+0x6e>) 8008c5c: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008c60: | 4b0d ldr r3, [pc, #52] @ (8008c98 <_sync_assign_owner+0x66>) 8008c62: | 9300 str r3, [sp, #0] 8008c64: | 480d ldr r0, [pc, #52] @ (8008c9c <_sync_assign_owner+0x6a>) 8008c66: | f44f 73c8 mov.w r3, #400 @ 0x190 8008c6a: | f7f8 fb45 bl 80012f8 <printf_> 8008c6e: | be00 bkpt 0x0000 sync->owner = proc; 8008c70: \----> f8c5 4084 str.w r4, [r5, #132] @ 0x84 BGRT_PROC_LRES_INC(proc, BGRT_SYNC_PRIO(sync)); 8008c74: 4628 mov r0, r5 8008c76: f7ff f829 bl 8007ccc <bgrt_priv_sync_prio> 8008c7a: 4601 mov r1, r0 8008c7c: f104 0014 add.w r0, r4, #20 8008c80: f7fe fe4f bl 8007922 <bgrt_pcounter_inc> BGRT_SYNC_PI_PRIO_PROPAGATE(proc, sync); /* ADLINT:SL:[W0553] function type conversion */ 8008c84: 4620 mov r0, r4 } 8008c86: b003 add sp, #12 8008c88: e8bd 4030 ldmia.w sp!, {r4, r5, lr} BGRT_SYNC_PI_PRIO_PROPAGATE(proc, sync); /* ADLINT:SL:[W0553] function type conversion */ 8008c8c: e6e0 b.n 8008a50 <_pctrl_propagate> 8008c8e: bf00 nop 8008c90: 200001b0 .word 0x200001b0 8008c94: 0800c941 .word 0x0800c941 8008c98: 0800c95d .word 0x0800c95d 8008c9c: 0800b232 .word 0x0800b232 8008ca0: 0800cacb .word 0x0800cacb 08008ca4 : sync = (bgrt_sync_t *)va_arg(va->list, void *); 8008ca4: 6803 ldr r3, [r0, #0] 8008ca6: 1d1a adds r2, r3, #4 { 8008ca8: b570 push {r4, r5, r6, lr} sync = (bgrt_sync_t *)va_arg(va->list, void *); 8008caa: 6002 str r2, [r0, #0] 8008cac: 461a mov r2, r3 8008cae: f852 4b08 ldr.w r4, [r2], #8 pid = (BGRT_PID_T)va_arg(va->list, void *); 8008cb2: 6002 str r2, [r0, #0] if (!sync) 8008cb4: /-------- b1d4 cbz r4, 8008cec <BGRT_SC_SYNC_SET_OWNER_SR+0x48> old_prio = BGRT_SYNC_PRIO(sync); 8008cb6: | 4620 mov r0, r4 8008cb8: | 685e ldr r6, [r3, #4] 8008cba: | f7ff f807 bl 8007ccc <bgrt_priv_sync_prio> owner = sync->owner; 8008cbe: | f8d4 5084 ldr.w r5, [r4, #132] @ 0x84 if (owner == proc) 8008cc2: | 42ae cmp r6, r5 old_prio = BGRT_SYNC_PRIO(sync); 8008cc4: | 4601 mov r1, r0 if (owner == proc) 8008cc6: | /----- d00f beq.n 8008ce8 <BGRT_SC_SYNC_SET_OWNER_SR+0x44> sync->owner = (bgrt_proc_t *)0; /* ADLINT:SL:[W0567] integer to pointer*/ 8008cc8: | | 2300 movs r3, #0 8008cca: | | f8c4 3084 str.w r3, [r4, #132] @ 0x84 if (owner) 8008cce: | | /-- b135 cbz r5, 8008cde <BGRT_SC_SYNC_SET_OWNER_SR+0x3a> BGRT_PROC_LRES_DEC(owner, old_prio); /* ADLINT:SL:[W1073] retval discarded*/ 8008cd0: | | | f105 0014 add.w r0, r5, #20 8008cd4: | | | f7fe ff7c bl 8007bd0 <bgrt_pcounter_dec.isra.0> BGRT_PROC_PS_PI_PRIO_PROPAGATE(owner); /* ADLINT:SL:[W0553,W0021] function type conversion, volatile discarded*/ 8008cd8: | | | 4628 mov r0, r5 8008cda: | | | f7ff feb9 bl 8008a50 <_pctrl_propagate> if (!proc) 8008cde: | +--\-X b11e cbz r6, 8008ce8 <BGRT_SC_SYNC_SET_OWNER_SR+0x44> _sync_assign_owner(sync, proc); 8008ce0: | | 4631 mov r1, r6 8008ce2: | | 4620 mov r0, r4 8008ce4: | | f7ff ffa5 bl 8008c32 <_sync_assign_owner> return BGRT_ST_ENULL; 8008ce8: | \----> 2000 movs r0, #0 } 8008cea: | /-> bd70 pop {r4, r5, r6, pc} 8008cec: \-----|-> 2001 movs r0, #1 8008cee: \-- e7fc b.n 8008cea <BGRT_SC_SYNC_SET_OWNER_SR+0x46> 08008cf0 : sync = (bgrt_sync_t *)va_arg(va->list, void *); 8008cf0: 6802 ldr r2, [r0, #0] 8008cf2: 1d11 adds r1, r2, #4 { 8008cf4: b510 push {r4, lr} sync = (bgrt_sync_t *)va_arg(va->list, void *); 8008cf6: 6001 str r1, [r0, #0] 8008cf8: 4611 mov r1, r2 { 8008cfa: 4603 mov r3, r0 sync = (bgrt_sync_t *)va_arg(va->list, void *); 8008cfc: f851 0b08 ldr.w r0, [r1], #8 return bgrt_priv_sync_own(sync, (bgrt_flag_t)va_arg(va->list, int)); 8008d00: 6019 str r1, [r3, #0] if (!sync) 8008d02: /-------- b300 cbz r0, 8008d46 <BGRT_SC_SYNC_OWN_SR+0x56> 8008d04: | 6853 ldr r3, [r2, #4] owner = sync->owner; 8008d06: | f8d0 4084 ldr.w r4, [r0, #132] @ 0x84 8008d0a: | 4a10 ldr r2, [pc, #64] @ (8008d4c ) 8008d0c: | f8d2 1090 ldr.w r1, [r2, #144] @ 0x90 if (!owner) 8008d10: | /-- b91c cbnz r4, 8008d1a <BGRT_SC_SYNC_OWN_SR+0x2a> _sync_assign_owner(sync, bgrt_curr_proc()); 8008d12: | | f7ff ff8e bl 8008c32 <_sync_assign_owner> return BGRT_ST_OK; 8008d16: | | 4620 mov r0, r4 } 8008d18: | /--|-> bd10 pop {r4, pc} if (touch && (owner != current)) 8008d1a: | | \-> b2db uxtb r3, r3 8008d1c: | | /-- b18b cbz r3, 8008d42 <BGRT_SC_SYNC_OWN_SR+0x52> 8008d1e: | | | 428c cmp r4, r1 8008d20: | | +-- d00f beq.n 8008d42 <BGRT_SC_SYNC_OWN_SR+0x52> BGRT_CNT_INC(sync->dirty); 8008d22: | | | f8d0 3088 ldr.w r3, [r0, #136] @ 0x88 if (BGRT_CONFIG_CNT_MAX > val) 8008d26: | | | 1c5c adds r4, r3, #1 return val + (bgrt_cnt_t)1; 8008d28: | | | bf18 it ne 8008d2a: | | | 3301 addne r3, #1 8008d2c: | | | f8c0 3088 str.w r3, [r0, #136] @ 0x88 BGRT_CNT_INC(sync->snum); /*Increment sleeping process counter. Caller is going to sleep.*/ 8008d30: | | | f8d0 308c ldr.w r3, [r0, #140] @ 0x8c if (BGRT_CONFIG_CNT_MAX > val) 8008d34: | | | 1c5a adds r2, r3, #1 return val + (bgrt_cnt_t)1; 8008d36: | | | bf18 it ne 8008d38: | | | 3301 addne r3, #1 8008d3a: | | | f8c0 308c str.w r3, [r0, #140] @ 0x8c _sync_touch_prio_up(sync, current); 8008d3e: | | | f7ff fd01 bl 8008744 <_sync_touch_prio_up> return BGRT_ST_EOWN; 8008d42: | | \-> 2002 movs r0, #2 8008d44: | +----- e7e8 b.n 8008d18 <BGRT_SC_SYNC_OWN_SR+0x28> return BGRT_ST_ENULL; 8008d46: \--|----> 2001 movs r0, #1 8008d48: \----- e7e6 b.n 8008d18 <BGRT_SC_SYNC_OWN_SR+0x28> 8008d4a: bf00 nop 8008d4c: 200001b0 .word 0x200001b0 08008d50 : bgrt_st_t bgrt_priv_sync_sleep(bgrt_sync_t * sync, bgrt_flag_t * touch) 8008d50: b5f8 push {r3, r4, r5, r6, r7, lr} 8008d52: 4b51 ldr r3, [pc, #324] @ (8008e98 ) 8008d54: 4604 mov r4, r0 8008d56: f8d3 5090 ldr.w r5, [r3, #144] @ 0x90 if (touch) 8008d5a: 2900 cmp r1, #0 8008d5c: /----------------- d04f beq.n 8008dfe <bgrt_priv_sync_sleep.part.0+0xae> if (*touch) 8008d5e: | 780b ldrb r3, [r1, #0] 8008d60: | 2b00 cmp r3, #0 8008d62: +----------------- d04c beq.n 8008dfe <bgrt_priv_sync_sleep.part.0+0xae> *touch = 0; /* ADLINT:SL:[W0167] OOR access*/ 8008d64: | 2300 movs r3, #0 8008d66: | 700b strb r3, [r1, #0] sync_clear = BGRT_PROC_STATE_PI_RUNNING; 8008d68: | 230f movs r3, #15 BGRT_PROC_SET_STATE(proc, BGRT_PROC_STATE_RUNNING); /* ADLINT:SL:[W0447] coma operator*/ 8008d6a: | /----------> 7c2a ldrb r2, [r5, #16] 8008d6c: | | f022 020f bic.w r2, r2, #15 8008d70: | | f042 0203 orr.w r2, r2, #3 switch(sync_clear) 8008d74: | | 2b0b cmp r3, #11 BGRT_PROC_SET_STATE(proc, BGRT_PROC_STATE_RUNNING); /* ADLINT:SL:[W0447] coma operator*/ 8008d76: | | 742a strb r2, [r5, #16] switch(sync_clear) 8008d78: | | /----- d045 beq.n 8008e06 <bgrt_priv_sync_sleep.part.0+0xb6> 8008d7a: | | | 2b0f cmp r3, #15 8008d7c: /--|-----|-----|----- d05a beq.n 8008e34 <bgrt_priv_sync_sleep.part.0+0xe4> 8008d7e: | | | | 2b07 cmp r3, #7 8008d80: /-----------|--|-----|-----|----- f000 8087 beq.w 8008e92 <bgrt_priv_sync_sleep.part.0+0x142> if (sync->owner == proc) 8008d84: | | | | | f8d4 3084 ldr.w r3, [r4, #132] @ 0x84 8008d88: | | | | | 42ab cmp r3, r5 8008d8a: | /--------|--|-----|-----|----- d076 beq.n 8008e7a <bgrt_priv_sync_sleep.part.0+0x12a> bgrt_priv_proc_stop_ensure(proc, BGRT_PROC_STATE_SYNC_SLEEP); 8008d8c: | | | | | | 2109 movs r1, #9 8008d8e: | | | | | | 4628 mov r0, r5 8008d90: | | | | | | f7ff f84e bl 8007e30 <bgrt_priv_proc_stop_ensure> BGRT_CNT_INC(sync->snum); /*Increment sleeping process counter. Caller is going to sleep.*/ 8008d94: | | | | | | f8d4 308c ldr.w r3, [r4, #140] @ 0x8c if (BGRT_CONFIG_CNT_MAX > val) 8008d98: | | | | | | 1c5a adds r2, r3, #1 return val + (bgrt_cnt_t)1; 8008d9a: | | | | | | bf18 it ne 8008d9c: | | | | | | 3301 addne r3, #1 8008d9e: | | | | | | f8c4 308c str.w r3, [r4, #140] @ 0x8c sync_clear = (bgrt_flag_t)0; /*No event!*/ 8008da2: | | | | | | 2700 movs r7, #0 old_prio = BGRT_SYNC_PRIO(sync); 8008da4: | | /--|--|-----|-----|----> 4620 mov r0, r4 8008da6: | | | | | | | f7fe ff91 bl 8007ccc <bgrt_priv_sync_prio> proc->sync = sync; 8008daa: | | | | | | | f8c5 40a0 str.w r4, [r5, #160] @ 0xa0 old_prio = BGRT_SYNC_PRIO(sync); 8008dae: | | | | | | | 4606 mov r6, r0 bgrt_pitem_insert((bgrt_pitem_t *)proc, (bgrt_xlist_t *)sync); 8008db0: | | | | | | | 4621 mov r1, r4 8008db2: | | | | | | | 4628 mov r0, r5 8008db4: | | | | | | | f7ff fb24 bl 8008400 <bgrt_pitem_insert> if (((bgrt_cnt_t)0 == sync->dirty) && (sync->pwake)) 8008db8: | | | | | | | f8d4 3088 ldr.w r3, [r4, #136] @ 0x88 8008dbc: | | | | | | | /-- b92b cbnz r3, 8008dca <bgrt_priv_sync_sleep.part.0+0x7a> 8008dbe: | | | | | | | | f8d4 3090 ldr.w r3, [r4, #144] @ 0x90 8008dc2: | | | | | | | +-- b113 cbz r3, 8008dca <bgrt_priv_sync_sleep.part.0+0x7a> _sync_do_pending_wake(sync); 8008dc4: | | | | | | | | 4620 mov r0, r4 8008dc6: | | | | | | | | f7ff fc95 bl 80086f4 <_sync_do_pending_wake> proc = sync->owner; 8008dca: | | | | | | | \-> f8d4 5084 ldr.w r5, [r4, #132] @ 0x84 if (proc) 8008dce: | | /--|--|--|-----|-----|----- b1a5 cbz r5, 8008dfa <bgrt_priv_sync_sleep.part.0+0xaa> new_prio = BGRT_SYNC_PRIO(sync); 8008dd0: | | | | | | | | 4620 mov r0, r4 8008dd2: | | | | | | | | f7fe ff7b bl 8007ccc <bgrt_priv_sync_prio> if ((old_prio != new_prio) || sync_clear) 8008dd6: | | | | | | | | 4286 cmp r6, r0 new_prio = BGRT_SYNC_PRIO(sync); 8008dd8: | | | | | | | | 4604 mov r4, r0 if ((old_prio != new_prio) || sync_clear) 8008dda: | | | | | | | | /-- d101 bne.n 8008de0 <bgrt_priv_sync_sleep.part.0+0x90> 8008ddc: | | | | | | | | | 2f00 cmp r7, #0 8008dde: | | | | | | /--|-----|--|-- d04e beq.n 8008e7e <bgrt_priv_sync_sleep.part.0+0x12e> BGRT_PROC_LRES_DEC(proc, old_prio); 8008de0: | | | | | | | | | \-> f105 0714 add.w r7, r5, #20 8008de4: | | | | | | | | | 4631 mov r1, r6 8008de6: | | | | | | | | | 4638 mov r0, r7 8008de8: | | | | | | | | | f7fe fef2 bl 8007bd0 <bgrt_pcounter_dec.isra.0> BGRT_PROC_LRES_INC(proc, new_prio); 8008dec: | | | | | | | | | 4638 mov r0, r7 8008dee: | | | | | | | | | 4621 mov r1, r4 8008df0: | | | | | | | | | f7fe fd97 bl 8007922 <bgrt_pcounter_inc> BGRT_SYNC_PI_PRIO_PROPAGATE(proc, sync); 8008df4: | | | | | | | | | 4628 mov r0, r5 8008df6: | | | | | | | | | f7ff fe2b bl 8008a50 <_pctrl_propagate> return BGRT_ST_ROLL; 8008dfa: | | >--|--|--|--|--|-----|----> 2009 movs r0, #9 8008dfc: | | | | | | | | /--|----- e019 b.n 8008e32 <bgrt_priv_sync_sleep.part.0+0xe2> sync_clear = BGRT_PROC_GET_STATE(proc); /* ADLINT:SL:[W0447] coma operator*/ 8008dfe: | | | | | \--|--|--|--|----> 7c2b ldrb r3, [r5, #16] 8008e00: | | | | | | | | | f003 030f and.w r3, r3, #15 8008e04: | | | | | | \--|--|----- e7b1 b.n 8008d6a <bgrt_priv_sync_sleep.part.0+0x1a> BGRT_PROC_LRES_DEC(proc, 0); /* ADLINT:SL:[W1073] retval discarded*/ 8008e06: | | | | | | | \----> 2100 movs r1, #0 8008e08: | | | | | | | f105 0014 add.w r0, r5, #20 8008e0c: | | | | | | | f7fe fee0 bl 8007bd0 <bgrt_pcounter_dec.isra.0> _pctrl_proc_running(proc, BGRT_PROC_STATE_RUNNING); 8008e10: | | | | | | | 2103 movs r1, #3 8008e12: | | | | | | | 4628 mov r0, r5 8008e14: | | | | | | | f7ff fd0a bl 800882c <_pctrl_proc_running> BGRT_CNT_DEC(sync->snum); /*One sleeping proc less!*/ 8008e18: | | | | | | | f8d4 308c ldr.w r3, [r4, #140] @ 0x8c if (val) 8008e1c: | | | | | | | /-- b103 cbz r3, 8008e20 <bgrt_priv_sync_sleep.part.0+0xd0> return val - (bgrt_cnt_t)1; 8008e1e: | | | | | | | | 3b01 subs r3, #1 8008e20: | | | | | | | \-> f8c4 308c str.w r3, [r4, #140] @ 0x8c if (sync->pwake) 8008e24: | | | | | | | f8d4 3090 ldr.w r3, [r4, #144] @ 0x90 8008e28: | | | | | | | /-- b113 cbz r3, 8008e30 <bgrt_priv_sync_sleep.part.0+0xe0> _sync_do_pending_wake(sync); 8008e2a: | | | | | | | | 4620 mov r0, r4 8008e2c: | | | | | | | | f7ff fc62 bl 80086f4 <_sync_do_pending_wake> return BGRT_ST_OK; 8008e30: | | | | | | | \-> 2000 movs r0, #0 } 8008e32: | | | | | | >-------> bdf8 pop {r3, r4, r5, r6, r7, pc} sync_clear = (bgrt_flag_t)((bgrt_cnt_t)1 == sync->dirty); /* ADLINT:SL:[W0608] minus converted*/ 8008e34: | | | | \-----|-----|-------> f8d4 3088 ldr.w r3, [r4, #136] @ 0x88 8008e38: | | | | | | 1e59 subs r1, r3, #1 8008e3a: | | | | | | 424f negs r7, r1 8008e3c: | | | | | | 414f adcs r7, r1 if (val) 8008e3e: | | | | | | /-- b103 cbz r3, 8008e42 <bgrt_priv_sync_sleep.part.0+0xf2> return val - (bgrt_cnt_t)1; 8008e40: | | | | | | | 3b01 subs r3, #1 BGRT_CNT_DEC(sync->dirty); 8008e42: | | | | | | \-> f8c4 3088 str.w r3, [r4, #136] @ 0x88 bgrt_priv_proc_stop_ensure(proc, BGRT_PROC_STATE_SYNC_SLEEP); 8008e46: | | | | | | 2109 movs r1, #9 8008e48: | | | | | | 4628 mov r0, r5 8008e4a: | | | | | | f7fe fff1 bl 8007e30 <bgrt_priv_proc_stop_ensure> BGRT_PROC_LRES_DEC(proc, 0); /* ADLINT:SL:[W1073] retval discarded*/ 8008e4e: | | | | | | 2100 movs r1, #0 8008e50: | | | | | | f105 0014 add.w r0, r5, #20 8008e54: | | | | | | f7fe febc bl 8007bd0 <bgrt_pcounter_dec.isra.0> _pctrl_proc_stoped(proc); 8008e58: | | | | | | 4628 mov r0, r5 8008e5a: | | | | | | f7fe ff11 bl 8007c80 <_pctrl_proc_stoped> if (sync->owner == proc) 8008e5e: | | | | | | f8d4 3084 ldr.w r3, [r4, #132] @ 0x84 8008e62: | | | | | | 42ab cmp r3, r5 8008e64: | | | \--------|-----|-------- d19e bne.n 8008da4 <bgrt_priv_sync_sleep.part.0+0x54> bgrt_sched_proc_run(proc, BGRT_PROC_STATE_READY); 8008e66: | | | | | 2102 movs r1, #2 8008e68: | | | | | 4628 mov r0, r5 8008e6a: | | | | | f7ff fb37 bl 80084dc <bgrt_sched_proc_run> BGRT_CNT_DEC(sync->snum); /*The process become an owner during a prio inheritance transaction!*/ 8008e6e: | | | | | f8d4 308c ldr.w r3, [r4, #140] @ 0x8c if (val) 8008e72: | | | | | /-- b103 cbz r3, 8008e76 <bgrt_priv_sync_sleep.part.0+0x126> return val - (bgrt_cnt_t)1; 8008e74: | | | | | | 3b01 subs r3, #1 8008e76: | | | | | \-> f8c4 308c str.w r3, [r4, #140] @ 0x8c return BGRT_ST_EOWN; 8008e7a: | \--|-----------|-----|-------> 2002 movs r0, #2 8008e7c: | | | +-------- e7d9 b.n 8008e32 <bgrt_priv_sync_sleep.part.0+0xe2> if (BGRT_PROC_STATE_SYNC_WAIT == BGRT_PROC_GET_STATE(proc)) 8008e7e: | | \-----|-------> 7c2b ldrb r3, [r5, #16] 8008e80: | | | f003 030f and.w r3, r3, #15 8008e84: | | | 2b08 cmp r3, #8 8008e86: | +-----------------|-------- d1b8 bne.n 8008dfa <bgrt_priv_sync_sleep.part.0+0xaa> bgrt_sched_proc_run(proc, BGRT_PROC_STATE_READY); 8008e88: | | | 2102 movs r1, #2 8008e8a: | | | 4628 mov r0, r5 8008e8c: | | | f7ff fb26 bl 80084dc <bgrt_sched_proc_run> 8008e90: | \-----------------|-------- e7b3 b.n 8008dfa <bgrt_priv_sync_sleep.part.0+0xaa> switch(sync_clear) 8008e92: \-----------------------|-------> 2005 movs r0, #5 8008e94: \-------- e7cd b.n 8008e32 <bgrt_priv_sync_sleep.part.0+0xe2> 8008e96: bf00 nop 8008e98: 200001b0 .word 0x200001b0 08008e9c <_sem_lock_fsm>: { 8008e9c: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} BGRT_ASSERT(va, "The #va must not be NULL!"); 8008e9e: 4604 mov r4, r0 8008ea0: /-- b958 cbnz r0, 8008eba <_sem_lock_fsm+0x1e> 8008ea2: | b672 cpsid i 8008ea4: | 4b32 ldr r3, [pc, #200] @ (8008f70 <_sem_lock_fsm+0xd4>) 8008ea6: | 4a33 ldr r2, [pc, #204] @ (8008f74 <_sem_lock_fsm+0xd8>) 8008ea8: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008eac: | 4b32 ldr r3, [pc, #200] @ (8008f78 <_sem_lock_fsm+0xdc>) 8008eae: | 9300 str r3, [sp, #0] 8008eb0: | 4832 ldr r0, [pc, #200] @ (8008f7c <_sem_lock_fsm+0xe0>) 8008eb2: | 2387 movs r3, #135 @ 0x87 8008eb4: | f7f8 fa20 bl 80012f8 <printf_> 8008eb8: | be00 bkpt 0x0000 sem = (bgrt_sem_t *)va_arg(va->list, void *); 8008eba: \-> 6823 ldr r3, [r4, #0] 8008ebc: 1d1a adds r2, r3, #4 8008ebe: 6022 str r2, [r4, #0] 8008ec0: 461a mov r2, r3 8008ec2: f852 5b08 ldr.w r5, [r2], #8 touch = (bgrt_flag_t*)va_arg(va->list, void *); 8008ec6: 6022 str r2, [r4, #0] state = (bgrt_flag_t*)va_arg(va->list, void *); 8008ec8: f103 020c add.w r2, r3, #12 touch = (bgrt_flag_t*)va_arg(va->list, void *); 8008ecc: 685e ldr r6, [r3, #4] state = (bgrt_flag_t*)va_arg(va->list, void *); 8008ece: 6022 str r2, [r4, #0] 8008ed0: 689f ldr r7, [r3, #8] BGRT_ASSERT(sem, "The #sem must not be NULL!"); 8008ed2: /-- b95d cbnz r5, 8008eec <_sem_lock_fsm+0x50> 8008ed4: | b672 cpsid i 8008ed6: | 4b26 ldr r3, [pc, #152] @ (8008f70 <_sem_lock_fsm+0xd4>) 8008ed8: | 4a29 ldr r2, [pc, #164] @ (8008f80 <_sem_lock_fsm+0xe4>) 8008eda: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008ede: | 4b26 ldr r3, [pc, #152] @ (8008f78 <_sem_lock_fsm+0xdc>) 8008ee0: | 9300 str r3, [sp, #0] 8008ee2: | 4826 ldr r0, [pc, #152] @ (8008f7c <_sem_lock_fsm+0xe0>) 8008ee4: | 238d movs r3, #141 @ 0x8d 8008ee6: | f7f8 fa07 bl 80012f8 <printf_> 8008eea: | be00 bkpt 0x0000 BGRT_ASSERT(touch, "The #touch must not be NULL!"); 8008eec: /--\-X b95e cbnz r6, 8008f06 <_sem_lock_fsm+0x6a> 8008eee: | b672 cpsid i 8008ef0: | 4b1f ldr r3, [pc, #124] @ (8008f70 <_sem_lock_fsm+0xd4>) 8008ef2: | 4a24 ldr r2, [pc, #144] @ (8008f84 <_sem_lock_fsm+0xe8>) 8008ef4: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008ef8: | 4b1f ldr r3, [pc, #124] @ (8008f78 <_sem_lock_fsm+0xdc>) 8008efa: | 9300 str r3, [sp, #0] 8008efc: | 481f ldr r0, [pc, #124] @ (8008f7c <_sem_lock_fsm+0xe0>) 8008efe: | 238e movs r3, #142 @ 0x8e 8008f00: | f7f8 f9fa bl 80012f8 <printf_> 8008f04: | be00 bkpt 0x0000 BGRT_ASSERT(state, "The #state must not be NULL!"); 8008f06: \--/-X b95f cbnz r7, 8008f20 <_sem_lock_fsm+0x84> 8008f08: | b672 cpsid i 8008f0a: | 4b19 ldr r3, [pc, #100] @ (8008f70 <_sem_lock_fsm+0xd4>) 8008f0c: | 4a1e ldr r2, [pc, #120] @ (8008f88 <_sem_lock_fsm+0xec>) 8008f0e: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008f12: | 4b19 ldr r3, [pc, #100] @ (8008f78 <_sem_lock_fsm+0xdc>) 8008f14: | 9300 str r3, [sp, #0] 8008f16: | 4819 ldr r0, [pc, #100] @ (8008f7c <_sem_lock_fsm+0xe0>) 8008f18: | 238f movs r3, #143 @ 0x8f 8008f1a: | f7f8 f9ed bl 80012f8 <printf_> 8008f1e: | be00 bkpt 0x0000 switch (*state) 8008f20: \-> 783c ldrb r4, [r7, #0] 8008f22: /-- b12c cbz r4, 8008f30 <_sem_lock_fsm+0x94> 8008f24: | 2c01 cmp r4, #1 8008f26: /-----|-- d01c beq.n 8008f62 <_sem_lock_fsm+0xc6> 8008f28: | | 2408 movs r4, #8 } 8008f2a: /--|-----|-> 4620 mov r0, r4 8008f2c: | | | b003 add sp, #12 8008f2e: | | | bdf0 pop {r4, r5, r6, r7, pc} bgrt_priv_proc_lock(); 8008f30: | | \-> f7fe fc2b bl 800778a <bgrt_priv_proc_lock> if (sem->counter) 8008f34: | | f8d5 3098 ldr.w r3, [r5, #152] @ 0x98 8008f38: | | /-- b11b cbz r3, 8008f42 <_sem_lock_fsm+0xa6> sem->counter--; 8008f3a: | | | 3b01 subs r3, #1 8008f3c: | | | f8c5 3098 str.w r3, [r5, #152] @ 0x98 return BGRT_ST_OK; 8008f40: +--|-----|-- e7f3 b.n 8008f2a <_sem_lock_fsm+0x8e> if (!sync) 8008f42: | | \-> 4628 mov r0, r5 8008f44: | | f7ff fc34 bl 80087b0 <bgrt_priv_sync_touch.part.0> *touch = (bgrt_flag_t)1; 8008f48: | | 2301 movs r3, #1 8008f4a: | | 7033 strb r3, [r6, #0] *state = (bgrt_flag_t)1; 8008f4c: | | 703b strb r3, [r7, #0] bgrt_priv_proc_reset_watchdog(); 8008f4e: | | f7fe fc2d bl 80077ac <bgrt_priv_proc_reset_watchdog> if (!sync) 8008f52: | | /----> 4631 mov r1, r6 8008f54: | | | 4628 mov r0, r5 8008f56: | | | f7ff fefb bl 8008d50 <bgrt_priv_sync_sleep.part.0> if (BGRT_ST_ROLL != ret) 8008f5a: | | | 2809 cmp r0, #9 8008f5c: | | | 4604 mov r4, r0 8008f5e: +--|--|----- d0e4 beq.n 8008f2a <_sem_lock_fsm+0x8e> 8008f60: | | | /-- e003 b.n 8008f6a <_sem_lock_fsm+0xce> bgrt_priv_proc_reset_watchdog(); 8008f62: | \--|--|-> f7fe fc23 bl 80077ac <bgrt_priv_proc_reset_watchdog> if (!sync) 8008f66: | | | 2d00 cmp r5, #0 8008f68: | \--|-- d1f3 bne.n 8008f52 <_sem_lock_fsm+0xb6> bgrt_priv_proc_free(); 8008f6a: | \-> f7fe ff85 bl 8007e78 <bgrt_priv_proc_free> 8008f6e: \----------- e7dc b.n 8008f2a <_sem_lock_fsm+0x8e> 8008f70: 200001b0 .word 0x200001b0 8008f74: 0800cc6a .word 0x0800cc6a 8008f78: 0800cc84 .word 0x0800cc84 8008f7c: 0800b232 .word 0x0800b232 8008f80: 0800cc9b .word 0x0800cc9b 8008f84: 0800ccb6 .word 0x0800ccb6 8008f88: 0800ccd3 .word 0x0800ccd3 08008f8c : { 8008f8c: b507 push {r0, r1, r2, lr} va_copy(param, va->list); 8008f8e: 6803 ldr r3, [r0, #0] sync = (bgrt_sync_t *)va_arg(param, void *); 8008f90: 1d1a adds r2, r3, #4 8008f92: 9201 str r2, [sp, #4] touch = (bgrt_flag_t *)va_arg(param, void *); 8008f94: e9d3 0100 ldrd r0, r1, [r3] bgrt_priv_proc_reset_watchdog(); 8008f98: f7fe fc08 bl 80077ac <bgrt_priv_proc_reset_watchdog> if (!sync) 8008f9c: /----- b120 cbz r0, 8008fa8 <BGRT_SC_SYNC_SLEEP_SR+0x1c> 8008f9e: | f7ff fed7 bl 8008d50 <bgrt_priv_sync_sleep.part.0> } 8008fa2: | /-> b003 add sp, #12 8008fa4: | | f85d fb04 ldr.w pc, [sp], #4 return BGRT_ST_ENULL; 8008fa8: \--|-> 2001 movs r0, #1 8008faa: \-- e7fa b.n 8008fa2 <BGRT_SC_SYNC_SLEEP_SR+0x16> 08008fac : tcp_seg_copy(struct tcp_seg *seg) 8008fac: b570 push {r4, r5, r6, lr} cseg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG); 8008fae: 2003 movs r0, #3 8008fb0: f7f9 f89c bl 80020ec <memp_malloc> if (cseg == NULL) { 8008fb4: 4604 mov r4, r0 8008fb6: /----- b188 cbz r0, 8008fdc <tcp_seg_copy.constprop.0+0x30> SMEMCPY((u8_t *)cseg, (const u8_t *)seg, sizeof(struct tcp_seg)); 8008fb8: | 4a09 ldr r2, [pc, #36] @ (8008fe0 ) 8008fba: | 4603 mov r3, r0 8008fbc: | f102 0610 add.w r6, r2, #16 8008fc0: | /-> 4615 mov r5, r2 8008fc2: | | cd03 ldmia r5!, {r0, r1} 8008fc4: | | 42b5 cmp r5, r6 8008fc6: | | 6018 str r0, [r3, #0] 8008fc8: | | 6059 str r1, [r3, #4] 8008fca: | | 462a mov r2, r5 8008fcc: | | f103 0308 add.w r3, r3, #8 8008fd0: | \-- d1f6 bne.n 8008fc0 <tcp_seg_copy.constprop.0+0x14> 8008fd2: | 6828 ldr r0, [r5, #0] 8008fd4: | 6018 str r0, [r3, #0] pbuf_ref(cseg->p); 8008fd6: | 6860 ldr r0, [r4, #4] 8008fd8: | f7f9 fb2c bl 8002634 <pbuf_ref> } 8008fdc: \----> 4620 mov r0, r4 8008fde: bd70 pop {r4, r5, r6, pc} 8008fe0: 20001234 .word 0x20001234 08008fe4 : tcp_output_fill_options(const struct tcp_pcb *pcb, struct pbuf *p, u8_t optflags, u8_t num_sacks) 8008fe4: b507 push {r0, r1, r2, lr} LWIP_ASSERT("tcp_output_fill_options: invalid pbuf", p != NULL); 8008fe6: /-- b960 cbnz r0, 8009002 <tcp_output_fill_options.constprop.0+0x1e> 8008fe8: | b672 cpsid i return bgrt_kernel.timer.val; 8008fea: | 4b07 ldr r3, [pc, #28] @ (8009008 ) 8008fec: | 4a07 ldr r2, [pc, #28] @ (800900c ) 8008fee: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8008ff2: | 4b07 ldr r3, [pc, #28] @ (8009010 ) 8008ff4: | 9300 str r3, [sp, #0] 8008ff6: | 4807 ldr r0, [pc, #28] @ (8009014 ) 8008ff8: | f240 735a movw r3, #1882 @ 0x75a 8008ffc: | f7f8 f97c bl 80012f8 <printf_> 8009000: | be00 bkpt 0x0000 } 8009002: \-> b003 add sp, #12 8009004: f85d fb04 ldr.w pc, [sp], #4 8009008: 200001b0 .word 0x200001b0 800900c: 0800ccf0 .word 0x0800ccf0 8009010: 0800b5cd .word 0x0800b5cd 8009014: 0800b232 .word 0x0800b232 08009018 : void sys_mutex_lock(sys_mutex_t *mutex) 8009018: b51f push {r0, r1, r2, r3, r4, lr} LWIP_ASSERT("mutex->mtx != NULL", mutex->mtx != NULL); 800901a: 4c1b ldr r4, [pc, #108] @ (8009088 ) 800901c: 6823 ldr r3, [r4, #0] 800901e: /-- b95b cbnz r3, 8009038 <sys_mutex_lock.constprop.0+0x20> 8009020: | b672 cpsid i return bgrt_kernel.timer.val; 8009022: | 4b1a ldr r3, [pc, #104] @ (800908c ) LWIP_ASSERT("mutex->mtx != NULL", mutex->mtx != NULL); 8009024: | 4a1a ldr r2, [pc, #104] @ (8009090 ) return bgrt_kernel.timer.val; 8009026: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac LWIP_ASSERT("mutex->mtx != NULL", mutex->mtx != NULL); 800902a: | 4b1a ldr r3, [pc, #104] @ (8009094 ) 800902c: | 9300 str r3, [sp, #0] 800902e: | 481a ldr r0, [pc, #104] @ (8009098 ) 8009030: | 2355 movs r3, #85 @ 0x55 8009032: | f7f8 f961 bl 80012f8 <printf_> 8009036: | be00 bkpt 0x0000 st = bgrt_mtx_lock(mutex->mtx); 8009038: \-> 6824 ldr r4, [r4, #0] bgrt_st_t bgrt_mtx_lock(bgrt_mtx_t * mutex) { bgrt_st_t ret; if (!mutex) 800903a: /-- b96c cbnz r4, 8009058 <sys_mutex_lock.constprop.0+0x40> LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 800903c: /-----|-> b672 cpsid i return bgrt_kernel.timer.val; 800903e: | | 4b13 ldr r3, [pc, #76] @ (800908c ) LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 8009040: | | 4a16 ldr r2, [pc, #88] @ (800909c ) return bgrt_kernel.timer.val; 8009042: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 8009046: | | 4b13 ldr r3, [pc, #76] @ (8009094 ) 8009048: | | 9300 str r3, [sp, #0] 800904a: | | 4813 ldr r0, [pc, #76] @ (8009098 ) 800904c: | | 2357 movs r3, #87 @ 0x57 800904e: | | f7f8 f953 bl 80012f8 <printf_> 8009052: | | be00 bkpt 0x0000 } 8009054: | /--|-> b004 add sp, #16 8009056: | | | bd10 pop {r4, pc} { return BGRT_ST_ENULL; } BGRT_PROC_LOCK(); /*Now process must not stop!*/ 8009058: | | \-> 2100 movs r1, #0 800905a: | | 2005 movs r0, #5 800905c: | | f7fe fe5c bl 8007d18 <bgrt_syscall> ret = BGRT_SYNC_OWN(mutex, 1); /*Try to lock mutex*/ 8009060: | | 2201 movs r2, #1 8009062: | | 4621 mov r1, r4 8009064: | | 200e movs r0, #14 8009066: | | f7fe fe92 bl 8007d8e <bgrt_syscall_var> if (BGRT_ST_EOWN == ret) 800906a: | | 2802 cmp r0, #2 800906c: | | /-- d108 bne.n 8009080 <sys_mutex_lock.constprop.0+0x68> { bgrt_flag_t touch = 1; 800906e: | | | 2301 movs r3, #1 ret = BGRT_SYNC_SLEEP(mutex, &touch); 8009070: | | | f10d 020f add.w r2, sp, #15 8009074: | | | 4621 mov r1, r4 8009076: | | | 2010 movs r0, #16 bgrt_flag_t touch = 1; 8009078: | | | f88d 300f strb.w r3, [sp, #15] ret = BGRT_SYNC_SLEEP(mutex, &touch); 800907c: | | | f7fe fe87 bl 8007d8e <bgrt_syscall_var> LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 8009080: | | \-> 2800 cmp r0, #0 8009082: | \----- d0e7 beq.n 8009054 <sys_mutex_lock.constprop.0+0x3c> 8009084: \-------- e7da b.n 800903c <sys_mutex_lock.constprop.0+0x24> 8009086: bf00 nop 8009088: 2000120c .word 0x2000120c 800908c: 200001b0 .word 0x200001b0 8009090: 0800cd16 .word 0x0800cd16 8009094: 0800cbc1 .word 0x0800cbc1 8009098: 0800b232 .word 0x0800b232 800909c: 0800b221 .word 0x0800b221 080090a0 : void sys_mutex_unlock(sys_mutex_t *mutex) 80090a0: b513 push {r0, r1, r4, lr} LWIP_ASSERT("mutex->mtx != NULL", mutex->mtx != NULL); 80090a2: 4c17 ldr r4, [pc, #92] @ (8009100 ) 80090a4: 6823 ldr r3, [r4, #0] 80090a6: /-- b95b cbnz r3, 80090c0 <sys_mutex_unlock.constprop.0+0x20> 80090a8: | b672 cpsid i return bgrt_kernel.timer.val; 80090aa: | 4b16 ldr r3, [pc, #88] @ (8009104 ) LWIP_ASSERT("mutex->mtx != NULL", mutex->mtx != NULL); 80090ac: | 4a16 ldr r2, [pc, #88] @ (8009108 ) return bgrt_kernel.timer.val; 80090ae: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac LWIP_ASSERT("mutex->mtx != NULL", mutex->mtx != NULL); 80090b2: | 4b16 ldr r3, [pc, #88] @ (800910c ) 80090b4: | 9300 str r3, [sp, #0] 80090b6: | 4816 ldr r0, [pc, #88] @ (8009110 ) 80090b8: | 235f movs r3, #95 @ 0x5f 80090ba: | f7f8 f91d bl 80012f8 <printf_> 80090be: | be00 bkpt 0x0000 st = bgrt_mtx_free(mutex->mtx); 80090c0: \-> 6821 ldr r1, [r4, #0] bgrt_st_t bgrt_mtx_free(bgrt_mtx_t * mutex) { bgrt_st_t ret; if (!mutex) 80090c2: /-- b969 cbnz r1, 80090e0 <sys_mutex_unlock.constprop.0+0x40> LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK || st == BGRT_ST_EEMPTY); 80090c4: /-----|-> b672 cpsid i return bgrt_kernel.timer.val; 80090c6: | | 4b0f ldr r3, [pc, #60] @ (8009104 ) LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK || st == BGRT_ST_EEMPTY); 80090c8: | | 4a12 ldr r2, [pc, #72] @ (8009114 ) return bgrt_kernel.timer.val; 80090ca: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK || st == BGRT_ST_EEMPTY); 80090ce: | | 4b0f ldr r3, [pc, #60] @ (800910c ) 80090d0: | | 9300 str r3, [sp, #0] 80090d2: | | 480f ldr r0, [pc, #60] @ (8009110 ) 80090d4: | | 2361 movs r3, #97 @ 0x61 80090d6: | | f7f8 f90f bl 80012f8 <printf_> 80090da: | | be00 bkpt 0x0000 } 80090dc: | /--|-> b002 add sp, #8 80090de: | | | bd10 pop {r4, pc} { return BGRT_ST_ENULL; } ret = BGRT_SYNC_WAKE(mutex, BGRT_PID_NOTHING, 1); /*Now we can wake some process.*/ 80090e0: | | \-> 2301 movs r3, #1 80090e2: | | 2200 movs r2, #0 80090e4: | | 2011 movs r0, #17 80090e6: | | f7fe fe52 bl 8007d8e <bgrt_syscall_var> BGRT_PROC_FREE(); /*May stop caller process.*/ 80090ea: | | 2100 movs r1, #0 ret = BGRT_SYNC_WAKE(mutex, BGRT_PID_NOTHING, 1); /*Now we can wake some process.*/ 80090ec: | | 4604 mov r4, r0 BGRT_PROC_FREE(); /*May stop caller process.*/ 80090ee: | | 2006 movs r0, #6 80090f0: | | f7fe fe12 bl 8007d18 <bgrt_syscall> LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK || st == BGRT_ST_EEMPTY); 80090f4: | | 2c00 cmp r4, #0 80090f6: | +----- d0f1 beq.n 80090dc <sys_mutex_unlock.constprop.0+0x3c> 80090f8: | | 2c03 cmp r4, #3 80090fa: | \----- d0ef beq.n 80090dc <sys_mutex_unlock.constprop.0+0x3c> 80090fc: \-------- e7e2 b.n 80090c4 <sys_mutex_unlock.constprop.0+0x24> 80090fe: bf00 nop 8009100: 2000120c .word 0x2000120c 8009104: 200001b0 .word 0x200001b0 8009108: 0800cd16 .word 0x0800cd16 800910c: 0800cbc1 .word 0x0800cbc1 8009110: 0800b232 .word 0x0800b232 8009114: 0800b221 .word 0x0800b221 08009118 : { 8009118: b51f push {r0, r1, r2, r3, r4, lr} LOCK_TCPIP_CORE(); 800911a: f7ff ff7d bl 8009018 <sys_mutex_lock.constprop.0> if (tcpip_init_done != NULL) { 800911e: 4b26 ldr r3, [pc, #152] @ (80091b8 ) 8009120: 681b ldr r3, [r3, #0] 8009122: /-- b113 cbz r3, 800912a <tcpip_thread.lto_priv.0+0x12> tcpip_init_done(tcpip_init_done_arg); 8009124: | 4a25 ldr r2, [pc, #148] @ (80091bc ) 8009126: | 6810 ldr r0, [r2, #0] 8009128: | 4798 blx r3 { u32_t now; LWIP_ASSERT_CORE_LOCKED(); if (next_timeout == NULL) { 800912a: \-> 4e25 ldr r6, [pc, #148] @ (80091c0 ) return bgrt_kernel.timer.val; 800912c: 4d25 ldr r5, [pc, #148] @ (80091c4 ) 800912e: /----------------> 6834 ldr r4, [r6, #0] 8009130: | /-- b9ac cbnz r4, 800915e <tcpip_thread.lto_priv.0+0x46> UNLOCK_TCPIP_CORE(); 8009132: | | f7ff ffb5 bl 80090a0 <sys_mutex_unlock.constprop.0> sys_arch_mbox_fetch(mbox, msg, 0); 8009136: | | 4621 mov r1, r4 8009138: | | a803 add r0, sp, #12 800913a: | | f7ff f8fd bl 8008338 <sys_arch_mbox_fetch.constprop.0> LOCK_TCPIP_CORE(); 800913e: | | f7ff ff6b bl 8009018 <sys_mutex_lock.constprop.0> if (msg == NULL) { 8009142: | /-----|-> 9c03 ldr r4, [sp, #12] 8009144: | /--|-----|-- bb04 cbnz r4, 8009188 <tcpip_thread.lto_priv.0+0x70> LWIP_ASSERT("tcpip_thread: invalid message", 0); 8009146: | | | | b672 cpsid i 8009148: | | | | 4b1f ldr r3, [pc, #124] @ (80091c8 ) 800914a: | | | | f8d5 11ac ldr.w r1, [r5, #428] @ 0x1ac 800914e: | | | | 9300 str r3, [sp, #0] 8009150: | | | | 2391 movs r3, #145 @ 0x91 LWIP_ASSERT("tcpip_thread: invalid message", 0); 8009152: | /--|--|-----|-> 4a1e ldr r2, [pc, #120] @ (80091cc ) 8009154: | | | | | 481e ldr r0, [pc, #120] @ (80091d0 ) 8009156: | | | | | f7f8 f8cf bl 80012f8 <printf_> 800915a: | | | | | be00 bkpt 0x0000 break; 800915c: +--|--|--|-----|-- e7e7 b.n 800912e <tcpip_thread.lto_priv.0+0x16> 800915e: | | | | \-> f8d5 31ac ldr.w r3, [r5, #428] @ 0x1ac return SYS_TIMEOUTS_SLEEPTIME_INFINITE; } now = sys_now(); if (TIME_LESS_THAN(next_timeout->time, now)) { 8009162: | | | | 6864 ldr r4, [r4, #4] 8009164: | | | | 1ae4 subs r4, r4, r3 8009166: | | | | /----- d400 bmi.n 800916a <tcpip_thread.lto_priv.0+0x52> } else if (sleeptime == 0) { 8009168: | | | | | /-- b914 cbnz r4, 8009170 <tcpip_thread.lto_priv.0+0x58> sys_check_timeouts(); 800916a: | | | | >--|-> f7fb fb63 bl 8004834 <sys_check_timeouts> goto again; 800916e: +--|--|--|--|--|-- e7de b.n 800912e <tcpip_thread.lto_priv.0+0x16> UNLOCK_TCPIP_CORE(); 8009170: | | | | | \-> f7ff ff96 bl 80090a0 <sys_mutex_unlock.constprop.0> res = sys_arch_mbox_fetch(mbox, msg, sleeptime); 8009174: | | | | | 4621 mov r1, r4 8009176: | | | | | a803 add r0, sp, #12 8009178: | | | | | f7ff f8de bl 8008338 <sys_arch_mbox_fetch.constprop.0> 800917c: | | | | | 4604 mov r4, r0 LOCK_TCPIP_CORE(); 800917e: | | | | | f7ff ff4b bl 8009018 <sys_mutex_lock.constprop.0> if (res == SYS_ARCH_TIMEOUT) { 8009182: | | | | | 3401 adds r4, #1 8009184: | | | | \----- d0f1 beq.n 800916a <tcpip_thread.lto_priv.0+0x52> 8009186: | | | \-------- e7dc b.n 8009142 <tcpip_thread.lto_priv.0+0x2a> switch (msg->type) { 8009188: | | \----------> 7823 ldrb r3, [r4, #0] 800918a: | | /-- b143 cbz r3, 800919e <tcpip_thread.lto_priv.0+0x86> 800918c: | | | 2b01 cmp r3, #1 800918e: | | /--|-- d00e beq.n 80091ae <tcpip_thread.lto_priv.0+0x96> LWIP_ASSERT("tcpip_thread: invalid message", 0); 8009190: | | | | b672 cpsid i 8009192: | | | | 4b0d ldr r3, [pc, #52] @ (80091c8 ) 8009194: | | | | 9300 str r3, [sp, #0] 8009196: | | | | f8d5 11ac ldr.w r1, [r5, #428] @ 0x1ac 800919a: | | | | 23d4 movs r3, #212 @ 0xd4 800919c: | \--------|--|-- e7d9 b.n 8009152 <tcpip_thread.lto_priv.0+0x3a> msg->msg.cb.function(msg->msg.cb.ctx); 800919e: | | \-> e9d4 3001 ldrd r3, r0, [r4, #4] 80091a2: | | 4798 blx r3 memp_free(MEMP_TCPIP_MSG_API, msg); 80091a4: | | 4621 mov r1, r4 80091a6: | | 2008 movs r0, #8 80091a8: | | f7f9 f94e bl 8002448 <memp_free> break; 80091ac: +-----------|----- e7bf b.n 800912e <tcpip_thread.lto_priv.0+0x16> msg->msg.cb.function(msg->msg.cb.ctx); 80091ae: | \----> e9d4 3001 ldrd r3, r0, [r4, #4] 80091b2: | 4798 blx r3 break; 80091b4: \----------------- e7bb b.n 800912e <tcpip_thread.lto_priv.0+0x16> 80091b6: bf00 nop 80091b8: 20001200 .word 0x20001200 80091bc: 20001204 .word 0x20001204 80091c0: 200010fc .word 0x200010fc 80091c4: 200001b0 .word 0x200001b0 80091c8: 0800b7b1 .word 0x0800b7b1 80091cc: 0800cd29 .word 0x0800cd29 80091d0: 0800b232 .word 0x0800b232 080091d4 : bgrt_st_t bgrt_queue_post_cs_fn(bgrt_queue_t *q, void *msg, 80091d4: b538 push {r3, r4, r5, lr} 80091d6: 460a mov r2, r1 if (q->enq.counter == 0) 80091d8: f3bf 8f5b dmb ish 80091dc: 6881 ldr r1, [r0, #8] 80091de: f3bf 8f5b dmb ish bgrt_st_t bgrt_queue_post_cs_fn(bgrt_queue_t *q, void *msg, 80091e2: 4604 mov r4, r0 if (q->enq.counter == 0) 80091e4: f100 0308 add.w r3, r0, #8 80091e8: 2900 cmp r1, #0 80091ea: /----------- d03f beq.n 800926c <bgrt_queue_post_cs_fn.constprop.0+0x98> atomic_fetch_sub(&q->enq.counter, 1); 80091ec: | f3bf 8f5b dmb ish 80091f0: | /-> e853 0f00 ldrex r0, [r3] 80091f4: | | 3801 subs r0, #1 80091f6: | | e843 0100 strex r1, r0, [r3] 80091fa: | | 2900 cmp r1, #0 80091fc: | \-- d1f8 bne.n 80091f0 <bgrt_queue_post_cs_fn.constprop.0+0x1c> 80091fe: | f3bf 8f5b dmb ish enqueue ^= !!(q->flags & Q_REV); 8009202: | 8823 ldrh r3, [r4, #0] idx = *obj; 8009204: | f3bf 8f5b dmb ish obj = enqueue ? &q->head : &q->tail; 8009208: | 07db lsls r3, r3, #31 800920a: | bf54 ite pl 800920c: | 1d23 addpl r3, r4, #4 800920e: | 1da3 addmi r3, r4, #6 idx = *obj; 8009210: | 8818 ldrh r0, [r3, #0] 8009212: | f3bf 8f5b dmb ish 8009216: | b280 uxth r0, r0 } while(!atomic_compare_exchange_strong(obj, &idx, next)); 8009218: | /-------> 8865 ldrh r5, [r4, #2] 800921a: | | f3bf 8f5b dmb ish next = (idx + 1) & q->size; 800921e: | | 1c41 adds r1, r0, #1 } while(!atomic_compare_exchange_strong(obj, &idx, next)); 8009220: | | 4029 ands r1, r5 8009222: | | /----> e8d3 5f5f ldrexh r5, [r3] 8009226: | | | 4285 cmp r5, r0 8009228: | | | /-- d104 bne.n 8009234 <bgrt_queue_post_cs_fn.constprop.0+0x60> 800922a: | | | | e8c3 1f5c strexh ip, r1, [r3] 800922e: | | | | f1bc 0f00 cmp.w ip, #0 8009232: | | \--|-- d1f6 bne.n 8009222 <bgrt_queue_post_cs_fn.constprop.0+0x4e> 8009234: | | \-> f3bf 8f5b dmb ish 8009238: | | b2a8 uxth r0, r5 800923a: | \-------- d1ed bne.n 8009218 <bgrt_queue_post_cs_fn.constprop.0+0x44> return &q->queue[idx]; 800923c: | 3004 adds r0, #4 post_cb(p, msg); 800923e: | eb04 0080 add.w r0, r4, r0, lsl #2 8009242: | 2100 movs r1, #0 8009244: | 4790 blx r2 return bgrt_sem_free_cs(q->deq); 8009246: | 68e4 ldr r4, [r4, #12] bgrt_st_t bgrt_sem_free_cs(bgrt_sem_t * sem) { bgrt_st_t ret; if (!sem) 8009248: | /-------- b194 cbz r4, 8009270 <bgrt_queue_post_cs_fn.constprop.0+0x9c> return BGRT_ST_ENULL; } BGRT_SPIN_LOCK(sem); /*Check owner*/ if (((bgrt_sync_t *)sem)->owner) 800924a: | | f8d4 5084 ldr.w r5, [r4, #132] @ 0x84 800924e: | | /----- b98d cbnz r5, 8009274 <bgrt_queue_post_cs_fn.constprop.0+0xa0> ret = bgrt_priv_sync_wake((bgrt_sync_t *)sem, (bgrt_proc_t *)0, (bgrt_flag_t)0); 8009250: | | | 462a mov r2, r5 8009252: | | | 4629 mov r1, r5 8009254: | | | 4620 mov r0, r4 8009256: | | | f7ff fb0b bl 8008870 <bgrt_priv_sync_wake> if (BGRT_ST_EEMPTY == ret) 800925a: | | | 2803 cmp r0, #3 800925c: | | | /-- d105 bne.n 800926a <bgrt_queue_post_cs_fn.constprop.0+0x96> sem->counter++; 800925e: | | | | f8d4 3098 ldr.w r3, [r4, #152] @ 0x98 8009262: | | | | 3301 adds r3, #1 8009264: | | | | f8c4 3098 str.w r3, [r4, #152] @ 0x98 ret = BGRT_ST_OK; 8009268: | | | | 4628 mov r0, r5 } 800926a: | | | >-> bd38 pop {r3, r4, r5, pc} return BGRT_ST_ROLL; 800926c: \--|--|--|-> 2009 movs r0, #9 800926e: | | +-- e7fc b.n 800926a <bgrt_queue_post_cs_fn.constprop.0+0x96> return BGRT_ST_ENULL; 8009270: \--|--|-> 2001 movs r0, #1 8009272: | +-- e7fa b.n 800926a <bgrt_queue_post_cs_fn.constprop.0+0x96> { ret = BGRT_ST_EOWN; 8009274: \--|-> 2002 movs r0, #2 8009276: \-- e7f8 b.n 800926a <bgrt_queue_post_cs_fn.constprop.0+0x96> 08009278 : pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type) 8009278: b538 push {r3, r4, r5, lr} mem_size_t payload_len = (mem_size_t)(LWIP_MEM_ALIGN_SIZE(offset) + LWIP_MEM_ALIGN_SIZE(length)); 800927a: 1cca adds r2, r1, #3 800927c: 1cc3 adds r3, r0, #3 800927e: f022 0203 bic.w r2, r2, #3 8009282: f023 0303 bic.w r3, r3, #3 8009286: 4413 add r3, r2 8009288: b29b uxth r3, r3 if ((payload_len < LWIP_MEM_ALIGN_SIZE(length)) || 800928a: 4293 cmp r3, r2 pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type) 800928c: 4604 mov r4, r0 800928e: 460d mov r5, r1 if ((payload_len < LWIP_MEM_ALIGN_SIZE(length)) || 8009290: /----- d312 bcc.n 80092b8 <pbuf_alloc.constprop.0+0x40> mem_size_t alloc_len = (mem_size_t)(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF) + payload_len); 8009292: | 3310 adds r3, #16 8009294: | b298 uxth r0, r3 if ((payload_len < LWIP_MEM_ALIGN_SIZE(length)) || 8009296: | 4282 cmp r2, r0 8009298: +----- d80e bhi.n 80092b8 <pbuf_alloc.constprop.0+0x40> p = (struct pbuf *)mem_malloc(alloc_len); 800929a: | f7fe ffa7 bl 80081ec <mem_malloc> if (p == NULL) { 800929e: | /-- b150 cbz r0, 80092b6 <pbuf_alloc.constprop.0+0x3e> pbuf_init_alloced_pbuf(p, LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset)), 80092a0: | | 4404 add r4, r0 p->next = NULL; 80092a2: | | 2300 movs r3, #0 pbuf_init_alloced_pbuf(p, LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset)), 80092a4: | | 3413 adds r4, #19 p->next = NULL; 80092a6: | | 6003 str r3, [r0, #0] pbuf_init_alloced_pbuf(p, LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset)), 80092a8: | | f024 0403 bic.w r4, r4, #3 p->type_internal = (u8_t)type; 80092ac: | | 4b03 ldr r3, [pc, #12] @ (80092bc ) p->payload = payload; 80092ae: | | 6044 str r4, [r0, #4] p->tot_len = tot_len; 80092b0: | | 8105 strh r5, [r0, #8] p->len = len; 80092b2: | | 8145 strh r5, [r0, #10] p->type_internal = (u8_t)type; 80092b4: | | 60c3 str r3, [r0, #12] } 80092b6: | >-> bd38 pop {r3, r4, r5, pc} return NULL; 80092b8: \--|-> 2000 movs r0, #0 80092ba: \-- e7fc b.n 80092b6 <pbuf_alloc.constprop.0+0x3e> 80092bc: 00010080 .word 0x00010080 080092c0 : tcp_output_alloc_header_common(u32_t ackno, u16_t optlen, u16_t datalen, 80092c0: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM); 80092c2: 3114 adds r1, #20 tcp_output_alloc_header_common(u32_t ackno, u16_t optlen, u16_t datalen, 80092c4: 4606 mov r6, r0 p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM); 80092c6: b289 uxth r1, r1 80092c8: 2022 movs r0, #34 @ 0x22 tcp_output_alloc_header_common(u32_t ackno, u16_t optlen, u16_t datalen, 80092ca: 4617 mov r7, r2 80092cc: 461d mov r5, r3 p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM); 80092ce: f7ff ffd3 bl 8009278 <pbuf_alloc.constprop.0> if (p != NULL) { 80092d2: 4604 mov r4, r0 80092d4: /----- b350 cbz r0, 800932c <tcp_output_alloc_header_common.constprop.0+0x6c> LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", 80092d6: | 8943 ldrh r3, [r0, #10] 80092d8: | 2b13 cmp r3, #19 80092da: | /-- d80c bhi.n 80092f6 <tcp_output_alloc_header_common.constprop.0+0x36> 80092dc: | | b672 cpsid i 80092de: | | 4b15 ldr r3, [pc, #84] @ (8009334 ) 80092e0: | | 4a15 ldr r2, [pc, #84] @ (8009338 ) 80092e2: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 80092e6: | | 4b15 ldr r3, [pc, #84] @ (800933c ) 80092e8: | | 9300 str r3, [sp, #0] 80092ea: | | 4815 ldr r0, [pc, #84] @ (8009340 ) 80092ec: | | f240 7327 movw r3, #1831 @ 0x727 80092f0: | | f7f8 f802 bl 80012f8 <printf_> 80092f4: | | be00 bkpt 0x0000 return PP_HTONS(n); 80092f6: | \-> f8bd 3020 ldrh.w r3, [sp, #32] tcphdr = (struct tcp_hdr *)p->payload; 80092fa: | 6861 ldr r1, [r4, #4] 80092fc: | ba5b rev16 r3, r3 80092fe: | ba6d rev16 r5, r5 tcphdr->dest = lwip_htons(dst_port); 8009300: | 804b strh r3, [r1, #2] tcphdr->src = lwip_htons(src_port); 8009302: | 800d strh r5, [r1, #0] tcphdr->seqno = seqno_be; 8009304: | 604f str r7, [r1, #4] tcphdr->ackno = lwip_htonl(ackno); 8009306: | 4630 mov r0, r6 8009308: | f7fe ff14 bl 8008134 <lwip_htonl> 800930c: | f89d 3024 ldrb.w r3, [sp, #36] @ 0x24 8009310: | 6088 str r0, [r1, #8] 8009312: | 021b lsls r3, r3, #8 8009314: | f043 0350 orr.w r3, r3, #80 @ 0x50 TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), flags); 8009318: | 818b strh r3, [r1, #12] 800931a: | f8bd 3028 ldrh.w r3, [sp, #40] @ 0x28 800931e: | ba5b rev16 r3, r3 tcphdr->wnd = lwip_htons(wnd); 8009320: | 81cb strh r3, [r1, #14] tcphdr->chksum = 0; 8009322: | 2300 movs r3, #0 8009324: | 740b strb r3, [r1, #16] 8009326: | 744b strb r3, [r1, #17] tcphdr->urgp = 0; 8009328: | 748b strb r3, [r1, #18] 800932a: | 74cb strb r3, [r1, #19] } 800932c: \----> 4620 mov r0, r4 800932e: b003 add sp, #12 8009330: bdf0 pop {r4, r5, r6, r7, pc} 8009332: bf00 nop 8009334: 200001b0 .word 0x200001b0 8009338: 0800cd47 .word 0x0800cd47 800933c: 0800b5cd .word 0x0800b5cd 8009340: 0800b232 .word 0x0800b232 08009344 : tcp_rst_netif(struct netif *netif, u32_t seqno, u32_t ackno, 8009344: b57f push {r0, r1, r2, r3, r4, r5, r6, lr} 8009346: 4614 mov r4, r2 8009348: f8bd 6020 ldrh.w r6, [sp, #32] if (netif) { 800934c: 4605 mov r5, r0 800934e: /-- b1d8 cbz r0, 8009388 <tcp_rst_netif.constprop.0+0x44> p = tcp_output_alloc_header_common(ackno, optlen, 0, lwip_htonl(seqno), local_port, 8009350: | 4608 mov r0, r1 8009352: | f7fe feef bl 8008134 <lwip_htonl> 8009356: | 2114 movs r1, #20 8009358: | 4602 mov r2, r0 800935a: | f246 0008 movw r0, #24584 @ 0x6008 800935e: | e9cd 1001 strd r1, r0, [sp, #4] 8009362: | 9600 str r6, [sp, #0] 8009364: | 4620 mov r0, r4 8009366: | 2100 movs r1, #0 8009368: | f7ff ffaa bl 80092c0 <tcp_output_alloc_header_common.constprop.0> if (p == NULL) { 800936c: | 4604 mov r4, r0 800936e: +-- b158 cbz r0, 8009388 <tcp_rst_netif.constprop.0+0x44> tcp_output_fill_options(pcb, p, 0, 0); 8009370: | f7ff fe38 bl 8008fe4 <tcp_output_fill_options.constprop.0> tcp_output_control_segment_netif(NULL, p, local_ip, remote_ip, netif); 8009374: | 4b05 ldr r3, [pc, #20] @ (800938c ) 8009376: | 9508 str r5, [sp, #32] 8009378: | 1d1a adds r2, r3, #4 800937a: | 4621 mov r1, r4 800937c: | 2000 movs r0, #0 } 800937e: | b004 add sp, #16 8009380: | e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} tcp_output_control_segment_netif(NULL, p, local_ip, remote_ip, netif); 8009384: | f7f9 bc46 b.w 8002c14 <tcp_output_control_segment_netif.lto_priv.0> } 8009388: \-> b004 add sp, #16 800938a: bd70 pop {r4, r5, r6, pc} 800938c: 20001280 .word 0x20001280 08009390 : tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen, 8009390: b57f push {r0, r1, r2, r3, r4, r5, r6, lr} 8009392: 460d mov r5, r1 8009394: 4616 mov r6, r2 LWIP_ASSERT("tcp_output_alloc_header: invalid pcb", pcb != NULL); 8009396: 4604 mov r4, r0 8009398: /-- b960 cbnz r0, 80093b4 <tcp_output_alloc_header.constprop.0+0x24> 800939a: | b672 cpsid i 800939c: | 4b0f ldr r3, [pc, #60] @ (80093dc ) 800939e: | 4a10 ldr r2, [pc, #64] @ (80093e0 ) 80093a0: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 80093a4: | 4b0f ldr r3, [pc, #60] @ (80093e4 ) 80093a6: | 9300 str r3, [sp, #0] 80093a8: | 480f ldr r0, [pc, #60] @ (80093e8 ) 80093aa: | f240 7346 movw r3, #1862 @ 0x746 80093ae: | f7f7 ffa3 bl 80012f8 <printf_> 80093b2: | be00 bkpt 0x0000 p = tcp_output_alloc_header_common(pcb->rcv_nxt, optlen, datalen, 80093b4: \-> 8d63 ldrh r3, [r4, #42] @ 0x2a 80093b6: 9302 str r3, [sp, #8] 80093b8: 2310 movs r3, #16 80093ba: 9301 str r3, [sp, #4] 80093bc: 8b23 ldrh r3, [r4, #24] 80093be: 9300 str r3, [sp, #0] 80093c0: 8ae3 ldrh r3, [r4, #22] 80093c2: 6a60 ldr r0, [r4, #36] @ 0x24 80093c4: 4632 mov r2, r6 80093c6: 4629 mov r1, r5 80093c8: f7ff ff7a bl 80092c0 <tcp_output_alloc_header_common.constprop.0> if (p != NULL) { 80093cc: /-- b118 cbz r0, 80093d6 <tcp_output_alloc_header.constprop.0+0x46> pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd; 80093ce: | 8d62 ldrh r2, [r4, #42] @ 0x2a 80093d0: | 6a63 ldr r3, [r4, #36] @ 0x24 80093d2: | 4413 add r3, r2 80093d4: | 62e3 str r3, [r4, #44] @ 0x2c } 80093d6: \-> b004 add sp, #16 80093d8: bd70 pop {r4, r5, r6, pc} 80093da: bf00 nop 80093dc: 200001b0 .word 0x200001b0 80093e0: 0800cd75 .word 0x0800cd75 80093e4: 0800b5cd .word 0x0800b5cd 80093e8: 0800b232 .word 0x0800b232 080093ec : * @param p the source pbuf * * @return a new pbuf or NULL if allocation fails */ struct pbuf * pbuf_clone(pbuf_layer layer, pbuf_type type, struct pbuf *p) 80093ec: b537 push {r0, r1, r2, r4, r5, lr} 80093ee: 460d mov r5, r1 { struct pbuf *q; err_t err; q = pbuf_alloc(layer, p->tot_len, type); 80093f0: 8909 ldrh r1, [r1, #8] 80093f2: f7ff ff41 bl 8009278 <pbuf_alloc.constprop.0> if (q == NULL) { 80093f6: 4604 mov r4, r0 80093f8: /-- b180 cbz r0, 800941c <pbuf_clone.constprop.0+0x30> return NULL; } err = pbuf_copy(q, p); 80093fa: | 4629 mov r1, r5 80093fc: | f7f9 f9e8 bl 80027d0 <pbuf_copy> LWIP_UNUSED_ARG(err); /* in case of LWIP_NOASSERT */ LWIP_ASSERT("pbuf_copy failed", err == ERR_OK); 8009400: +-- b160 cbz r0, 800941c <pbuf_clone.constprop.0+0x30> 8009402: | b672 cpsid i 8009404: | 4b07 ldr r3, [pc, #28] @ (8009424 ) 8009406: | 4a08 ldr r2, [pc, #32] @ (8009428 ) 8009408: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800940c: | 4b07 ldr r3, [pc, #28] @ (800942c ) 800940e: | 9300 str r3, [sp, #0] 8009410: | 4807 ldr r0, [pc, #28] @ (8009430 ) 8009412: | f240 5343 movw r3, #1347 @ 0x543 8009416: | f7f7 ff6f bl 80012f8 <printf_> 800941a: | be00 bkpt 0x0000 return q; } 800941c: \-> 4620 mov r0, r4 800941e: b003 add sp, #12 8009420: bd30 pop {r4, r5, pc} 8009422: bf00 nop 8009424: 200001b0 .word 0x200001b0 8009428: 0800cd9a .word 0x0800cd9a 800942c: 0800b387 .word 0x0800b387 8009430: 0800b232 .word 0x0800b232 08009434 <_ntoa_long.constprop.0>: static size_t _ntoa_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen, unsigned long value, bool negative, unsigned long base, unsigned int prec, unsigned int width, unsigned int flags) 8009434: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 8009438: b089 sub sp, #36 @ 0x24 800943a: e9dd 6515 ldrd r6, r5, [sp, #84] @ 0x54 800943e: f89d c048 ldrb.w ip, [sp, #72] @ 0x48 8009442: 9f13 ldr r7, [sp, #76] @ 0x4c 8009444: 4681 mov r9, r0 8009446: 468a mov sl, r1 8009448: 4690 mov r8, r2 if (!value) { 800944a: 461c mov r4, r3 800944c: /-- b90b cbnz r3, 8009452 <_ntoa_long.constprop.0+0x1e> flags &= ~FLAGS_HASH; 800944e: | f025 0510 bic.w r5, r5, #16 if (!(flags & FLAGS_PRECISION) || value) { 8009452: \-> f415 6e80 ands.w lr, r5, #1024 @ 0x400 8009456: /-- d000 beq.n 800945a <_ntoa_long.constprop.0+0x26> 8009458: /--|-- b1e4 cbz r4, 8009494 <_ntoa_long.constprop.0+0x60> 800945a: | \-> f015 0f20 tst.w r5, #32 800945e: | bf14 ite ne 8009460: | 2041 movne r0, #65 @ 0x41 8009462: | 2061 moveq r0, #97 @ 0x61 buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; 8009464: | 4622 mov r2, r4 8009466: | 46eb mov fp, sp 8009468: | 2400 movs r4, #0 800946a: | 380a subs r0, #10 const char digit = (char)(value % base); 800946c: /-----------|----> fbb2 f1f7 udiv r1, r2, r7 8009470: | | fb07 2111 mls r1, r7, r1, r2 8009474: | | b2cb uxtb r3, r1 buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; 8009476: | | 2909 cmp r1, #9 8009478: | | bf94 ite ls 800947a: | | 3330 addls r3, #48 @ 0x30 800947c: | | 181b addhi r3, r3, r0 800947e: | | b2db uxtb r3, r3 } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); 8009480: | | 42ba cmp r2, r7 buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; 8009482: | | f80b 3b01 strb.w r3, [fp], #1 value /= base; 8009486: | | fbb2 f3f7 udiv r3, r2, r7 buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; 800948a: | | f104 0401 add.w r4, r4, #1 } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); 800948e: | +----- d301 bcc.n 8009494 <_ntoa_long.constprop.0+0x60> 8009490: | | 2c20 cmp r4, #32 8009492: | /-----|----- d10f bne.n 80094b4 <_ntoa_long.constprop.0+0x80> if (!(flags & FLAGS_LEFT)) { 8009494: | | \----> f015 0b02 ands.w fp, r5, #2 8009498: | /--|----------- d11c bne.n 80094d4 <_ntoa_long.constprop.0+0xa0> if (width && (flags & FLAGS_ZEROPAD) && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { 800949a: | | | f005 0301 and.w r3, r5, #1 800949e: | | | /----- b13e cbz r6, 80094b0 <_ntoa_long.constprop.0+0x7c> 80094a0: | | | +----- b133 cbz r3, 80094b0 <_ntoa_long.constprop.0+0x7c> 80094a2: | | | | f1bc 0f00 cmp.w ip, #0 80094a6: | | | | /-- d102 bne.n 80094ae <_ntoa_long.constprop.0+0x7a> 80094a8: | | | | | f015 0f0c tst.w r5, #12 80094ac: | | | +--|-- d000 beq.n 80094b0 <_ntoa_long.constprop.0+0x7c> width--; 80094ae: | | | | \-> 3e01 subs r6, #1 buf[len++] = '0'; 80094b0: | | | \----> 2230 movs r2, #48 @ 0x30 80094b2: | | | /-------- e006 b.n 80094c2 <_ntoa_long.constprop.0+0x8e> value /= base; 80094b4: | | \--|-------> 461a mov r2, r3 80094b6: \--|-----|-------- e7d9 b.n 800946c <_ntoa_long.constprop.0+0x38> while ((len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { 80094b8: | | /-> 2c20 cmp r4, #32 80094ba: | | /--|-- d005 beq.n 80094c8 <_ntoa_long.constprop.0+0x94> buf[len++] = '0'; 80094bc: | | | | f80d 2004 strb.w r2, [sp, r4] 80094c0: | | | | 3401 adds r4, #1 while ((len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { 80094c2: | \--|--|-> 9914 ldr r1, [sp, #80] @ 0x50 80094c4: | | | 42a1 cmp r1, r4 80094c6: | | \-- d8f7 bhi.n 80094b8 <_ntoa_long.constprop.0+0x84> while ((flags & FLAGS_ZEROPAD) && (len < width) && (len < PRINTF_NTOA_BUFFER_SIZE)) { 80094c8: +--------\----X b123 cbz r3, 80094d4 <_ntoa_long.constprop.0+0xa0> buf[len++] = '0'; 80094ca: | 2330 movs r3, #48 @ 0x30 while ((flags & FLAGS_ZEROPAD) && (len < width) && (len < PRINTF_NTOA_BUFFER_SIZE)) { 80094cc: /-----------------|-------------> 42b4 cmp r4, r6 80094ce: | +-------------- d201 bcs.n 80094d4 <_ntoa_long.constprop.0+0xa0> 80094d0: | | 2c20 cmp r4, #32 80094d2: | /-----|-------------- d130 bne.n 8009536 <_ntoa_long.constprop.0+0x102> if (flags & FLAGS_HASH) { 80094d4: | | \-------------> 06eb lsls r3, r5, #27 80094d6: | | /----- d521 bpl.n 800951c <_ntoa_long.constprop.0+0xe8> if (!(flags & FLAGS_PRECISION) && len && ((len == prec) || (len == width))) { 80094d8: | | | f1be 0f00 cmp.w lr, #0 80094dc: | /--|--------------|----- d130 bne.n 8009540 <_ntoa_long.constprop.0+0x10c> 80094de: | +--|--------------|----- b37c cbz r4, 8009540 <_ntoa_long.constprop.0+0x10c> 80094e0: | | | | 9b14 ldr r3, [sp, #80] @ 0x50 80094e2: | | | | 42a3 cmp r3, r4 80094e4: | | | | /-- d001 beq.n 80094ea <_ntoa_long.constprop.0+0xb6> 80094e6: | | | | | 42b4 cmp r4, r6 80094e8: | +--|--------------|--|-- d12a bne.n 8009540 <_ntoa_long.constprop.0+0x10c> if (len && (base == 16U)) { 80094ea: | | | | \-> 1e63 subs r3, r4, #1 80094ec: | | | /-----|----- d027 beq.n 800953e <_ntoa_long.constprop.0+0x10a> 80094ee: | | | | | 2f10 cmp r7, #16 80094f0: /-----------|--------|--|--------|-----|----- d17e bne.n 80095f0 <_ntoa_long.constprop.0+0x1bc> len--; 80094f2: | | | | | | 3c02 subs r4, #2 if ((base == 16U) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { 80094f4: | | | | | /--|----> 06a8 lsls r0, r5, #26 80094f6: | | | | /--|--|--|----- d42e bmi.n 8009556 <_ntoa_long.constprop.0+0x122> 80094f8: | | | | | | | | 2c20 cmp r4, #32 80094fa: | | | | /--|--|--|--|----- d02e beq.n 800955a <_ntoa_long.constprop.0+0x126> buf[len++] = 'x'; 80094fc: | | | | | | | | | f104 0320 add.w r3, r4, #32 8009500: | | | | | | | | | 446b add r3, sp 8009502: | | | | | | | | | 2278 movs r2, #120 @ 0x78 buf[len++] = 'b'; 8009504: | /-----|--------|--|--|--|--|--|--|----> f803 2c20 strb.w r2, [r3, #-32] 8009508: | | | | | | | | | | 3401 adds r4, #1 if (len < PRINTF_NTOA_BUFFER_SIZE) { 800950a: | | | | | | | | | | /-> 2c20 cmp r4, #32 800950c: | | | | | +--|--|--|--|--|-- d025 beq.n 800955a <_ntoa_long.constprop.0+0x126> buf[len++] = '0'; 800950e: | /--|-----|--------|--|--|--|--|--|--|--|-> f104 0320 add.w r3, r4, #32 8009512: | | | | | | | | | | | | 446b add r3, sp 8009514: | | | | | | | | | | | | 2230 movs r2, #48 @ 0x30 8009516: | | | | | | | | | | | | f803 2c20 strb.w r2, [r3, #-32] 800951a: | | | | | | | | | | | | 3401 adds r4, #1 if (len < PRINTF_NTOA_BUFFER_SIZE) { 800951c: | | | | | | | | | | \--|-> 2c20 cmp r4, #32 800951e: | | | | | | +--|--|--|-----|-- d01c beq.n 800955a <_ntoa_long.constprop.0+0x126> if (negative) { 8009520: | | | | | | | | | | | f1bc 0f00 cmp.w ip, #0 8009524: | | | | /--|--|--|--|--|--|-----|-- d032 beq.n 800958c <_ntoa_long.constprop.0+0x158> buf[len++] = '-'; 8009526: | | | | | | | | | | | | f104 0320 add.w r3, r4, #32 800952a: | | | | | | | | | | | | 446b add r3, sp 800952c: | | | | | | | | | | | | 222d movs r2, #45 @ 0x2d buf[len++] = ' '; 800952e: | | | /--|-----|--|--|--|--|--|--|-----|-> f803 2c20 strb.w r2, [r3, #-32] 8009532: | | | | | | | | | | | | | 3401 adds r4, #1 8009534: | | | | | /--|--|--|--|--|--|--|-----|-- e012 b.n 800955c <_ntoa_long.constprop.0+0x128> buf[len++] = '0'; 8009536: | | | | | | | | \--|--|--|--|-----|-> f80d 3004 strb.w r3, [sp, r4] 800953a: | | | | | | | | | | | | | 3401 adds r4, #1 800953c: | | | | \--|--|--|-----|--|--|--|-----|-- e7c6 b.n 80094cc <_ntoa_long.constprop.0+0x98> 800953e: | | | | | | | | | \--|-----|-> 461c mov r4, r3 if ((base == 16U) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { 8009540: | | | | | | \-----|--|-----|-----|-> 2f10 cmp r7, #16 8009542: | | | | | | | | \-----|-- d0d7 beq.n 80094f4 <_ntoa_long.constprop.0+0xc0> else if ((base == 2U) && (len < PRINTF_NTOA_BUFFER_SIZE)) { 8009544: | | | | | | | | | 2f02 cmp r7, #2 8009546: | | | | | | | | \-- d1e0 bne.n 800950a <_ntoa_long.constprop.0+0xd6> 8009548: | | | | | | | | 2c20 cmp r4, #32 800954a: | | | | | | +--|-------------- d006 beq.n 800955a <_ntoa_long.constprop.0+0x126> buf[len++] = 'b'; 800954c: | | | | /--|--|--------|--|-------------> f104 0320 add.w r3, r4, #32 8009550: | | | | | | | | | 446b add r3, sp 8009552: | | | | | | | | | 2262 movs r2, #98 @ 0x62 8009554: | | +--|--|--|--|--------|--|-------------- e7d6 b.n 8009504 <_ntoa_long.constprop.0+0xd0> else if ((base == 16U) && (flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { 8009556: | | | | | | | | \-------------> 2c20 cmp r4, #32 8009558: | | | | | | | | /----- d113 bne.n 8009582 <_ntoa_long.constprop.0+0x14e> buf[len++] = '0'; 800955a: | | | | | | | \-----------|----> 2420 movs r4, #32 if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { 800955c: | | | | | >--|--------------------|----> 07ab lsls r3, r5, #30 800955e: | | | | | | | /-----------|----- d033 beq.n 80095c8 <_ntoa_long.constprop.0+0x194> 8009560: | | | | | | | | | 4645 mov r5, r8 8009562: | | | | | | | | /--|----> 4425 add r5, r4 8009564: | | | | | | | /--|--------|--|----> 4628 mov r0, r5 8009566: | | | | | | | | | | | 1b2a subs r2, r5, r4 while (len) { 8009568: | | | | | | | | | /-----|--|----- bb94 cbnz r4, 80095d0 <_ntoa_long.constprop.0+0x19c> if (flags & FLAGS_LEFT) { 800956a: | | | | | | | | | | | | f1bb 0f00 cmp.w fp, #0 800956e: | | | | | | | | | | | | /-- d005 beq.n 800957c <_ntoa_long.constprop.0+0x148> 8009570: | | | | | | | | | | | | | eba5 0508 sub.w r5, r5, r8 while (idx - start_idx < width) { 8009574: | | | | | | | /--|--|--|-----|--|--|-> 42ae cmp r6, r5 8009576: | | | | | | | | | | | | | | eb08 0005 add.w r0, r8, r5 800957a: | | | | | | | | | | | /--|--|--|-- d831 bhi.n 80095e0 <_ntoa_long.constprop.0+0x1ac> } 800957c: | | | | | | | | | | | | | | \-> b009 add sp, #36 @ 0x24 800957e: | | | | | | | | | | | | | | e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} buf[len++] = 'X'; 8009582: | | | | | | | | | | | | | \----> f104 0320 add.w r3, r4, #32 8009586: | | | | | | | | | | | | | 446b add r3, sp 8009588: | | | | | | | | | | | | | 2258 movs r2, #88 @ 0x58 800958a: | | \--|--|--|--|--|--|--|--|--|--|-------- e7bb b.n 8009504 <_ntoa_long.constprop.0+0xd0> else if (flags & FLAGS_PLUS) { 800958c: | | | | | \--|--|--|--|--|--|-------> 0769 lsls r1, r5, #29 800958e: | | | | | | | | | | | /-- d504 bpl.n 800959a <_ntoa_long.constprop.0+0x166> buf[len++] = '+'; // ignore the space if the '+' exists 8009590: | | | | | | | | | | | | f104 0320 add.w r3, r4, #32 8009594: | | | | | | | | | | | | 446b add r3, sp 8009596: | | | | | | | | | | | | 222b movs r2, #43 @ 0x2b 8009598: | | +--|--|-----|--|--|--|--|--|-----|-- e7c9 b.n 800952e <_ntoa_long.constprop.0+0xfa> else if (flags & FLAGS_SPACE) { 800959a: | | | | | | | | | | | \-> 072a lsls r2, r5, #28 800959c: | | | | \-----|--|--|--|--|--|-------- d5de bpl.n 800955c <_ntoa_long.constprop.0+0x128> buf[len++] = ' '; 800959e: | | | | | | | | | | f104 0320 add.w r3, r4, #32 80095a2: | | | | | | | | | | 446b add r3, sp 80095a4: | | | | | | | | | | 2220 movs r2, #32 80095a6: | | \--|--------|--|--|--|--|--|-------- e7c2 b.n 800952e <_ntoa_long.constprop.0+0xfa> out(' ', buffer, idx++, maxlen); 80095a8: | | | | | | | | | /-> f04f 33ff mov.w r3, #4294967295 @ 0xffffffff 80095ac: | | | | | | | | | | 4651 mov r1, sl 80095ae: | | | | | | | | | | 2020 movs r0, #32 80095b0: | | | | | | | | | | 47c8 blx r9 for (size_t i = len; i < width; i++) { 80095b2: | | | | | | | | | | 3501 adds r5, #1 80095b4: | | | | | | | | | /--|-> 42ae cmp r6, r5 80095b6: | | | | | | | | | | | eb07 0205 add.w r2, r7, r5 80095ba: | | | | | | | | | | \-- d8f5 bhi.n 80095a8 <_ntoa_long.constprop.0+0x174> 80095bc: | | | | | | | | | | 1b35 subs r5, r6, r4 80095be: | | | | | | | | | | 42a6 cmp r6, r4 80095c0: | | | | | | | | | | bf38 it cc 80095c2: | | | | | | | | | | 2500 movcc r5, #0 80095c4: | | | | | | | | | | 4445 add r5, r8 80095c6: | | | | | | | | \--|----- e7cc b.n 8009562 <_ntoa_long.constprop.0+0x12e> 80095c8: | | | | | \--|--|-----|----> 4625 mov r5, r4 80095ca: | | | | | | | | eba8 0704 sub.w r7, r8, r4 80095ce: | | | | | | | \----- e7f1 b.n 80095b4 <_ntoa_long.constprop.0+0x180> out(buf[--len], buffer, idx++, maxlen); 80095d0: | | | | | \--|----------> 3c01 subs r4, #1 80095d2: | | | | | | f04f 33ff mov.w r3, #4294967295 @ 0xffffffff 80095d6: | | | | | | f81d 0004 ldrb.w r0, [sp, r4] 80095da: | | | | | | 4651 mov r1, sl 80095dc: | | | | | | 47c8 blx r9 80095de: | | | | \--------|----------- e7c1 b.n 8009564 <_ntoa_long.constprop.0+0x130> out(' ', buffer, idx++, maxlen); 80095e0: | | | | \----------> 4602 mov r2, r0 80095e2: | | | | f04f 33ff mov.w r3, #4294967295 @ 0xffffffff 80095e6: | | | | 4651 mov r1, sl 80095e8: | | | | 2020 movs r0, #32 80095ea: | | | | 47c8 blx r9 80095ec: | | | | 3501 adds r5, #1 80095ee: | | | \----------------------- e7c1 b.n 8009574 <_ntoa_long.constprop.0+0x140> else if ((base == 2U) && (len < PRINTF_NTOA_BUFFER_SIZE)) { 80095f0: \--|--------|-------------------------------> 2f02 cmp r7, #2 len--; 80095f2: | | 461c mov r4, r3 else if ((base == 2U) && (len < PRINTF_NTOA_BUFFER_SIZE)) { 80095f4: \--------|-------------------------------- d18b bne.n 800950e <_ntoa_long.constprop.0+0xda> 80095f6: \-------------------------------- e7a9 b.n 800954c <_ntoa_long.constprop.0+0x118> 080095f8 : static uint32_t sys_arch_dummy_arg; sys_thread_t sys_thread_new(const char *name, 80095f8: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 80095fc: 4683 mov fp, r0 (void)name; ssize = ssize ? ssize : DEFAULT_THREAD_STACKSIZE; LWIP_ASSERT("sane stacksize", ssize <= MAX_THREAD_STACKSIZE); stack = mem_malloc(ssize * sizeof(bgrt_stack_t)); 80095fe: 0098 lsls r0, r3, #2 sys_thread_t sys_thread_new(const char *name, 8009600: b085 sub sp, #20 stack = mem_malloc(ssize * sizeof(bgrt_stack_t)); 8009602: b280 uxth r0, r0 sys_thread_t sys_thread_new(const char *name, 8009604: 460f mov r7, r1 8009606: 4616 mov r6, r2 8009608: 4698 mov r8, r3 stack = mem_malloc(ssize * sizeof(bgrt_stack_t)); 800960a: f7fe fdef bl 80081ec <mem_malloc> 800960e: f8df 9194 ldr.w r9, [pc, #404] @ 80097a4 LWIP_ASSERT("stack != NULL", stack); 8009612: 4682 mov sl, r0 8009614: /-- b958 cbnz r0, 800962e <sys_thread_new.constprop.0.isra.0+0x36> 8009616: | b672 cpsid i 8009618: | 4b58 ldr r3, [pc, #352] @ (800977c ) return bgrt_kernel.timer.val; 800961a: | f8d9 11ac ldr.w r1, [r9, #428] @ 0x1ac LWIP_ASSERT("stack != NULL", stack); 800961e: | 4a58 ldr r2, [pc, #352] @ (8009780 ) 8009620: | 9300 str r3, [sp, #0] 8009622: | 4858 ldr r0, [pc, #352] @ (8009784 ) 8009624: | f44f 738f mov.w r3, #286 @ 0x11e 8009628: | f7f7 fe66 bl 80012f8 <printf_> 800962c: | be00 bkpt 0x0000 return do_memp_malloc_pool(desc); 800962e: \-> 4856 ldr r0, [pc, #344] @ (8009788 ) 8009630: f7f8 fc69 bl 8001f06 <do_memp_malloc_pool.lto_priv.0> thread.proc = LWIP_MEMPOOL_ALLOC(bgrt_proc); LWIP_ASSERT("thread.proc != NULL", thread.proc); 8009634: 4604 mov r4, r0 8009636: /-- b958 cbnz r0, 8009650 <sys_thread_new.constprop.0.isra.0+0x58> 8009638: | b672 cpsid i 800963a: | 4b50 ldr r3, [pc, #320] @ (800977c ) return bgrt_kernel.timer.val; 800963c: | f8d9 11ac ldr.w r1, [r9, #428] @ 0x1ac LWIP_ASSERT("thread.proc != NULL", thread.proc); 8009640: | 4a52 ldr r2, [pc, #328] @ (800978c ) 8009642: | 9300 str r3, [sp, #0] 8009644: | 484f ldr r0, [pc, #316] @ (8009784 ) 8009646: | f240 1321 movw r3, #289 @ 0x121 800964a: | f7f7 fe55 bl 80012f8 <printf_> 800964e: | be00 bkpt 0x0000 st = bgrt_proc_init(thread.proc, 8009650: \-> 4b4f ldr r3, [pc, #316] @ (8009790 ) 8009652: 2e00 cmp r6, #0 8009654: bf08 it eq 8009656: 461e moveq r6, r3 BGRT_INT_LOCK(); 8009658: f04f 00f0 mov.w r0, #240 @ 0xf0 800965c: f380 8811 msr BASEPRI, r0 8009660: f3bf 8f4f dsb sy 8009664: f3bf 8f6f isb sy 8009668: 2301 movs r3, #1 if (!proc) 800966a: 2c00 cmp r4, #0 800966c: /-- d051 beq.n 8009712 <sys_thread_new.constprop.0.isra.0+0x11a> bgrt_pitem_init((bgrt_pitem_t *)proc, prio); 800966e: | 211f movs r1, #31 8009670: | 4620 mov r0, r4 8009672: | f7fe f9d7 bl 8007a24 <bgrt_pitem_init> pcounter->map = (bgrt_map_t)0; 8009676: | 2100 movs r1, #0 8009678: | f8c4 1094 str.w r1, [r4, #148] @ 0x94 pcounter->counter[p] = (bgrt_cnt_t)0; /* ADLINT:SL:[W0705] Out of range access!*/ 800967c: | 2280 movs r2, #128 @ 0x80 800967e: | f104 0014 add.w r0, r4, #20 8009682: | f001 fc27 bl 800aed4 <memset> proc->flags = (is_rt)?(BGRT_PROC_FLG_RT|BGRT_PROC_FLG_RR):(BGRT_PROC_FLG_RR); /* Default behavior is round robin scheduling*/ 8009686: | f44f 50fa mov.w r0, #8000 @ 0x1f40 800968a: | 8220 strh r0, [r4, #16] pmain, &sys_arch_dummy_cb, &sys_arch_dummy_cb, arg ? arg : &sys_arch_dummy_arg, &stack[ssize - 1], 800968c: | f108 4280 add.w r2, r8, #1073741824 @ 0x40000000 proc->sv_hook = sv_hook; 8009690: | 4840 ldr r0, [pc, #256] @ (8009794 ) proc->pmain = pmain; 8009692: | f8c4 70a8 str.w r7, [r4, #168] @ 0xa8 8009696: | 3a01 subs r2, #1 st = bgrt_proc_init(thread.proc, 8009698: | eb0a 0582 add.w r5, sl, r2, lsl #2 proc->rs_hook = rs_hook; 800969c: | e9c4 002b strd r0, r0, [r4, #172] @ 0xac proc->time_quant = time_quant; 80096a0: | 2301 movs r3, #1 proc->sync = (bgrt_sync_t *)0; /* ADLINT:SL:[W0567] Int to pointer*/ 80096a2: | 2100 movs r1, #0 *sstart = (bgrt_stack_t)0x01000000; /* psr */ 80096a4: | f04f 7080 mov.w r0, #16777216 @ 0x1000000 proc->time_quant = time_quant; 80096a8: | f8c4 3098 str.w r3, [r4, #152] @ 0x98 proc->sstart = sstart; 80096ac: | e9c4 652d strd r6, r5, [r4, #180] @ 0xb4 proc->timer = time_quant; 80096b0: | f8c4 309c str.w r3, [r4, #156] @ 0x9c proc->cnt_lock = (bgrt_cnt_t)0; 80096b4: | e9c4 1128 strd r1, r1, [r4, #160] @ 0xa0 80096b8: | f84a 0022 str.w r0, [sl, r2, lsl #2] *(--sstart) = (bgrt_stack_t)return_address; /* lr !!! return_address !!! */ 80096bc: | 4a36 ldr r2, [pc, #216] @ (8009798 ) 80096be: | f845 2c08 str.w r2, [r5, #-8] *(--sstart) = (bgrt_stack_t)0x03; /* r3 */ 80096c2: | 2012 movs r0, #18 80096c4: | 2203 movs r2, #3 80096c6: | e945 2004 strd r2, r0, [r5, #-16] *(--sstart) = (bgrt_stack_t)0x02; /* r2 */ 80096ca: | 2202 movs r2, #2 *(--sstart) = (bgrt_stack_t)0x01; /* r1 */ 80096cc: | e945 3206 strd r3, r2, [r5, #-24] *(--sstart) = (bgrt_stack_t)arg; /* r0 !!! arg !!! */ 80096d0: | f845 6c1c str.w r6, [r5, #-28] *(--sstart) = (bgrt_stack_t)0x11; /* r11 */ 80096d4: | 2311 movs r3, #17 80096d6: | f06f 0602 mvn.w r6, #2 80096da: | e945 3609 strd r3, r6, [r5, #-36] @ 0x24 *(--sstart) = (bgrt_stack_t)0x09; /* r9 */ 80096de: | f04f 0c10 mov.w ip, #16 80096e2: | 2309 movs r3, #9 80096e4: | e945 3c0b strd r3, ip, [r5, #-44] @ 0x2c *(--sstart) = (bgrt_stack_t)0x07; /* r7 */ 80096e8: | f04f 0e08 mov.w lr, #8 80096ec: | 2307 movs r3, #7 80096ee: | e945 3e0d strd r3, lr, [r5, #-52] @ 0x34 *(--sstart) = (bgrt_stack_t)0x05; /* r5 */ 80096f2: | f04f 0a06 mov.w sl, #6 80096f6: | 2305 movs r3, #5 80096f8: | e945 3a0f strd r3, sl, [r5, #-60] @ 0x3c *(--sstart) = (bgrt_stack_t)0x04; /* r4 */ 80096fc: | 2304 movs r3, #4 *(--sstart) = (bgrt_stack_t)pmain; /* pc !!! pmain !!! */ 80096fe: | f845 7c04 str.w r7, [r5, #-4] *(--sstart) = (bgrt_stack_t)0x04; /* r4 */ 8009702: | f845 3d40 str.w r3, [r5, #-64]! BGRT_USPD_INIT(proc); /* ADLINT:SL:[W0567,W0425] Int to pointer, multiline macro*/ 8009706: | e9c4 512f strd r5, r1, [r4, #188] @ 0xbc 800970a: | 2315 movs r3, #21 800970c: | f884 30c4 strb.w r3, [r4, #196] @ 0xc4 return BGRT_ST_OK; 8009710: | 460b mov r3, r1 BGRT_INT_FREE(); /* ADLINT:SL:[W0431] Indentation */ 8009712: \-> f04f 0000 mov.w r0, #0 8009716: f380 8811 msr BASEPRI, r0 800971a: f3bf 8f4f dsb sy 800971e: f3bf 8f6f isb sy prio, 1, 0); LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 8009722: /-- b15b cbz r3, 800973c <sys_thread_new.constprop.0.isra.0+0x144> 8009724: | b672 cpsid i 8009726: | 4b15 ldr r3, [pc, #84] @ (800977c ) return bgrt_kernel.timer.val; 8009728: | f8d9 11ac ldr.w r1, [r9, #428] @ 0x1ac LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 800972c: | 4a1b ldr r2, [pc, #108] @ (800979c ) 800972e: | 9300 str r3, [sp, #0] 8009730: | 4814 ldr r0, [pc, #80] @ (8009784 ) 8009732: | f44f 7395 mov.w r3, #298 @ 0x12a 8009736: | f7f7 fddf bl 80012f8 <printf_> 800973a: | be00 bkpt 0x0000 st = bgrt_proc_run(thread.proc); 800973c: \-> 4621 mov r1, r4 800973e: 2000 movs r0, #0 8009740: f7fe faea bl 8007d18 <bgrt_syscall> LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 8009744: /-- b158 cbz r0, 800975e <sys_thread_new.constprop.0.isra.0+0x166> 8009746: | b672 cpsid i 8009748: | 4b0c ldr r3, [pc, #48] @ (800977c ) return bgrt_kernel.timer.val; 800974a: | f8d9 11ac ldr.w r1, [r9, #428] @ 0x1ac LWIP_ASSERT("st == BGRT_ST_OK", st == BGRT_ST_OK); 800974e: | 4a13 ldr r2, [pc, #76] @ (800979c ) 8009750: | 9300 str r3, [sp, #0] 8009752: | 480c ldr r0, [pc, #48] @ (8009784 ) 8009754: | f240 132d movw r3, #301 @ 0x12d 8009758: | f7f7 fdce bl 80012f8 <printf_> 800975c: | be00 bkpt 0x0000 LWIP_DEBUGF(SYS_ARCH_DEBUG, ("thread[%s]=%p fn=%p prio=%d stack=%d\n", 800975e: \-> 231f movs r3, #31 return bgrt_kernel.timer.val; 8009760: f8d9 11ac ldr.w r1, [r9, #428] @ 0x1ac LWIP_DEBUGF(SYS_ARCH_DEBUG, ("thread[%s]=%p fn=%p prio=%d stack=%d\n", 8009764: 480e ldr r0, [pc, #56] @ (80097a0 ) 8009766: f8cd 8008 str.w r8, [sp, #8] 800976a: e9cd 7300 strd r7, r3, [sp] 800976e: 465a mov r2, fp 8009770: 4623 mov r3, r4 8009772: f7f7 fdc1 bl 80012f8 <printf_> name, thread.proc, pmain, prio, ssize)); return thread; } 8009776: b005 add sp, #20 8009778: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} 800977c: 0800cbc1 .word 0x0800cbc1 8009780: 0800cdab .word 0x0800cdab 8009784: 0800b232 .word 0x0800b232 8009788: 0800d2e0 .word 0x0800d2e0 800978c: 0800cdb9 .word 0x0800cdb9 8009790: 20008104 .word 0x20008104 8009794: 08007789 .word 0x08007789 8009798: 08007d89 .word 0x08007d89 800979c: 0800b221 .word 0x0800b221 80097a0: 0800cdcd .word 0x0800cdcd 80097a4: 200001b0 .word 0x200001b0 080097a8 : bgrt_st_t bgrt_queue_init(bgrt_queue_t *q, uint16_t size, uint16_t flags) 80097a8: e92d 47f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, r9, sl, lr} 80097ac: 4605 mov r5, r0 80097ae: 460c mov r4, r1 80097b0: 4616 mov r6, r2 BGRT_INT_LOCK(); 80097b2: f04f 00f0 mov.w r0, #240 @ 0xf0 80097b6: f380 8811 msr BASEPRI, r0 80097ba: f3bf 8f4f dsb sy 80097be: f3bf 8f6f isb sy BGRT_ASSERT(q, "#queue must not be NULL"); 80097c2: /-- b95d cbnz r5, 80097dc <bgrt_queue_init.isra.0+0x34> 80097c4: | b672 cpsid i 80097c6: | 4b3a ldr r3, [pc, #232] @ (80098b0 ) 80097c8: | 4a3a ldr r2, [pc, #232] @ (80098b4 ) 80097ca: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 80097ce: | 4b3a ldr r3, [pc, #232] @ (80098b8 ) 80097d0: | 9300 str r3, [sp, #0] 80097d2: | 483a ldr r0, [pc, #232] @ (80098bc ) 80097d4: | 2308 movs r3, #8 80097d6: | f7f7 fd8f bl 80012f8 <printf_> 80097da: | be00 bkpt 0x0000 BGRT_ASSERT(q->deq, "#queue->deq must not be NULL"); 80097dc: \-> 68eb ldr r3, [r5, #12] 80097de: /-- b95b cbnz r3, 80097f8 <bgrt_queue_init.isra.0+0x50> 80097e0: | b672 cpsid i 80097e2: | 4b33 ldr r3, [pc, #204] @ (80098b0 ) 80097e4: | 4a36 ldr r2, [pc, #216] @ (80098c0 ) 80097e6: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 80097ea: | 4b33 ldr r3, [pc, #204] @ (80098b8 ) 80097ec: | 9300 str r3, [sp, #0] 80097ee: | 4833 ldr r0, [pc, #204] @ (80098bc ) 80097f0: | 2309 movs r3, #9 80097f2: | f7f7 fd81 bl 80012f8 <printf_> 80097f6: | be00 bkpt 0x0000 BGRT_ASSERT(((flags & Q_CS) || q->enq.sem), "#queue->enq.sem must not be NULL"); 80097f8: \-> f016 0804 ands.w r8, r6, #4 80097fc: /-- d10d bne.n 800981a <bgrt_queue_init.isra.0+0x72> 80097fe: | 68ab ldr r3, [r5, #8] 8009800: +-- b95b cbnz r3, 800981a <bgrt_queue_init.isra.0+0x72> 8009802: | b672 cpsid i 8009804: | 4b2a ldr r3, [pc, #168] @ (80098b0 ) 8009806: | 4a2f ldr r2, [pc, #188] @ (80098c4 ) 8009808: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800980c: | 4b2a ldr r3, [pc, #168] @ (80098b8 ) 800980e: | 9300 str r3, [sp, #0] 8009810: | 482a ldr r0, [pc, #168] @ (80098bc ) 8009812: | 230a movs r3, #10 8009814: | f7f7 fd70 bl 80012f8 <printf_> 8009818: | be00 bkpt 0x0000 q->size = size -= 1; 800981a: \-> 3c01 subs r4, #1 800981c: b2a4 uxth r4, r4 q->flags = flags; 800981e: 802e strh r6, [r5, #0] q->size = size -= 1; 8009820: 806c strh r4, [r5, #2] q->head = q->tail = 0; 8009822: f04f 0900 mov.w r9, #0 8009826: f3bf 8f5b dmb ish 800982a: f8a5 9006 strh.w r9, [r5, #6] 800982e: f3bf 8f5b dmb ish 8009832: f3bf 8f5b dmb ish 8009836: f8a5 9004 strh.w r9, [r5, #4] 800983a: f3bf 8f5b dmb ish bgrt_sem_init_cs(q->deq, (flags & Q_REV) ? size : 0); 800983e: 68ef ldr r7, [r5, #12] 8009840: f016 0601 ands.w r6, r6, #1 8009844: bf14 ite ne 8009846: 46a2 movne sl, r4 8009848: 46ca moveq sl, r9 if (!sem) 800984a: /-- b15f cbz r7, 8009864 <bgrt_queue_init.isra.0+0xbc> bgrt_xlist_init((bgrt_xlist_t *)sync); 800984c: | 4638 mov r0, r7 800984e: | f7fe fd09 bl 8008264 <bgrt_xlist_init> sync->dirty = (bgrt_cnt_t)0; 8009852: | e9c7 9921 strd r9, r9, [r7, #132] @ 0x84 sync->pwake = (bgrt_cnt_t)0; 8009856: | e9c7 9923 strd r9, r9, [r7, #140] @ 0x8c sync->prio = prio; 800985a: | 231f movs r3, #31 800985c: | f887 3094 strb.w r3, [r7, #148] @ 0x94 sem->counter = count; 8009860: | f8c7 a098 str.w sl, [r7, #152] @ 0x98 if ((flags & Q_CS)) 8009864: \-> f1b8 0f00 cmp.w r8, #0 8009868: /-- d00f beq.n 800988a <bgrt_queue_init.isra.0+0xe2> q->enq.counter = size; 800986a: | f3bf 8f5b dmb ish 800986e: | 60ac str r4, [r5, #8] 8009870: | f3bf 8f5b dmb ish BGRT_INT_FREE(); 8009874: /--|-> f04f 0000 mov.w r0, #0 8009878: | | f380 8811 msr BASEPRI, r0 800987c: | | f3bf 8f4f dsb sy 8009880: | | f3bf 8f6f isb sy } 8009884: | | b002 add sp, #8 8009886: | | e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} bgrt_sem_init_cs(q->enq.sem, (flags & Q_REV) ? 0 : size); 800988a: | \-> 68ad ldr r5, [r5, #8] 800988c: | 2e00 cmp r6, #0 800988e: | bf18 it ne 8009890: | 2400 movne r4, #0 if (!sem) 8009892: | 2d00 cmp r5, #0 8009894: +----- d0ee beq.n 8009874 <bgrt_queue_init.isra.0+0xcc> bgrt_xlist_init((bgrt_xlist_t *)sync); 8009896: | 4628 mov r0, r5 8009898: | f7fe fce4 bl 8008264 <bgrt_xlist_init> sync->prio = prio; 800989c: | 231f movs r3, #31 sync->dirty = (bgrt_cnt_t)0; 800989e: | e9c5 8821 strd r8, r8, [r5, #132] @ 0x84 sync->pwake = (bgrt_cnt_t)0; 80098a2: | e9c5 8823 strd r8, r8, [r5, #140] @ 0x8c sync->prio = prio; 80098a6: | f885 3094 strb.w r3, [r5, #148] @ 0x94 sem->counter = count; 80098aa: | f8c5 4098 str.w r4, [r5, #152] @ 0x98 return BGRT_ST_OK; 80098ae: \----- e7e1 b.n 8009874 <bgrt_queue_init.isra.0+0xcc> 80098b0: 200001b0 .word 0x200001b0 80098b4: 0800cdfb .word 0x0800cdfb 80098b8: 0800ce13 .word 0x0800ce13 80098bc: 0800b232 .word 0x0800b232 80098c0: 0800ce2c .word 0x0800ce2c 80098c4: 0800ce49 .word 0x0800ce49 080098c8 : inet_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, 80098c8: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} 80098cc: 4615 mov r5, r2 80098ce: 9a08 ldr r2, [sp, #32] 80098d0: 460e mov r6, r1 acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL)); 80098d2: 0c11 lsrs r1, r2, #16 80098d4: fa11 f282 uxtah r2, r1, r2 80098d8: fa12 f283 uxtah r2, r2, r3 80098dc: eb02 4313 add.w r3, r2, r3, lsr #16 acc = FOLD_U32T(acc); 80098e0: b29a uxth r2, r3 80098e2: eb02 4313 add.w r3, r2, r3, lsr #16 acc = FOLD_U32T(acc); 80098e6: b29c uxth r4, r3 inet_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, 80098e8: 4607 mov r7, r0 acc = FOLD_U32T(acc); 80098ea: eb04 4413 add.w r4, r4, r3, lsr #16 int swapped = 0; 80098ee: f04f 0800 mov.w r8, #0 for (q = p; q != NULL; q = q->next) { 80098f2: /--/----X b9b7 cbnz r7, 8009922 <inet_chksum_pseudo.isra.0+0x5a> if (swapped) { 80098f4: | | f1b8 0f00 cmp.w r8, #0 80098f8: | | /-- d004 beq.n 8009904 <inet_chksum_pseudo.isra.0+0x3c> acc = SWAP_BYTES_IN_WORD(acc); 80098fa: | | | 0223 lsls r3, r4, #8 80098fc: | | | b29b uxth r3, r3 80098fe: | | | f3c4 2407 ubfx r4, r4, #8, #8 8009902: | | | 431c orrs r4, r3 8009904: | | \-> ba6d rev16 r5, r5 acc += (u32_t)lwip_htons(proto_len); 8009906: | | b2ad uxth r5, r5 8009908: | | eb05 2106 add.w r1, r5, r6, lsl #8 800990c: | | 4421 add r1, r4 acc = FOLD_U32T(acc); 800990e: | | b28b uxth r3, r1 8009910: | | eb03 4311 add.w r3, r3, r1, lsr #16 acc = FOLD_U32T(acc); 8009914: | | b298 uxth r0, r3 8009916: | | eb00 4013 add.w r0, r0, r3, lsr #16 return (u16_t)~(acc & 0xffffUL); 800991a: | | 43c0 mvns r0, r0 } 800991c: | | b280 uxth r0, r0 800991e: | | e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} acc += LWIP_CHKSUM(q->payload, q->len); 8009922: | \----> f8b7 900a ldrh.w r9, [r7, #10] 8009926: | 6878 ldr r0, [r7, #4] 8009928: | 4649 mov r1, r9 800992a: | f7fe fc05 bl 8008138 <lwip_standard_chksum> 800992e: | 4420 add r0, r4 acc = FOLD_U32T(acc); 8009930: | b284 uxth r4, r0 if (q->len % 2 != 0) { 8009932: | f019 0f01 tst.w r9, #1 acc = FOLD_U32T(acc); 8009936: | eb04 4410 add.w r4, r4, r0, lsr #16 if (q->len % 2 != 0) { 800993a: | /-- d006 beq.n 800994a <inet_chksum_pseudo.isra.0+0x82> acc = SWAP_BYTES_IN_WORD(acc); 800993c: | | 0223 lsls r3, r4, #8 800993e: | | b29b uxth r3, r3 8009940: | | f3c4 2407 ubfx r4, r4, #8, #8 8009944: | | f088 0801 eor.w r8, r8, #1 8009948: | | 431c orrs r4, r3 for (q = p; q != NULL; q = q->next) { 800994a: | \-> 683f ldr r7, [r7, #0] 800994c: \-------- e7d1 b.n 80098f2 <inet_chksum_pseudo.isra.0+0x2a> 0800994e : * @return ERR_OK if the request has been sent * ERR_MEM if the ARP packet couldn't be allocated * any other err_t on failure */ err_t etharp_acd_announce(struct netif *netif, const ip4_addr_t *ipaddr) 800994e: b51f push {r0, r1, r2, r3, r4, lr} { return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, 8009950: 2201 movs r2, #1 8009952: e9cd 1202 strd r1, r2, [sp, #8] 8009956: 4a06 ldr r2, [pc, #24] @ (8009970 ) 8009958: f100 032e add.w r3, r0, #46 @ 0x2e 800995c: e9cd 1200 strd r1, r2, [sp] 8009960: 4a04 ldr r2, [pc, #16] @ (8009974 ) 8009962: 4619 mov r1, r3 8009964: f7fb ff24 bl 80057b0 <etharp_raw.lto_priv.0> (struct eth_addr *)netif->hwaddr, ipaddr, ðzero, ipaddr, ARP_REQUEST); } 8009968: b005 add sp, #20 800996a: f85d fb04 ldr.w pc, [sp], #4 800996e: bf00 nop 8009970: 0800d35b .word 0x0800d35b 8009974: 0800d361 .word 0x0800d361 08009978 : etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif *netif) 8009978: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 800997c: f8df c118 ldr.w ip, [pc, #280] @ 8009a98 8009980: b085 sub sp, #20 8009982: 2300 movs r3, #0 s16_t old_queue = ARP_TABLE_SIZE; 8009984: f04f 0e0a mov.w lr, #10 etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif *netif) 8009988: 4606 mov r6, r0 800998a: 9103 str r1, [sp, #12] s16_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE; 800998c: 4677 mov r7, lr 800998e: 46f0 mov r8, lr u16_t age_queue = 0, age_pending = 0, age_stable = 0; 8009990: 469a mov sl, r3 8009992: 4699 mov r9, r3 8009994: 9302 str r3, [sp, #8] s16_t empty = ARP_TABLE_SIZE; 8009996: 4674 mov r4, lr 8009998: 4665 mov r5, ip if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) { 800999a: /-------> 2c0a cmp r4, #10 u8_t state = arp_table[i].state; 800999c: | f89c b014 ldrb.w fp, [ip, #20] 80099a0: | b218 sxth r0, r3 if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) { 80099a2: | /----- d116 bne.n 80099d2 <etharp_find_entry.isra.0+0x5a> 80099a4: | | f1bb 0f00 cmp.w fp, #0 80099a8: /-----------------|--|----- d05f beq.n 8009a6a <etharp_find_entry.isra.0+0xf2> if (ipaddr && ip4_addr_eq(ipaddr, &arp_table[i].ipaddr) 80099aa: | | | /-> 6831 ldr r1, [r6, #0] 80099ac: | | | | f8dc 2004 ldr.w r2, [ip, #4] 80099b0: | | | | 4291 cmp r1, r2 80099b2: /--|-----------------|--|--|-- d04d beq.n 8009a50 <etharp_find_entry.isra.0+0xd8> if (state == ETHARP_STATE_PENDING) { 80099b4: | | | | | f1bb 0f01 cmp.w fp, #1 if (arp_table[i].ctime >= age_queue) { 80099b8: | | | | | f8bc 1012 ldrh.w r1, [ip, #18] if (state == ETHARP_STATE_PENDING) { 80099bc: | | /--------------|--|--|-- d150 bne.n 8009a60 <etharp_find_entry.isra.0+0xe8> if (arp_table[i].q != NULL) { 80099be: | | | | | | f8dc 2000 ldr.w r2, [ip] 80099c2: | | | | | | 2a00 cmp r2, #0 80099c4: | | | /-----|--|--|-- d047 beq.n 8009a56 <etharp_find_entry.isra.0+0xde> if (arp_table[i].ctime >= age_queue) { 80099c6: | | | | | | | 9a02 ldr r2, [sp, #8] 80099c8: | | | | | | | 4291 cmp r1, r2 80099ca: | | | /-----|-----|--|--|-- d305 bcc.n 80099d8 <etharp_find_entry.isra.0+0x60> age_queue = arp_table[i].ctime; 80099cc: | | | | | | | | 9102 str r1, [sp, #8] old_queue = i; 80099ce: | | | | | | | | 4686 mov lr, r0 80099d0: | | | +-----|-----|--|--|-- e002 b.n 80099d8 <etharp_find_entry.isra.0+0x60> } else if (state != ETHARP_STATE_EMPTY) { 80099d2: | | | | | | \--|-> f1bb 0f00 cmp.w fp, #0 80099d6: | | | | | | \-- d1e8 bne.n 80099aa <etharp_find_entry.isra.0+0x32> for (i = 0; i < ARP_TABLE_SIZE; ++i) { 80099d8: | | | >-----|-----|-------> 3301 adds r3, #1 80099da: | | | | | | 2b0a cmp r3, #10 80099dc: | | | | | | f10c 0c18 add.w ip, ip, #24 80099e0: | | | | | \-------- d1db bne.n 800999a <etharp_find_entry.isra.0+0x22> if (((flags & ETHARP_FLAG_FIND_ONLY) != 0) || 80099e2: | | | | | 9b03 ldr r3, [sp, #12] 80099e4: | | | | | 2b01 cmp r3, #1 80099e6: | | | | /--|-------------- d14a bne.n 8009a7e <etharp_find_entry.isra.0+0x106> if (empty < ARP_TABLE_SIZE) { 80099e8: | | | | | | 2c09 cmp r4, #9 80099ea: | | | | | | /----- dd17 ble.n 8009a1c <etharp_find_entry.isra.0+0xa4> if (old_stable < ARP_TABLE_SIZE) { 80099ec: | | | | | | | 2f09 cmp r7, #9 80099ee: | | | | | | /-----|----- dc3e bgt.n 8009a6e <etharp_find_entry.isra.0+0xf6> LWIP_ASSERT("arp_table[i].q == NULL", arp_table[i].q == NULL); 80099f0: | | | | | | | | 2318 movs r3, #24 80099f2: | | | | | | | | 437b muls r3, r7 80099f4: | | | | | | | | 58eb ldr r3, [r5, r3] 80099f6: | | | | | | | | /-- b163 cbz r3, 8009a12 <etharp_find_entry.isra.0+0x9a> 80099f8: | | | | | | | | | b672 cpsid i return bgrt_kernel.timer.val; 80099fa: | | | | | | | | | 4b22 ldr r3, [pc, #136] @ (8009a84 ) 80099fc: | | | | | | | | | 4a22 ldr r2, [pc, #136] @ (8009a88 ) 80099fe: | | | | | | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009a02: | | | | | | | | | 4b22 ldr r3, [pc, #136] @ (8009a8c ) 8009a04: | | | | | | | | | 9300 str r3, [sp, #0] 8009a06: | | | | | | | | | 4822 ldr r0, [pc, #136] @ (8009a90 ) 8009a08: | | | | | | | | | f44f 73b7 mov.w r3, #366 @ 0x16e 8009a0c: | | | | | | | | | f7f7 fc74 bl 80012f8 <printf_> 8009a10: | | | | | | | | | be00 bkpt 0x0000 i = old_queue; 8009a12: | | | | | | | | \-> 46b8 mov r8, r7 etharp_free_entry(i); 8009a14: | | | | | | | /--|----> 4640 mov r0, r8 8009a16: | | | | | | | | | f7fb fea5 bl 8005764 <etharp_free_entry.lto_priv.0> 8009a1a: | | | | | | | | | 4644 mov r4, r8 LWIP_ASSERT("arp_table[i].state == ETHARP_STATE_EMPTY", 8009a1c: | | | | | | | | \----> 2318 movs r3, #24 8009a1e: | | | | | | | | fb03 5304 mla r3, r3, r4, r5 8009a22: | | | | | | | | 7d1b ldrb r3, [r3, #20] 8009a24: | | | | | | | | /-- b163 cbz r3, 8009a40 <etharp_find_entry.isra.0+0xc8> 8009a26: | | | | | | | | | b672 cpsid i 8009a28: | | | | | | | | | 4b16 ldr r3, [pc, #88] @ (8009a84 ) 8009a2a: | | | | | | | | | 4a1a ldr r2, [pc, #104] @ (8009a94 ) 8009a2c: | | | | | | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009a30: | | | | | | | | | 4b16 ldr r3, [pc, #88] @ (8009a8c ) 8009a32: | | | | | | | | | 9300 str r3, [sp, #0] 8009a34: | | | | | | | | | 4816 ldr r0, [pc, #88] @ (8009a90 ) 8009a36: | | | | | | | | | f240 1385 movw r3, #389 @ 0x185 8009a3a: | | | | | | | | | f7f7 fc5d bl 80012f8 <printf_> 8009a3e: | | | | | | | | | be00 bkpt 0x0000 ip4_addr_copy(arp_table[i].ipaddr, *ipaddr); 8009a40: | | | | | | | | \-> 2218 movs r2, #24 8009a42: | | | | | | | | fb02 5504 mla r5, r2, r4, r5 8009a46: | | | | | | | | 6833 ldr r3, [r6, #0] 8009a48: | | | | | | | | 606b str r3, [r5, #4] arp_table[i].ctime = 0; 8009a4a: | | | | | | | | 2300 movs r3, #0 8009a4c: | | | | | | | | 826b strh r3, [r5, #18] return (s16_t)i; 8009a4e: | | | | | | | | 4620 mov r0, r4 } 8009a50: >--|--|--|--|--|--|--|-------> b005 add sp, #20 8009a52: | | | | | | | | e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} if (arp_table[i].ctime >= age_pending) { 8009a56: | | | | | \--|--|-------> 4549 cmp r1, r9 8009a58: | | | +--|-----|--|-------- d3be bcc.n 80099d8 <etharp_find_entry.isra.0+0x60> age_pending = arp_table[i].ctime; 8009a5a: | | | | | | | 4689 mov r9, r1 old_pending = i; 8009a5c: | | | | | | | 4680 mov r8, r0 8009a5e: | | | +--|-----|--|-------- e7bb b.n 80099d8 <etharp_find_entry.isra.0+0x60> if (arp_table[i].ctime >= age_stable) { 8009a60: | | \--|--|-----|--|-------> 4551 cmp r1, sl 8009a62: | | +--|-----|--|-------- d3b9 bcc.n 80099d8 <etharp_find_entry.isra.0+0x60> age_stable = arp_table[i].ctime; 8009a64: | | | | | | 468a mov sl, r1 old_stable = i; 8009a66: | | | | | | 4607 mov r7, r0 8009a68: | | +--|-----|--|-------- e7b6 b.n 80099d8 <etharp_find_entry.isra.0+0x60> empty = i; 8009a6a: | \-----|--|-----|--|-------> 4604 mov r4, r0 8009a6c: | \--|-----|--|-------- e7b4 b.n 80099d8 <etharp_find_entry.isra.0+0x60> } else if (old_pending < ARP_TABLE_SIZE) { 8009a6e: | | \--|-------> f1b8 0f09 cmp.w r8, #9 8009a72: | | +-------- ddcf ble.n 8009a14 <etharp_find_entry.isra.0+0x9c> } else if (old_queue < ARP_TABLE_SIZE) { 8009a74: | | | f1be 0f09 cmp.w lr, #9 8009a78: | +--------|-------- dc01 bgt.n 8009a7e <etharp_find_entry.isra.0+0x106> i = old_queue; 8009a7a: | | | 46f0 mov r8, lr 8009a7c: | | \-------- e7ca b.n 8009a14 <etharp_find_entry.isra.0+0x9c> return (s16_t)ERR_MEM; 8009a7e: | \----------------> f04f 30ff mov.w r0, #4294967295 @ 0xffffffff 8009a82: \----------------------------- e7e5 b.n 8009a50 <etharp_find_entry.isra.0+0xd8> 8009a84: 200001b0 .word 0x200001b0 8009a88: 0800ce6a .word 0x0800ce6a 8009a8c: 0800c3a3 .word 0x0800c3a3 8009a90: 0800b232 .word 0x0800b232 8009a94: 0800ce81 .word 0x0800ce81 8009a98: 200012b0 .word 0x200012b0 08009a9c : dhcp_start(struct netif *netif) 8009a9c: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr} LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;); 8009aa0: 4605 mov r5, r0 8009aa2: /-- b940 cbnz r0, 8009ab6 <dhcp_start.isra.0+0x1a> 8009aa4: | 4b5a ldr r3, [pc, #360] @ (8009c10 ) 8009aa6: | 485b ldr r0, [pc, #364] @ (8009c14 ) 8009aa8: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac } 8009aac: /--|-> b003 add sp, #12 8009aae: | | e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr} LWIP_ERROR("netif is not up, old style port?", netif_is_up(netif), return ERR_ARG;); 8009ab2: | | f7f7 bc21 b.w 80012f8 <printf_> 8009ab6: | \-> f890 3035 ldrb.w r3, [r0, #53] @ 0x35 8009aba: | 07da lsls r2, r3, #31 8009abc: | /-- d404 bmi.n 8009ac8 <dhcp_start.isra.0+0x2c> 8009abe: | | 4b54 ldr r3, [pc, #336] @ (8009c10 ) 8009ac0: | | 4855 ldr r0, [pc, #340] @ (8009c18 ) 8009ac2: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009ac6: \--|-- e7f1 b.n 8009aac <dhcp_start.isra.0+0x10> if (netif->mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) { 8009ac8: \-> 8d83 ldrh r3, [r0, #44] @ 0x2c dhcp = netif_dhcp_data(netif); 8009aca: 6a44 ldr r4, [r0, #36] @ 0x24 if (netif->mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) { 8009acc: f5b3 7f10 cmp.w r3, #576 @ 0x240 8009ad0: /-------------------------- d331 bcc.n 8009b36 <dhcp_start.isra.0+0x9a> if (dhcp == NULL) { 8009ad2: | 2c00 cmp r4, #0 8009ad4: | /----------------- d132 bne.n 8009b3c <dhcp_start.isra.0+0xa0> dhcp = (struct dhcp *)mem_malloc(sizeof(struct dhcp)); 8009ad6: | | 2048 movs r0, #72 @ 0x48 8009ad8: | | f7fe fb88 bl 80081ec <mem_malloc> if (dhcp == NULL) { 8009adc: | | 4604 mov r4, r0 8009ade: +--------|----------------- b350 cbz r0, 8009b36 <dhcp_start.isra.0+0x9a> netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, dhcp); 8009ae0: | | 6268 str r0, [r5, #36] @ 0x24 memset(dhcp, 0, sizeof(struct dhcp)); 8009ae2: | | /-------------> 2248 movs r2, #72 @ 0x48 8009ae4: | | | 2100 movs r1, #0 8009ae6: | | | 4620 mov r0, r4 8009ae8: | | | f001 f9f4 bl 800aed4 <memset> for (acd2 = netif->acd_list; acd2 != NULL; acd2 = acd2->next) { 8009aec: | | | 6be9 ldr r1, [r5, #60] @ 0x3c acd->acd_conflict_callback = acd_conflict_callback; 8009aee: | | | 4b4b ldr r3, [pc, #300] @ (8009c1c ) 8009af0: | | | 6463 str r3, [r4, #68] @ 0x44 acd_add(netif, &dhcp->acd, dhcp_conflict_callback); 8009af2: | | | f104 0234 add.w r2, r4, #52 @ 0x34 for (acd2 = netif->acd_list; acd2 != NULL; acd2 = acd2->next) { 8009af6: | | | 460b mov r3, r1 8009af8: | | | /--/-------X bb33 cbnz r3, 8009b48 <dhcp_start.isra.0+0xac> acd->next = netif->acd_list; 8009afa: | | | | | 6361 str r1, [r4, #52] @ 0x34 netif->acd_list = acd; 8009afc: | | | | | 63ea str r2, [r5, #60] @ 0x3c if (dhcp_pcb_refcount == 0) { 8009afe: | | | | | /----> f8df 8144 ldr.w r8, [pc, #324] @ 8009c44 8009b02: | | | | | | f898 3000 ldrb.w r3, [r8] 8009b06: | | | | | | 2b00 cmp r3, #0 8009b08: | /-----|--|--|--|--|----- d143 bne.n 8009b92 <dhcp_start.isra.0+0xf6> LWIP_ASSERT("dhcp_inc_pcb_refcount(): memory leak", dhcp_pcb == NULL); 8009b0a: | | | | | | | 4f45 ldr r7, [pc, #276] @ (8009c20 ) 8009b0c: | | | | | | | 683b ldr r3, [r7, #0] 8009b0e: | | | | | | | /-- b163 cbz r3, 8009b2a <dhcp_start.isra.0+0x8e> 8009b10: | | | | | | | | b672 cpsid i 8009b12: | | | | | | | | 4b3f ldr r3, [pc, #252] @ (8009c10 ) 8009b14: | | | | | | | | 4a43 ldr r2, [pc, #268] @ (8009c24 ) 8009b16: | | | | | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009b1a: | | | | | | | | 4b43 ldr r3, [pc, #268] @ (8009c28 ) 8009b1c: | | | | | | | | 9300 str r3, [sp, #0] 8009b1e: | | | | | | | | 4843 ldr r0, [pc, #268] @ (8009c2c ) 8009b20: | | | | | | | | f44f 738a mov.w r3, #276 @ 0x114 8009b24: | | | | | | | | f7f7 fbe8 bl 80012f8 <printf_> 8009b28: | | | | | | | | be00 bkpt 0x0000 pcb = (struct udp_pcb *)memp_malloc(MEMP_UDP_PCB); 8009b2a: | | | | | | | \-> 2000 movs r0, #0 8009b2c: | | | | | | | f7f8 fade bl 80020ec <memp_malloc> if (pcb != NULL) { 8009b30: | | | | | | | 4606 mov r6, r0 8009b32: | | | | | | | /-- b968 cbnz r0, 8009b50 <dhcp_start.isra.0+0xb4> dhcp_pcb = udp_new(); 8009b34: | | | | | | | | 6038 str r0, [r7, #0] } 8009b36: >--|-----|--|--|--|--|--|-> b003 add sp, #12 8009b38: | | | | | | | | e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} if (dhcp->pcb_allocated != 0) { 8009b3c: | | \--|--|--|--|--|-> 7923 ldrb r3, [r4, #4] 8009b3e: | | | | | | | 2b00 cmp r3, #0 8009b40: | | +--|--|--|--|-- d0cf beq.n 8009ae2 <dhcp_start.isra.0+0x46> dhcp_dec_pcb_refcount(); /* free DHCP PCB if not needed any more */ 8009b42: | | | | | | | f7fa ff13 bl 800496c <dhcp_dec_pcb_refcount.lto_priv.0> 8009b46: | | \--|--|--|--|-- e7cc b.n 8009ae2 <dhcp_start.isra.0+0x46> if (acd2 == acd) { 8009b48: | | | \--|--|-> 429a cmp r2, r3 8009b4a: | | | \--|-- d0d8 beq.n 8009afe <dhcp_start.isra.0+0x62> for (acd2 = netif->acd_list; acd2 != NULL; acd2 = acd2->next) { 8009b4c: | | | | 681b ldr r3, [r3, #0] 8009b4e: | | \--------|-- e7d3 b.n 8009af8 <dhcp_start.isra.0+0x5c> memset(pcb, 0, sizeof(struct udp_pcb)); 8009b50: | | \-> f04f 0920 mov.w r9, #32 8009b54: | | 464a mov r2, r9 8009b56: | | 2100 movs r1, #0 8009b58: | | f001 f9bc bl 800aed4 <memset> pcb->ttl = UDP_TTL; 8009b5c: | | 23ff movs r3, #255 @ 0xff 8009b5e: | | 72f3 strb r3, [r6, #11] ip_set_option(dhcp_pcb, SOF_BROADCAST); 8009b60: | | f886 9009 strb.w r9, [r6, #9] udp_bind(dhcp_pcb, IP4_ADDR_ANY, LWIP_IANA_PORT_DHCP_CLIENT); 8009b64: | | 4630 mov r0, r6 8009b66: | | 4932 ldr r1, [pc, #200] @ (8009c30 ) dhcp_pcb = udp_new(); 8009b68: | | 603e str r6, [r7, #0] udp_bind(dhcp_pcb, IP4_ADDR_ANY, LWIP_IANA_PORT_DHCP_CLIENT); 8009b6a: | | 2244 movs r2, #68 @ 0x44 8009b6c: | | f7fa fe82 bl 8004874 <udp_bind> udp_connect(dhcp_pcb, IP4_ADDR_ANY, LWIP_IANA_PORT_DHCP_SERVER); 8009b70: | | 683e ldr r6, [r7, #0] LWIP_ERROR("udp_connect: invalid pcb", pcb != NULL, return ERR_ARG); 8009b72: | | /-- bb06 cbnz r6, 8009bb6 <dhcp_start.isra.0+0x11a> 8009b74: | | | 4b26 ldr r3, [pc, #152] @ (8009c10 ) 8009b76: | | | 482f ldr r0, [pc, #188] @ (8009c34 ) 8009b78: | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009b7c: | | | f7f7 fbbc bl 80012f8 <printf_> udp_recv(dhcp_pcb, dhcp_recv, NULL); 8009b80: | | /--------------|-> 683b ldr r3, [r7, #0] LWIP_ERROR("udp_recv: invalid pcb", pcb != NULL, return); 8009b82: | | | | 2b00 cmp r3, #0 8009b84: | | /--|--------------|-- d133 bne.n 8009bee <dhcp_start.isra.0+0x152> 8009b86: | | | | | 4b22 ldr r3, [pc, #136] @ (8009c10 ) 8009b88: | | | | | 482b ldr r0, [pc, #172] @ (8009c38 ) 8009b8a: | | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009b8e: | | | | | f7f7 fbb3 bl 80012f8 <printf_> dhcp_pcb_refcount++; 8009b92: | >--|--|--------------|-> f898 3000 ldrb.w r3, [r8] 8009b96: | | | | | 3301 adds r3, #1 8009b98: | | | | | f888 3000 strb.w r3, [r8] dhcp->pcb_allocated = 1; 8009b9c: | | | | | 2301 movs r3, #1 8009b9e: | | | | | 7123 strb r3, [r4, #4] if (!netif_is_link_up(netif)) { 8009ba0: | | | | | f895 3035 ldrb.w r3, [r5, #53] @ 0x35 8009ba4: | | | | | 075b lsls r3, r3, #29 8009ba6: | | | | /-----------|-- d427 bmi.n 8009bf8 <dhcp_start.isra.0+0x15c> dhcp_set_state(dhcp, DHCP_STATE_INIT); 8009ba8: | | | | | | 2102 movs r1, #2 8009baa: | | | | | | 4620 mov r0, r4 } 8009bac: | | | | | | b003 add sp, #12 8009bae: | | | | | | e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr} dhcp_set_state(dhcp, DHCP_STATE_INIT); 8009bb2: | | | | | | f7fa bf25 b.w 8004a00 <dhcp_set_state.lto_priv.0> if (pcb->local_port == 0) { 8009bb6: | | | | | \-> 8a72 ldrh r2, [r6, #18] 8009bb8: | | | | | /-------- b172 cbz r2, 8009bd8 <dhcp_start.isra.0+0x13c> ip_addr_set_ipaddr(&pcb->remote_ip, ipaddr); 8009bba: | | | | | /--|-------> 2300 movs r3, #0 for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { 8009bbc: | | | | | | | 4a1f ldr r2, [pc, #124] @ (8009c3c ) ip_addr_set_ipaddr(&pcb->remote_ip, ipaddr); 8009bbe: | | | | | | | 6073 str r3, [r6, #4] pcb->remote_port = port; 8009bc0: | | | | | | | 2343 movs r3, #67 @ 0x43 8009bc2: | | | | | | | 82b3 strh r3, [r6, #20] pcb->flags |= UDP_FLAGS_CONNECTED; 8009bc4: | | | | | | | 7c33 ldrb r3, [r6, #16] for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { 8009bc6: | | | | | | | 6811 ldr r1, [r2, #0] pcb->flags |= UDP_FLAGS_CONNECTED; 8009bc8: | | | | | | | f043 0304 orr.w r3, r3, #4 8009bcc: | | | | | | | 7433 strb r3, [r6, #16] for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { 8009bce: | | | | | | | 460b mov r3, r1 8009bd0: | | | | | | | /--/-X b94b cbnz r3, 8009be6 <dhcp_start.isra.0+0x14a> pcb->next = udp_pcbs; 8009bd2: | | | | | | | | | 60f1 str r1, [r6, #12] udp_pcbs = pcb; 8009bd4: | | | | | | | | | 6016 str r6, [r2, #0] return ERR_OK; 8009bd6: | | | +--|--|--|--|--|-- e7d3 b.n 8009b80 <dhcp_start.isra.0+0xe4> err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port); 8009bd8: | | | | | | \--|--|-> 4631 mov r1, r6 8009bda: | | | | | | | | 4630 mov r0, r6 8009bdc: | | | | | | | | f7fa fe4a bl 8004874 <udp_bind> if (err != ERR_OK) { 8009be0: | | | | | | | | 2800 cmp r0, #0 8009be2: | | | | | \-----|--|-- d0ea beq.n 8009bba <dhcp_start.isra.0+0x11e> 8009be4: | | | +--|--------|--|-- e7cc b.n 8009b80 <dhcp_start.isra.0+0xe4> if (pcb == ipcb) { 8009be6: | | | | | | \-> 429e cmp r6, r3 8009be8: | | | \--|--------|----- d0ca beq.n 8009b80 <dhcp_start.isra.0+0xe4> for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { 8009bea: | | | | | 68db ldr r3, [r3, #12] 8009bec: | | | | \----- e7f0 b.n 8009bd0 <dhcp_start.isra.0+0x134> pcb->recv = recv; 8009bee: | | \-----|-------------> 4a14 ldr r2, [pc, #80] @ (8009c40 ) 8009bf0: | | | 619a str r2, [r3, #24] pcb->recv_arg = recv_arg; 8009bf2: | | | 2200 movs r2, #0 8009bf4: | | | 61da str r2, [r3, #28] 8009bf6: | \--------|-------------- e7cc b.n 8009b92 <dhcp_start.isra.0+0xf6> result = dhcp_discover(netif); 8009bf8: | \-------------> 4628 mov r0, r5 8009bfa: | f7fb f949 bl 8004e90 <dhcp_discover.lto_priv.0> if (result != ERR_OK) { 8009bfe: | 2800 cmp r0, #0 8009c00: \-------------------------- d099 beq.n 8009b36 <dhcp_start.isra.0+0x9a> dhcp_release_and_stop(netif); 8009c02: 4628 mov r0, r5 } 8009c04: b003 add sp, #12 8009c06: e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr} dhcp_release_and_stop(netif); 8009c0a: f7fb bbbf b.w 800538c <dhcp_release_and_stop> 8009c0e: bf00 nop 8009c10: 200001b0 .word 0x200001b0 8009c14: 0800ceaa .word 0x0800ceaa 8009c18: 0800cec0 .word 0x0800cec0 8009c1c: 08004da9 .word 0x08004da9 8009c20: 2000126c .word 0x2000126c 8009c24: 0800cee9 .word 0x0800cee9 8009c28: 0800c0f4 .word 0x0800c0f4 8009c2c: 0800b232 .word 0x0800b232 8009c30: 0800d32c .word 0x0800d32c 8009c34: 0800cf0e .word 0x0800cf0e 8009c38: 0800cf2f .word 0x0800cf2f 8009c3c: 20001260 .word 0x20001260 8009c40: 08005009 .word 0x08005009 8009c44: 2000126a .word 0x2000126a 08009c48 : dhcp_handle_ack(struct netif *netif, struct dhcp_msg *msg_in) 8009c48: b510 push {r4, lr} if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) { 8009c4a: 4c1a ldr r4, [pc, #104] @ (8009cb4 ) ip4_addr_set_zero(&dhcp->offered_sn_mask); 8009c4c: 2200 movs r2, #0 ip4_addr_set_zero(&dhcp->offered_gw_addr); 8009c4e: e9c0 2208 strd r2, r2, [r0, #32] if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) { 8009c52: 78e2 ldrb r2, [r4, #3] dhcp_handle_ack(struct netif *netif, struct dhcp_msg *msg_in) 8009c54: 4603 mov r3, r0 if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) { 8009c56: /-- b112 cbz r2, 8009c5e <dhcp_handle_ack.isra.0+0x16> dhcp->offered_t0_lease = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_LEASE_TIME); 8009c58: | 4a17 ldr r2, [pc, #92] @ (8009cb8 ) 8009c5a: | 68d2 ldr r2, [r2, #12] 8009c5c: | 6282 str r2, [r0, #40] @ 0x28 if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T1)) { 8009c5e: \-> 7922 ldrb r2, [r4, #4] 8009c60: /-------------------- b1e2 cbz r2, 8009c9c <dhcp_handle_ack.isra.0+0x54> dhcp->offered_t1_renew = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T1); 8009c62: | 4a15 ldr r2, [pc, #84] @ (8009cb8 ) 8009c64: | 6912 ldr r2, [r2, #16] 8009c66: | /-------------> 62da str r2, [r3, #44] @ 0x2c if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T2)) { 8009c68: | | 7962 ldrb r2, [r4, #5] 8009c6a: | | /----------- b1d2 cbz r2, 8009ca2 <dhcp_handle_ack.isra.0+0x5a> dhcp->offered_t2_rebind = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T2); 8009c6c: | | | 4a12 ldr r2, [pc, #72] @ (8009cb8 ) 8009c6e: | | | 6952 ldr r2, [r2, #20] 8009c70: | /--|--|----------> 631a str r2, [r3, #48] @ 0x30 ip4_addr_copy(dhcp->offered_ip_addr, msg_in->yiaddr); 8009c72: | | | | 690a ldr r2, [r1, #16] if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) { 8009c74: | | | | 79a1 ldrb r1, [r4, #6] ip4_addr_copy(dhcp->offered_ip_addr, msg_in->yiaddr); 8009c76: | | | | 61da str r2, [r3, #28] dhcp->flags |= DHCP_FLAG_SUBNET_MASK_GIVEN; 8009c78: | | | | 79da ldrb r2, [r3, #7] if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) { 8009c7a: | | | | /-------- b1b9 cbz r1, 8009cac <dhcp_handle_ack.isra.0+0x64> ip4_addr_set_u32(&dhcp->offered_sn_mask, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK))); 8009c7c: | | | | | 490e ldr r1, [pc, #56] @ (8009cb8 ) 8009c7e: | | | | | 6988 ldr r0, [r1, #24] 8009c80: | | | | | f7fe fa58 bl 8008134 <lwip_htonl> dhcp->flags |= DHCP_FLAG_SUBNET_MASK_GIVEN; 8009c84: | | | | | f042 0201 orr.w r2, r2, #1 ip4_addr_set_u32(&dhcp->offered_sn_mask, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK))); 8009c88: | | | | | 6218 str r0, [r3, #32] dhcp->flags |= DHCP_FLAG_SUBNET_MASK_GIVEN; 8009c8a: | | | | | /----> 71da strb r2, [r3, #7] if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_ROUTER)) { 8009c8c: | | | | | | 79e2 ldrb r2, [r4, #7] 8009c8e: | | | | | | /-- b122 cbz r2, 8009c9a <dhcp_handle_ack.isra.0+0x52> ip4_addr_set_u32(&dhcp->offered_gw_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_ROUTER))); 8009c90: | | | | | | | 4a09 ldr r2, [pc, #36] @ (8009cb8 ) 8009c92: | | | | | | | 69d0 ldr r0, [r2, #28] 8009c94: | | | | | | | f7fe fa4e bl 8008134 <lwip_htonl> 8009c98: | | | | | | | 6258 str r0, [r3, #36] @ 0x24 } 8009c9a: | | | | | | \-> bd10 pop {r4, pc} dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2; 8009c9c: \--|--|--|--|--|----> 6a9a ldr r2, [r3, #40] @ 0x28 8009c9e: | | | | | 0852 lsrs r2, r2, #1 8009ca0: | \--|--|--|----- e7e1 b.n 8009c66 <dhcp_handle_ack.isra.0+0x1e> dhcp->offered_t2_rebind = (dhcp->offered_t0_lease * 7U) / 8U; 8009ca2: | \--|--|----> 6a9a ldr r2, [r3, #40] @ 0x28 8009ca4: | | | ebc2 02c2 rsb r2, r2, r2, lsl #3 8009ca8: | | | 08d2 lsrs r2, r2, #3 8009caa: \--------|--|----- e7e1 b.n 8009c70 <dhcp_handle_ack.isra.0+0x28> dhcp->flags &= ~DHCP_FLAG_SUBNET_MASK_GIVEN; 8009cac: \--|----> f002 02fe and.w r2, r2, #254 @ 0xfe 8009cb0: \----- e7eb b.n 8009c8a <dhcp_handle_ack.isra.0+0x42> 8009cb2: bf00 nop 8009cb4: 20001288 .word 0x20001288 8009cb8: 20001290 .word 0x20001290 08009cbc : tcp_route(const struct tcp_pcb *pcb, const ip_addr_t *src, const ip_addr_t *dst) 8009cbc: 4603 mov r3, r0 8009cbe: 4608 mov r0, r1 if ((pcb != NULL) && (pcb->netif_idx != NETIF_NO_INDEX)) { 8009cc0: /----- b163 cbz r3, 8009cdc <tcp_route.isra.0+0x20> 8009cc2: | 7a1a ldrb r2, [r3, #8] 8009cc4: +----- b152 cbz r2, 8009cdc <tcp_route.isra.0+0x20> struct netif *netif; LWIP_ASSERT_CORE_LOCKED(); if (idx != NETIF_NO_INDEX) { NETIF_FOREACH(netif) { 8009cc6: | 4b07 ldr r3, [pc, #28] @ (8009ce4 ) 8009cc8: | 6818 ldr r0, [r3, #0] 8009cca: | /-- b148 cbz r0, 8009ce0 <tcp_route.isra.0+0x24> if (idx == netif_get_index(netif)) { 8009ccc: | | f890 3038 ldrb.w r3, [r0, #56] @ 0x38 8009cd0: | | 3301 adds r3, #1 8009cd2: | | b2db uxtb r3, r3 return netif; /* found! */ } } } return NULL; 8009cd4: | | 429a cmp r2, r3 8009cd6: | | bf18 it ne 8009cd8: | | 2000 movne r0, #0 8009cda: | | 4770 bx lr return ip_route(src, dst); 8009cdc: \--|-> f7fc b864 b.w 8005da8 <ip4_route> } 8009ce0: \-> 4770 bx lr 8009ce2: bf00 nop 8009ce4: 20001264 .word 0x20001264 08009ce8 : tcp_free_acked_segments(struct tcp_pcb *pcb, struct tcp_seg *seg_list, const char *dbg_list_name, 8009ce8: e92d 47f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, r9, sl, lr} TCP_SEQ_LEQ(lwip_ntohl(seg_list->tcphdr->seqno) + 8009cec: f8df 90c4 ldr.w r9, [pc, #196] @ 8009db4 recv_acked = (tcpwnd_size_t)(recv_acked + next->len); 8009cf0: f8df 80c4 ldr.w r8, [pc, #196] @ 8009db8 tcp_free_acked_segments(struct tcp_pcb *pcb, struct tcp_seg *seg_list, const char *dbg_list_name, 8009cf4: 4606 mov r6, r0 8009cf6: 460c mov r4, r1 8009cf8: 4617 mov r7, r2 while (seg_list != NULL && 8009cfa: /-------> 2c00 cmp r4, #0 8009cfc: /-----|-------- d04b beq.n 8009d96 <tcp_free_acked_segments.isra.0+0xae> TCP_SEQ_LEQ(lwip_ntohl(seg_list->tcphdr->seqno) + 8009cfe: | /--|-------> 6921 ldr r1, [r4, #16] 8009d00: | | | f8d9 3000 ldr.w r3, [r9] 8009d04: | | | 6848 ldr r0, [r1, #4] 8009d06: | | | f7fe fa15 bl 8008134 <lwip_htonl> 8009d0a: | | | 8922 ldrh r2, [r4, #8] 8009d0c: | | | 1a9a subs r2, r3, r2 8009d0e: | | | 898b ldrh r3, [r1, #12] 8009d10: | | | ba5b rev16 r3, r3 8009d12: | | | f013 0303 ands.w r3, r3, #3 8009d16: | | | bf18 it ne 8009d18: | | | 2301 movne r3, #1 8009d1a: | | | 1ad3 subs r3, r2, r3 8009d1c: | | | 1a1b subs r3, r3, r0 while (seg_list != NULL && 8009d1e: | | | 2b00 cmp r3, #0 8009d20: | | | 4625 mov r5, r4 8009d22: | | | /----- db39 blt.n 8009d98 <tcp_free_acked_segments.isra.0+0xb0> clen = pbuf_clen(next->p); 8009d24: | | | | 6868 ldr r0, [r5, #4] seg_list = seg_list->next; 8009d26: | | | | 6824 ldr r4, [r4, #0] clen = pbuf_clen(next->p); 8009d28: | | | | f7f8 fc7c bl 8002624 <pbuf_clen> LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= clen)); 8009d2c: | | | | f8b6 3066 ldrh.w r3, [r6, #102] @ 0x66 8009d30: | | | | 4283 cmp r3, r0 clen = pbuf_clen(next->p); 8009d32: | | | | 4682 mov sl, r0 LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= clen)); 8009d34: | | | | /-- d20c bcs.n 8009d50 <tcp_free_acked_segments.isra.0+0x68> 8009d36: | | | | | b672 cpsid i 8009d38: | | | | | 4b19 ldr r3, [pc, #100] @ (8009da0 ) 8009d3a: | | | | | 4a1a ldr r2, [pc, #104] @ (8009da4 ) 8009d3c: | | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009d40: | | | | | 4b19 ldr r3, [pc, #100] @ (8009da8 ) 8009d42: | | | | | 9300 str r3, [sp, #0] 8009d44: | | | | | 4819 ldr r0, [pc, #100] @ (8009dac ) 8009d46: | | | | | f240 4364 movw r3, #1124 @ 0x464 8009d4a: | | | | | f7f7 fad5 bl 80012f8 <printf_> 8009d4e: | | | | | be00 bkpt 0x0000 pcb->snd_queuelen = (u16_t)(pcb->snd_queuelen - clen); 8009d50: | | | | \-> f8b6 3066 ldrh.w r3, [r6, #102] @ 0x66 recv_acked = (tcpwnd_size_t)(recv_acked + next->len); 8009d54: | | | | f8b8 2000 ldrh.w r2, [r8] pcb->snd_queuelen = (u16_t)(pcb->snd_queuelen - clen); 8009d58: | | | | eba3 030a sub.w r3, r3, sl 8009d5c: | | | | f8a6 3066 strh.w r3, [r6, #102] @ 0x66 recv_acked = (tcpwnd_size_t)(recv_acked + next->len); 8009d60: | | | | 892b ldrh r3, [r5, #8] tcp_seg_free(next); 8009d62: | | | | 4628 mov r0, r5 recv_acked = (tcpwnd_size_t)(recv_acked + next->len); 8009d64: | | | | 4413 add r3, r2 8009d66: | | | | f8a8 3000 strh.w r3, [r8] tcp_seg_free(next); 8009d6a: | | | | f7f8 fd47 bl 80027fc <tcp_seg_free> if (pcb->snd_queuelen != 0) { 8009d6e: | | | | f8b6 3066 ldrh.w r3, [r6, #102] @ 0x66 8009d72: | | | | 2b00 cmp r3, #0 8009d74: | | \--|----- d0c1 beq.n 8009cfa <tcp_free_acked_segments.isra.0+0x12> LWIP_ASSERT("tcp_receive: valid queue length", 8009d76: | | | 2c00 cmp r4, #0 8009d78: | \-----|----- d1c1 bne.n 8009cfe <tcp_free_acked_segments.isra.0+0x16> 8009d7a: +--------|----- b967 cbnz r7, 8009d96 <tcp_free_acked_segments.isra.0+0xae> 8009d7c: | | b672 cpsid i 8009d7e: | | 4b08 ldr r3, [pc, #32] @ (8009da0 ) 8009d80: | | 4a0b ldr r2, [pc, #44] @ (8009db0 ) 8009d82: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009d86: | | 4b08 ldr r3, [pc, #32] @ (8009da8 ) 8009d88: | | 9300 str r3, [sp, #0] 8009d8a: | | 4808 ldr r0, [pc, #32] @ (8009dac ) 8009d8c: | | f240 436e movw r3, #1134 @ 0x46e 8009d90: | | f7f7 fab2 bl 80012f8 <printf_> 8009d94: | | be00 bkpt 0x0000 8009d96: \--------|----> 2500 movs r5, #0 } 8009d98: \----> 4628 mov r0, r5 8009d9a: b002 add sp, #8 8009d9c: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} 8009da0: 200001b0 .word 0x200001b0 8009da4: 0800cf4d .word 0x0800cf4d 8009da8: 0800b591 .word 0x0800b591 8009dac: 0800b232 .word 0x0800b232 8009db0: 0800cf75 .word 0x0800cf75 8009db4: 20001228 .word 0x20001228 8009db8: 2000122e .word 0x2000122e 08009dbc : pbuf_free(struct pbuf *p) 8009dbc: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr} if (p == NULL) { 8009dc0: 4604 mov r4, r0 8009dc2: 2800 cmp r0, #0 8009dc4: /-------------- d035 beq.n 8009e32 <pbuf_free.isra.0+0x76> 8009dc6: | 4d51 ldr r5, [pc, #324] @ (8009f0c ) LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0); 8009dc8: | 4e51 ldr r6, [pc, #324] @ (8009f10 ) 8009dca: | 4f52 ldr r7, [pc, #328] @ (8009f14 ) SYS_ARCH_PROTECT(old_level); 8009dcc: | /----------> f7fe f9e4 bl 8008198 <bgrt_crit_sec_enter> LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0); 8009dd0: | | 7ba3 ldrb r3, [r4, #14] 8009dd2: | | /-- b953 cbnz r3, 8009dea <pbuf_free.isra.0+0x2e> 8009dd4: | | | b672 cpsid i 8009dd6: | | | f240 23f3 movw r3, #755 @ 0x2f3 8009dda: | | | f8d5 11ac ldr.w r1, [r5, #428] @ 0x1ac 8009dde: | | | 484e ldr r0, [pc, #312] @ (8009f18 ) 8009de0: | | | 9600 str r6, [sp, #0] 8009de2: | | | 463a mov r2, r7 8009de4: | | | f7f7 fa88 bl 80012f8 <printf_> 8009de8: | | | be00 bkpt 0x0000 ref = --(p->ref); 8009dea: | | \-> 7ba1 ldrb r1, [r4, #14] 8009dec: | | 3901 subs r1, #1 8009dee: | | b2c9 uxtb r1, r1 8009df0: | | 73a1 strb r1, [r4, #14] SYS_ARCH_UNPROTECT(old_level); 8009df2: | | f7fe f9e5 bl 80081c0 <bgrt_crit_sec_exit> if (ref == 0) { 8009df6: | | /-------- bb49 cbnz r1, 8009e4c <pbuf_free.isra.0+0x90> if ((p->flags & PBUF_FLAG_IS_CUSTOM) != 0) { 8009df8: | | | 7b62 ldrb r2, [r4, #13] q = p->next; 8009dfa: | | | f8d4 9000 ldr.w r9, [r4] alloc_src = pbuf_get_allocsrc(p); 8009dfe: | | | 7b23 ldrb r3, [r4, #12] if ((p->flags & PBUF_FLAG_IS_CUSTOM) != 0) { 8009e00: | | | 0792 lsls r2, r2, #30 8009e02: | | | /----- d526 bpl.n 8009e52 <pbuf_free.isra.0+0x96> LWIP_ASSERT("pc->custom_free_function != NULL", pc->custom_free_function != NULL); 8009e04: | | | | 6923 ldr r3, [r4, #16] 8009e06: | | | | /-- b963 cbnz r3, 8009e22 <pbuf_free.isra.0+0x66> 8009e08: | | | | | b672 cpsid i 8009e0a: | | | | | 4b40 ldr r3, [pc, #256] @ (8009f0c ) 8009e0c: | | | | | 4a43 ldr r2, [pc, #268] @ (8009f1c ) 8009e0e: | | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009e12: | | | | | 4b3f ldr r3, [pc, #252] @ (8009f10 ) 8009e14: | | | | | 9300 str r3, [sp, #0] 8009e16: | | | | | 4840 ldr r0, [pc, #256] @ (8009f18 ) 8009e18: | | | | | f240 3301 movw r3, #769 @ 0x301 8009e1c: | | | | | f7f7 fa6c bl 80012f8 <printf_> 8009e20: | | | | | be00 bkpt 0x0000 pc->custom_free_function(p); 8009e22: | | | | \-> 6923 ldr r3, [r4, #16] 8009e24: | | | | 4620 mov r0, r4 8009e26: | | | | 4798 blx r3 while (p != NULL) { 8009e28: /--|--|--|--|----> f1b9 0f00 cmp.w r9, #0 8009e2c: | | | +--|----- d00e beq.n 8009e4c <pbuf_free.isra.0+0x90> 8009e2e: | | | | | 464c mov r4, r9 8009e30: | | \--|--|----- e7cc b.n 8009dcc <pbuf_free.isra.0+0x10> LWIP_ASSERT("p != NULL", p != NULL); 8009e32: | \-----|--|----> b672 cpsid i 8009e34: | | | 4b35 ldr r3, [pc, #212] @ (8009f0c ) 8009e36: | | | 4a3a ldr r2, [pc, #232] @ (8009f20 ) 8009e38: | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009e3c: | | | 4b34 ldr r3, [pc, #208] @ (8009f10 ) 8009e3e: | | | 9300 str r3, [sp, #0] 8009e40: | | | 4835 ldr r0, [pc, #212] @ (8009f18 ) 8009e42: | | | f240 23de movw r3, #734 @ 0x2de 8009e46: | | | f7f7 fa57 bl 80012f8 <printf_> 8009e4a: | | | be00 bkpt 0x0000 } 8009e4c: | \--|----> b003 add sp, #12 8009e4e: | | e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} alloc_src = pbuf_get_allocsrc(p); 8009e52: | \----> f003 030f and.w r3, r3, #15 if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF_POOL) { 8009e56: | 2b02 cmp r3, #2 8009e58: | /-- d104 bne.n 8009e64 <pbuf_free.isra.0+0xa8> memp_free(MEMP_PBUF_POOL, p); 8009e5a: | | 4621 mov r1, r4 8009e5c: | | 200b movs r0, #11 memp_free(MEMP_PBUF, p); 8009e5e: | /-----|-> f7f8 faf3 bl 8002448 <memp_free> 8009e62: +--------|-----|-- e7e1 b.n 8009e28 <pbuf_free.isra.0+0x6c> } else if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF) { 8009e64: | | \-> 2b01 cmp r3, #1 8009e66: | | /-- d102 bne.n 8009e6e <pbuf_free.isra.0+0xb2> memp_free(MEMP_PBUF, p); 8009e68: | | | 4621 mov r1, r4 8009e6a: | | | 200a movs r0, #10 8009e6c: | +-----|-- e7f7 b.n 8009e5e <pbuf_free.isra.0+0xa2> } else if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP) { 8009e6e: | | \-> 2b00 cmp r3, #0 8009e70: | | /----- d13f bne.n 8009ef2 <pbuf_free.isra.0+0x136> mem_free(void *rmem) { struct memp_malloc_helper *hmem; LWIP_ASSERT("rmem != NULL", (rmem != NULL)); LWIP_ASSERT("rmem == MEM_ALIGN(rmem)", (rmem == LWIP_MEM_ALIGN(rmem))); 8009e72: | | | 1ce3 adds r3, r4, #3 8009e74: | | | f023 0303 bic.w r3, r3, #3 8009e78: | | | 429c cmp r4, r3 /* get the original struct memp_malloc_helper */ /* cast through void* to get rid of alignment warnings */ hmem = (struct memp_malloc_helper *)(void *)((u8_t *)rmem - LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper))); 8009e7a: | | | f1a4 0804 sub.w r8, r4, #4 LWIP_ASSERT("rmem == MEM_ALIGN(rmem)", (rmem == LWIP_MEM_ALIGN(rmem))); 8009e7e: | | | /-- d00c beq.n 8009e9a <pbuf_free.isra.0+0xde> 8009e80: | | | | b672 cpsid i 8009e82: | | | | 4b22 ldr r3, [pc, #136] @ (8009f0c ) 8009e84: | | | | 4a27 ldr r2, [pc, #156] @ (8009f24 ) 8009e86: | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009e8a: | | | | 4b27 ldr r3, [pc, #156] @ (8009f28 ) 8009e8c: | | | | 9300 str r3, [sp, #0] 8009e8e: | | | | 4822 ldr r0, [pc, #136] @ (8009f18 ) 8009e90: | | | | f240 1339 movw r3, #313 @ 0x139 8009e94: | | | | f7f7 fa30 bl 80012f8 <printf_> 8009e98: | | | | be00 bkpt 0x0000 LWIP_ASSERT("hmem != NULL", (hmem != NULL)); LWIP_ASSERT("hmem == MEM_ALIGN(hmem)", (hmem == LWIP_MEM_ALIGN(hmem))); 8009e9a: | | | \-> f108 0303 add.w r3, r8, #3 8009e9e: | | | f023 0303 bic.w r3, r3, #3 8009ea2: | | | 4598 cmp r8, r3 8009ea4: | | | /-- d00c beq.n 8009ec0 <pbuf_free.isra.0+0x104> 8009ea6: | | | | b672 cpsid i 8009ea8: | | | | 4b18 ldr r3, [pc, #96] @ (8009f0c ) 8009eaa: | | | | 4a20 ldr r2, [pc, #128] @ (8009f2c ) 8009eac: | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009eb0: | | | | 4b1d ldr r3, [pc, #116] @ (8009f28 ) 8009eb2: | | | | 9300 str r3, [sp, #0] 8009eb4: | | | | 4818 ldr r0, [pc, #96] @ (8009f18 ) 8009eb6: | | | | f44f 73a0 mov.w r3, #320 @ 0x140 8009eba: | | | | f7f7 fa1d bl 80012f8 <printf_> 8009ebe: | | | | be00 bkpt 0x0000 LWIP_ASSERT("hmem->poolnr < MEMP_MAX", (hmem->poolnr < MEMP_MAX)); 8009ec0: | | | \-> f814 3c04 ldrb.w r3, [r4, #-4] 8009ec4: | | | 2b0f cmp r3, #15 8009ec6: | | | /-- d90c bls.n 8009ee2 <pbuf_free.isra.0+0x126> 8009ec8: | | | | b672 cpsid i 8009eca: | | | | 4b10 ldr r3, [pc, #64] @ (8009f0c ) 8009ecc: | | | | 4a18 ldr r2, [pc, #96] @ (8009f30 ) 8009ece: | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009ed2: | | | | 4b15 ldr r3, [pc, #84] @ (8009f28 ) 8009ed4: | | | | 9300 str r3, [sp, #0] 8009ed6: | | | | 4810 ldr r0, [pc, #64] @ (8009f18 ) 8009ed8: | | | | f240 1341 movw r3, #321 @ 0x141 8009edc: | | | | f7f7 fa0c bl 80012f8 <printf_> 8009ee0: | | | | be00 bkpt 0x0000 MEM_STATS_DEC_USED_LOCKED(used, hmem->size); 8009ee2: | | | \-> f7fe f959 bl 8008198 <bgrt_crit_sec_enter> 8009ee6: | | | f7fe f96b bl 80081c0 <bgrt_crit_sec_exit> } } #endif /* MEMP_OVERFLOW_CHECK */ /* and put it in the pool we saved earlier */ memp_free(hmem->poolnr, hmem); 8009eea: | | | 4641 mov r1, r8 8009eec: | | | f814 0c04 ldrb.w r0, [r4, #-4] 8009ef0: | \--|----- e7b5 b.n 8009e5e <pbuf_free.isra.0+0xa2> LWIP_ASSERT("invalid pbuf type", 0); 8009ef2: | \----> b672 cpsid i 8009ef4: | 4a0f ldr r2, [pc, #60] @ (8009f34 ) 8009ef6: | f8d5 11ac ldr.w r1, [r5, #428] @ 0x1ac 8009efa: | 4807 ldr r0, [pc, #28] @ (8009f18 ) 8009efc: | 9600 str r6, [sp, #0] 8009efe: | f240 3311 movw r3, #785 @ 0x311 8009f02: | f7f7 f9f9 bl 80012f8 <printf_> 8009f06: | be00 bkpt 0x0000 8009f08: \----------------- e78e b.n 8009e28 <pbuf_free.isra.0+0x6c> 8009f0a: bf00 nop 8009f0c: 200001b0 .word 0x200001b0 8009f10: 0800b387 .word 0x0800b387 8009f14: 0800cf95 .word 0x0800cf95 8009f18: 0800b232 .word 0x0800b232 8009f1c: 0800cfab .word 0x0800cfab 8009f20: 0800b37d .word 0x0800b37d 8009f24: 0800cfcc .word 0x0800cfcc 8009f28: 0800cb99 .word 0x0800cb99 8009f2c: 0800cfe4 .word 0x0800cfe4 8009f30: 0800cffc .word 0x0800cffc 8009f34: 0800d014 .word 0x0800d014 08009f38 : */ err_t ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif) { 8009f38: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 8009f3c: 469b mov fp, r3 #if CHECKSUM_GEN_IP_INLINE u32_t chk_sum = 0; #endif /* CHECKSUM_GEN_IP_INLINE */ LWIP_ASSERT_CORE_LOCKED(); LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p); 8009f3e: 7b83 ldrb r3, [r0, #14] { 8009f40: b08d sub sp, #52 @ 0x34 LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p); 8009f42: 2b01 cmp r3, #1 { 8009f44: f89d 7058 ldrb.w r7, [sp, #88] @ 0x58 8009f48: f89d a05c ldrb.w sl, [sp, #92] @ 0x5c 8009f4c: 4604 mov r4, r0 8009f4e: 460e mov r6, r1 8009f50: 4691 mov r9, r2 LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p); 8009f52: /-- d00c beq.n 8009f6e <ip4_output_if_src+0x36> 8009f54: | b672 cpsid i 8009f56: | 4bb2 ldr r3, [pc, #712] @ (800a220 ) 8009f58: | 4ab2 ldr r2, [pc, #712] @ (800a224 ) 8009f5a: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009f5e: | 4bb2 ldr r3, [pc, #712] @ (800a228 ) 8009f60: | 9300 str r3, [sp, #0] 8009f62: | 48b2 ldr r0, [pc, #712] @ (800a22c ) 8009f64: | f240 3376 movw r3, #886 @ 0x376 8009f68: | f7f7 f9c6 bl 80012f8 <printf_> 8009f6c: | be00 bkpt 0x0000 MIB2_STATS_INC(mib2.ipoutrequests); /* Should the IP header be generated or is it already included in p? */ if (dest != LWIP_IP_HDRINCL) { 8009f6e: \-> f8df 82d4 ldr.w r8, [pc, #724] @ 800a244 8009f72: f1b9 0f00 cmp.w r9, #0 8009f76: /-------------- f000 8086 beq.w 800a086 <ip4_output_if_src+0x14e> return pbuf_add_header_impl(p, header_size_increment, 0); 8009f7a: | 2200 movs r2, #0 8009f7c: | 2114 movs r1, #20 8009f7e: | 4620 mov r0, r4 8009f80: | f7f8 fae6 bl 8002550 <pbuf_add_header_impl.lto_priv.0> } #endif /* CHECKSUM_GEN_IP_INLINE */ } #endif /* IP_OPTIONS_SEND */ /* generate IP header */ if (pbuf_add_header(p, IP_HLEN)) { 8009f84: | /-- b150 cbz r0, 8009f9c <ip4_output_if_src+0x64> #endif /* CHECKSUM_GEN_IP_INLINE */ } else { /* IP header already included in p */ if (p->len < IP_HLEN) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output: LWIP_IP_HDRINCL but pbuf is too short\n")); IP_STATS_INC(ip.err); 8009f86: | /--------|-> f8b8 305c ldrh.w r3, [r8, #92] @ 0x5c 8009f8a: | | | 3301 adds r3, #1 8009f8c: | | | b29b uxth r3, r3 8009f8e: | | | f8a8 305c strh.w r3, [r8, #92] @ 0x5c return ERR_BUF; 8009f92: | | | f06f 0001 mvn.w r0, #1 } #endif /* IP_FRAG */ LWIP_DEBUGF(IP_DEBUG, ("ip4_output_if: call netif->output()\n")); return netif->output(netif, p, dest); } 8009f96: /-----------|--|--------|-> b00d add sp, #52 @ 0x34 8009f98: | | | | e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} LWIP_ASSERT("check that first pbuf can hold struct ip_hdr", 8009f9c: | | | \-> 8963 ldrh r3, [r4, #10] iphdr = (struct ip_hdr *)p->payload; 8009f9e: | | | 6865 ldr r5, [r4, #4] LWIP_ASSERT("check that first pbuf can hold struct ip_hdr", 8009fa0: | | | 2b13 cmp r3, #19 8009fa2: | | | /-- d80c bhi.n 8009fbe <ip4_output_if_src+0x86> 8009fa4: | | | | b672 cpsid i 8009fa6: | | | | 4b9e ldr r3, [pc, #632] @ (800a220 ) 8009fa8: | | | | 4aa1 ldr r2, [pc, #644] @ (800a230 ) 8009faa: | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 8009fae: | | | | 4b9e ldr r3, [pc, #632] @ (800a228 ) 8009fb0: | | | | 9300 str r3, [sp, #0] 8009fb2: | | | | 489e ldr r0, [pc, #632] @ (800a22c ) 8009fb4: | | | | f240 33aa movw r3, #938 @ 0x3aa 8009fb8: | | | | f7f7 f99e bl 80012f8 <printf_> 8009fbc: | | | | be00 bkpt 0x0000 IPH_PROTO_SET(iphdr, proto); 8009fbe: | | | \-> f885 a009 strb.w sl, [r5, #9] IPH_ID_SET(iphdr, lwip_htons(ip_id)); 8009fc2: | | | 489c ldr r0, [pc, #624] @ (800a234 ) IPH_TTL_SET(iphdr, ttl); 8009fc4: | | | f885 b008 strb.w fp, [r5, #8] ip4_addr_copy(iphdr->dest, *dest); 8009fc8: | | | f8d9 c000 ldr.w ip, [r9] IPH_ID_SET(iphdr, lwip_htons(ip_id)); 8009fcc: | | | 8901 ldrh r1, [r0, #8] IPH_TOS_SET(iphdr, tos); 8009fce: | | | 706f strb r7, [r5, #1] IPH_VHL_SET(iphdr, 4, ip_hlen / 4); 8009fd0: | | | 2345 movs r3, #69 @ 0x45 IPH_OFFSET_SET(iphdr, 0); 8009fd2: | | | 2200 movs r2, #0 IPH_VHL_SET(iphdr, 4, ip_hlen / 4); 8009fd4: | | | 702b strb r3, [r5, #0] chk_sum += ip4_addr_get_u32(&iphdr->dest) >> 16; 8009fd6: | | | ea4f 4e1c mov.w lr, ip, lsr #16 8009fda: | | | 8923 ldrh r3, [r4, #8] ip4_addr_copy(iphdr->dest, *dest); 8009fdc: | | | f8c5 c010 str.w ip, [r5, #16] IPH_OFFSET_SET(iphdr, 0); 8009fe0: | | | 71aa strb r2, [r5, #6] 8009fe2: | | | 71ea strb r2, [r5, #7] chk_sum += iphdr->_id; 8009fe4: | | | fa1e fc8c uxtah ip, lr, ip 8009fe8: | | | ba4a rev16 r2, r1 chk_sum += PP_NTOHS(tos | (iphdr->_v_hl << 8)); 8009fea: | | | 023f lsls r7, r7, #8 IPH_ID_SET(iphdr, lwip_htons(ip_id)); 8009fec: | | | 80aa strh r2, [r5, #4] chk_sum += PP_NTOHS(tos | (iphdr->_v_hl << 8)); 8009fee: | | | f047 0745 orr.w r7, r7, #69 @ 0x45 chk_sum += iphdr->_id; 8009ff2: | | | fa1c f282 uxtah r2, ip, r2 8009ff6: | | | ba5b rev16 r3, r3 chk_sum += PP_NTOHS(proto | (ttl << 8)); 8009ff8: | | | ea4a 2a0b orr.w sl, sl, fp, lsl #8 chk_sum += iphdr->_id; 8009ffc: | | | 443a add r2, r7 8009ffe: | | | fa12 f283 uxtah r2, r2, r3 IPH_LEN_SET(iphdr, lwip_htons(p->tot_len)); 800a002: | | | 806b strh r3, [r5, #2] chk_sum += PP_NTOHS(proto | (ttl << 8)); 800a004: | | | ea4f 232a mov.w r3, sl, asr #8 800a008: | | | ea43 230a orr.w r3, r3, sl, lsl #8 ++ip_id; 800a00c: | | | 3101 adds r1, #1 chk_sum += iphdr->_id; 800a00e: | | | fa12 f383 uxtah r3, r2, r3 ++ip_id; 800a012: | | | 8101 strh r1, [r0, #8] if (src == NULL) { 800a014: | | | /-- b106 cbz r6, 800a018 <ip4_output_if_src+0xe0> ip4_addr_copy(iphdr->src, *src); 800a016: | | | | 6836 ldr r6, [r6, #0] 800a018: | | | \-> 60ee str r6, [r5, #12] chk_sum += ip4_addr_get_u32(&iphdr->src) & 0xFFFF; 800a01a: | | | fa13 f386 uxtah r3, r3, r6 chk_sum += ip4_addr_get_u32(&iphdr->src) >> 16; 800a01e: | | | eb03 4616 add.w r6, r3, r6, lsr #16 chk_sum = (chk_sum >> 16) + (chk_sum & 0xFFFF); 800a022: | | | b2b3 uxth r3, r6 800a024: | | | eb03 4316 add.w r3, r3, r6, lsr #16 chk_sum = (chk_sum >> 16) + chk_sum; 800a028: | | | eb03 4313 add.w r3, r3, r3, lsr #16 chk_sum = ~chk_sum; 800a02c: | | | 43db mvns r3, r3 iphdr->_chksum = (u16_t)chk_sum; /* network order */ 800a02e: | | | 816b strh r3, [r5, #10] IP_STATS_INC(ip.xmit); 800a030: | | | /-------> f8b8 3048 ldrh.w r3, [r8, #72] @ 0x48 800a034: | | | | 3301 adds r3, #1 800a036: | | | | f8a8 3048 strh.w r3, [r8, #72] @ 0x48 if (netif->mtu && (p->tot_len > netif->mtu)) { 800a03a: | | | | 9b18 ldr r3, [sp, #96] @ 0x60 800a03c: | | | | 8d9b ldrh r3, [r3, #44] @ 0x2c 800a03e: | | | | 2b00 cmp r3, #0 800a040: | /--------|--|--|-------- f000 80e6 beq.w 800a210 <ip4_output_if_src+0x2d8> 800a044: | | | | | 8925 ldrh r5, [r4, #8] 800a046: | | | | | 42ab cmp r3, r5 800a048: | +--------|--|--|-------- f080 80e2 bcs.w 800a210 <ip4_output_if_src+0x2d8> u16_t newpbuflen = 0; u16_t left_to_copy; #endif struct ip_hdr *original_iphdr; struct ip_hdr *iphdr; const u16_t nfb = (u16_t)((netif->mtu - IP_HLEN) / 8); 800a04c: | | | | | f1b3 0214 subs.w r2, r3, #20 800a050: | | | | | bf48 it mi 800a052: | | | | | f1a3 020d submi.w r2, r3, #13 800a056: | | | | | f3c2 03cf ubfx r3, r2, #3, #16 800a05a: | | | | | 9306 str r3, [sp, #24] int last; u16_t poff = IP_HLEN; u16_t tmp; int mf_set; original_iphdr = (struct ip_hdr *)p->payload; 800a05c: | | | | | 6863 ldr r3, [r4, #4] 800a05e: | | | | | 9303 str r3, [sp, #12] iphdr = original_iphdr; if (IPH_HL_BYTES(iphdr) != IP_HLEN) { 800a060: | | | | | 781b ldrb r3, [r3, #0] 800a062: | | | | | f003 030f and.w r3, r3, #15 800a066: | | | | | 2b05 cmp r3, #5 800a068: | | | | | ea4f 0683 mov.w r6, r3, lsl #2 800a06c: | | | | | /-- d108 bne.n 800a080 <ip4_output_if_src+0x148> /* ip4_frag() does not support IP options */ return ERR_VAL; } LWIP_ERROR("ip4_frag(): pbuf too short", p->len >= IP_HLEN, return ERR_VAL); 800a06e: | | | | | | 8963 ldrh r3, [r4, #10] 800a070: | | | | | | 2b13 cmp r3, #19 800a072: | | | | | /--|-- d812 bhi.n 800a09a <ip4_output_if_src+0x162> 800a074: | | | | | | | 4b6a ldr r3, [pc, #424] @ (800a220 ) 800a076: | | | | | | | 4870 ldr r0, [pc, #448] @ (800a238 ) 800a078: | | | | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800a07c: | | | | | | | f7f7 f93c bl 80012f8 <printf_> return ERR_VAL; 800a080: | | | | | | \-> f06f 0005 mvn.w r0, #5 800a084: +--|--------|--|--|--|----- e787 b.n 8009f96 <ip4_output_if_src+0x5e> if (p->len < IP_HLEN) { 800a086: | | \--|--|--|----> 8963 ldrh r3, [r4, #10] 800a088: | | | | | 2b13 cmp r3, #19 800a08a: | | \--|--|----- f67f af7c bls.w 8009f86 <ip4_output_if_src+0x4e> ip4_addr_copy(dest_addr, iphdr->dest); 800a08e: | | | | 6863 ldr r3, [r4, #4] 800a090: | | | | 691b ldr r3, [r3, #16] 800a092: | | | | 930b str r3, [sp, #44] @ 0x2c dest = &dest_addr; 800a094: | | | | f10d 092c add.w r9, sp, #44 @ 0x2c 800a098: | | \--|----- e7ca b.n 800a030 <ip4_output_if_src+0xf8> /* Save original offset */ tmp = lwip_ntohs(IPH_OFFSET(iphdr)); 800a09a: | | \----> 9b03 ldr r3, [sp, #12] 800a09c: | | 88db ldrh r3, [r3, #6] 800a09e: | | ba5b rev16 r3, r3 ofo = tmp & IP_OFFMASK; 800a0a0: | | f3c3 020c ubfx r2, r3, #0, #13 800a0a4: | | f403 5300 and.w r3, r3, #8192 @ 0x2000 800a0a8: | | 9307 str r3, [sp, #28] left = (u16_t)(p->tot_len - IP_HLEN); while (left) { /* Fill this fragment */ fragsize = LWIP_MIN(left, (u16_t)(nfb * 8)); 800a0aa: | | 9b06 ldr r3, [sp, #24] ofo = tmp & IP_OFFMASK; 800a0ac: | | 9205 str r2, [sp, #20] fragsize = LWIP_MIN(left, (u16_t)(nfb * 8)); 800a0ae: | | 00db lsls r3, r3, #3 left = (u16_t)(p->tot_len - IP_HLEN); 800a0b0: | | 3d14 subs r5, #20 fragsize = LWIP_MIN(left, (u16_t)(nfb * 8)); 800a0b2: | | b29b uxth r3, r3 left = (u16_t)(p->tot_len - IP_HLEN); 800a0b4: | | b2ad uxth r5, r5 fragsize = LWIP_MIN(left, (u16_t)(nfb * 8)); 800a0b6: | | 9308 str r3, [sp, #32] u16_t newpbuflen = 0; 800a0b8: | | 2700 movs r7, #0 while (left) { 800a0ba: | | /--------/-X b90d cbnz r5, 800a0c0 <ip4_output_if_src+0x188> pbuf_free(rambuf); left = (u16_t)(left - fragsize); ofo = (u16_t)(ofo + nfb); } MIB2_STATS_INC(mib2.ipfragoks); return ERR_OK; 800a0bc: | | | | 4628 mov r0, r5 800a0be: +--|-----------|--------|-- e76a b.n 8009f96 <ip4_output_if_src+0x5e> fragsize = LWIP_MIN(left, (u16_t)(nfb * 8)); 800a0c0: | | | \-> 9b08 ldr r3, [sp, #32] 800a0c2: | | | 42ab cmp r3, r5 800a0c4: | | | bf28 it cs 800a0c6: | | | 462b movcs r3, r5 rambuf = pbuf_alloc(PBUF_LINK, IP_HLEN, PBUF_RAM); 800a0c8: | | | 2114 movs r1, #20 800a0ca: | | | 200e movs r0, #14 fragsize = LWIP_MIN(left, (u16_t)(nfb * 8)); 800a0cc: | | | 9304 str r3, [sp, #16] rambuf = pbuf_alloc(PBUF_LINK, IP_HLEN, PBUF_RAM); 800a0ce: | | | f7ff f8d3 bl 8009278 <pbuf_alloc.constprop.0> if (rambuf == NULL) { 800a0d2: | | | 4680 mov r8, r0 800a0d4: | | | 2800 cmp r0, #0 800a0d6: | | /-----|----------- d079 beq.n 800a1cc <ip4_output_if_src+0x294> LWIP_ASSERT("this needs a pbuf in one piece!", 800a0d8: | | | | 8943 ldrh r3, [r0, #10] 800a0da: | | | | 2b13 cmp r3, #19 800a0dc: | | | | /-- d80c bhi.n 800a0f8 <ip4_output_if_src+0x1c0> 800a0de: | | | | | b672 cpsid i 800a0e0: | | | | | 4b4f ldr r3, [pc, #316] @ (800a220 ) 800a0e2: | | | | | 4a56 ldr r2, [pc, #344] @ (800a23c ) 800a0e4: | | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800a0e8: | | | | | 4b55 ldr r3, [pc, #340] @ (800a240 ) 800a0ea: | | | | | 9300 str r3, [sp, #0] 800a0ec: | | | | | 484f ldr r0, [pc, #316] @ (800a22c ) 800a0ee: | | | | | f44f 7349 mov.w r3, #804 @ 0x324 800a0f2: | | | | | f7f7 f901 bl 80012f8 <printf_> 800a0f6: | | | | | be00 bkpt 0x0000 SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN); 800a0f8: | | | | \-> 9b03 ldr r3, [sp, #12] 800a0fa: | | | | f8d8 2004 ldr.w r2, [r8, #4] 800a0fe: | | | | 4619 mov r1, r3 800a100: | | | | 3114 adds r1, #20 800a102: | | | | /-> f853 0b04 ldr.w r0, [r3], #4 800a106: | | | | | f842 0b04 str.w r0, [r2], #4 800a10a: | | | | | 428b cmp r3, r1 800a10c: | | | | \-- d1f9 bne.n 800a102 <ip4_output_if_src+0x1ca> iphdr = (struct ip_hdr *)rambuf->payload; 800a10e: | | | | f8d8 b004 ldr.w fp, [r8, #4] left_to_copy = fragsize; 800a112: | | | | f8dd a010 ldr.w sl, [sp, #16] while (left_to_copy) { 800a116: | | /--|-----|----------> f1ba 0f00 cmp.w sl, #0 800a11a: | | | | | /-------- d137 bne.n 800a18c <ip4_output_if_src+0x254> last = (left <= netif->mtu - IP_HLEN); 800a11c: | | | | /--|--|-------> 9a18 ldr r2, [sp, #96] @ 0x60 tmp = (IP_OFFMASK & (ofo)); 800a11e: | | | | | | | 9b05 ldr r3, [sp, #20] last = (left <= netif->mtu - IP_HLEN); 800a120: | | | | | | | 8d92 ldrh r2, [r2, #44] @ 0x2c 800a122: | | | | | | | 3a13 subs r2, #19 poff = (u16_t)(poff + newpbuflen); 800a124: | | | | | | | 443e add r6, r7 if (!last || mf_set) { 800a126: | | | | | | | 42aa cmp r2, r5 poff = (u16_t)(poff + newpbuflen); 800a128: | | | | | | | b2b6 uxth r6, r6 tmp = (IP_OFFMASK & (ofo)); 800a12a: | | | | | | | f3c3 030c ubfx r3, r3, #0, #13 if (!last || mf_set) { 800a12e: | | | | | | | /-- dd01 ble.n 800a134 <ip4_output_if_src+0x1fc> 800a130: | | | | | | | | 9a07 ldr r2, [sp, #28] 800a132: | | | | | | | /--|-- b10a cbz r2, 800a138 <ip4_output_if_src+0x200> tmp = tmp | IP_MF; 800a134: | | | | | | | | \-> f443 5300 orr.w r3, r3, #8192 @ 0x2000 800a138: | | | | | | | \----> ba5b rev16 r3, r3 IPH_OFFSET_SET(iphdr, lwip_htons(tmp)); 800a13a: | | | | | | | f8ab 3006 strh.w r3, [fp, #6] IPH_LEN_SET(iphdr, lwip_htons((u16_t)(fragsize + IP_HLEN))); 800a13e: | | | | | | | 9b04 ldr r3, [sp, #16] 800a140: | | | | | | | 3314 adds r3, #20 800a142: | | | | | | | ba5b rev16 r3, r3 800a144: | | | | | | | f8ab 3002 strh.w r3, [fp, #2] IPH_CHKSUM_SET(iphdr, 0); 800a148: | | | | | | | 2300 movs r3, #0 800a14a: | | | | | | | f88b 300a strb.w r3, [fp, #10] 800a14e: | | | | | | | f88b 300b strb.w r3, [fp, #11] return (u16_t)~(unsigned int)LWIP_CHKSUM(dataptr, len); 800a152: | | | | | | | 2114 movs r1, #20 800a154: | | | | | | | 4658 mov r0, fp 800a156: | | | | | | | f7fd ffef bl 8008138 <lwip_standard_chksum> netif->output(netif, rambuf, dest); 800a15a: | | | | | | | 9b18 ldr r3, [sp, #96] @ 0x60 800a15c: | | | | | | | 43c0 mvns r0, r0 800a15e: | | | | | | | 691b ldr r3, [r3, #16] IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN)); 800a160: | | | | | | | f8ab 000a strh.w r0, [fp, #10] netif->output(netif, rambuf, dest); 800a164: | | | | | | | 464a mov r2, r9 800a166: | | | | | | | 4641 mov r1, r8 800a168: | | | | | | | 9818 ldr r0, [sp, #96] @ 0x60 800a16a: | | | | | | | 4798 blx r3 IPFRAG_STATS_INC(ip_frag.xmit); 800a16c: | | | | | | | 4a35 ldr r2, [pc, #212] @ (800a244 ) 800a16e: | | | | | | | 8e13 ldrh r3, [r2, #48] @ 0x30 pbuf_free(rambuf); 800a170: | | | | | | | 4640 mov r0, r8 IPFRAG_STATS_INC(ip_frag.xmit); 800a172: | | | | | | | 3301 adds r3, #1 800a174: | | | | | | | 8613 strh r3, [r2, #48] @ 0x30 pbuf_free(rambuf); 800a176: | | | | | | | f7ff fe21 bl 8009dbc <pbuf_free.isra.0> left = (u16_t)(left - fragsize); 800a17a: | | | | | | | 9b04 ldr r3, [sp, #16] 800a17c: | | | | | | | 1aeb subs r3, r5, r3 800a17e: | | | | | | | b29d uxth r5, r3 ofo = (u16_t)(ofo + nfb); 800a180: | | | | | | | e9dd 3205 ldrd r3, r2, [sp, #20] 800a184: | | | | | | | 4413 add r3, r2 800a186: | | | | | | | b29b uxth r3, r3 800a188: | | | | | | | 9305 str r3, [sp, #20] 800a18a: | | | | | \--|-------- e796 b.n 800a0ba <ip4_output_if_src+0x182> u16_t plen = (u16_t)(p->len - poff); 800a18c: | | | | | \-------> 8963 ldrh r3, [r4, #10] 800a18e: | | | | | 1b9f subs r7, r3, r6 LWIP_ASSERT("p->len >= poff", p->len >= poff); 800a190: | | | | | 42b3 cmp r3, r6 u16_t plen = (u16_t)(p->len - poff); 800a192: | | | | | b2bf uxth r7, r7 LWIP_ASSERT("p->len >= poff", p->len >= poff); 800a194: | | | | | /-- d20c bcs.n 800a1b0 <ip4_output_if_src+0x278> 800a196: | | | | | | b672 cpsid i 800a198: | | | | | | 4b21 ldr r3, [pc, #132] @ (800a220 ) 800a19a: | | | | | | 4a2b ldr r2, [pc, #172] @ (800a248 ) 800a19c: | | | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800a1a0: | | | | | | 4b27 ldr r3, [pc, #156] @ (800a240 ) 800a1a2: | | | | | | 9300 str r3, [sp, #0] 800a1a4: | | | | | | 4821 ldr r0, [pc, #132] @ (800a22c ) 800a1a6: | | | | | | f240 332d movw r3, #813 @ 0x32d 800a1aa: | | | | | | f7f7 f8a5 bl 80012f8 <printf_> 800a1ae: | | | | | | be00 bkpt 0x0000 newpbuflen = LWIP_MIN(left_to_copy, plen); 800a1b0: | | | | | \-> 4557 cmp r7, sl 800a1b2: | | | | | bf28 it cs 800a1b4: | | | | | 4657 movcs r7, sl if (!newpbuflen) { 800a1b6: | | | | | /-- b917 cbnz r7, 800a1be <ip4_output_if_src+0x286> p = p->next; 800a1b8: | | | | | | 6824 ldr r4, [r4, #0] poff = 0; 800a1ba: | | | | | | 463e mov r6, r7 continue; 800a1bc: | | +--|--|-----------|-- e7ab b.n 800a116 <ip4_output_if_src+0x1de> return (struct pbuf_custom_ref *)memp_malloc(MEMP_FRAG_PBUF); 800a1be: | | | | | \-> 2005 movs r0, #5 800a1c0: | | | | | f7f7 ff94 bl 80020ec <memp_malloc> if (pcr == NULL) { 800a1c4: | | | | | /-- b928 cbnz r0, 800a1d2 <ip4_output_if_src+0x29a> pbuf_free(rambuf); 800a1c6: | | | | | | 4640 mov r0, r8 800a1c8: | | | | | | f7ff fdf8 bl 8009dbc <pbuf_free.isra.0> memerr: MIB2_STATS_INC(mib2.ipfragfails); return ERR_MEM; 800a1cc: | | | \--|-----------|-> f04f 30ff mov.w r0, #4294967295 @ 0xffffffff 800a1d0: +--|--|-----|-----------|-- e6e1 b.n 8009f96 <ip4_output_if_src+0x5e> newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc, 800a1d2: | | | | \-> 6863 ldr r3, [r4, #4] p->type_internal = (u8_t)type; 800a1d4: | | | | 9009 str r0, [sp, #36] @ 0x24 p->next = NULL; 800a1d6: | | | | 2200 movs r2, #0 800a1d8: | | | | 4433 add r3, r6 p->payload = payload; 800a1da: | | | | e9c0 2300 strd r2, r3, [r0] p->type_internal = (u8_t)type; 800a1de: | | | | 4b1b ldr r3, [pc, #108] @ (800a24c ) 800a1e0: | | | | 60c3 str r3, [r0, #12] p->tot_len = tot_len; 800a1e2: | | | | 8107 strh r7, [r0, #8] p->len = len; 800a1e4: | | | | 8147 strh r7, [r0, #10] pbuf_ref(p); 800a1e6: | | | | 4620 mov r0, r4 800a1e8: | | | | f7f8 fa24 bl 8002634 <pbuf_ref> pcr->original = p; 800a1ec: | | | | 9909 ldr r1, [sp, #36] @ 0x24 pcr->pc.custom_free_function = ipfrag_free_pbuf_custom; 800a1ee: | | | | 4b18 ldr r3, [pc, #96] @ (800a250 ) pcr->original = p; 800a1f0: | | | | 614c str r4, [r1, #20] left_to_copy = (u16_t)(left_to_copy - newpbuflen); 800a1f2: | | | | ebaa 0a07 sub.w sl, sl, r7 pcr->pc.custom_free_function = ipfrag_free_pbuf_custom; 800a1f6: | | | | 610b str r3, [r1, #16] pbuf_cat(rambuf, newpbuf); 800a1f8: | | | | 4640 mov r0, r8 left_to_copy = (u16_t)(left_to_copy - newpbuflen); 800a1fa: | | | | fa1f fa8a uxth.w sl, sl pbuf_cat(rambuf, newpbuf); 800a1fe: | | | | f7f8 fa3d bl 800267c <pbuf_cat> if (left_to_copy) { 800a202: | | | | f1ba 0f00 cmp.w sl, #0 800a206: | | | \-------------- d089 beq.n 800a11c <ip4_output_if_src+0x1e4> poff = 0; 800a208: | | | 2200 movs r2, #0 p = p->next; 800a20a: | | | 6824 ldr r4, [r4, #0] poff = 0; 800a20c: | | | 4616 mov r6, r2 800a20e: | | \-------------------- e782 b.n 800a116 <ip4_output_if_src+0x1de> return netif->output(netif, p, dest); 800a210: | \----------------------> 9b18 ldr r3, [sp, #96] @ 0x60 800a212: | 9818 ldr r0, [sp, #96] @ 0x60 800a214: | 691b ldr r3, [r3, #16] 800a216: | 464a mov r2, r9 800a218: | 4621 mov r1, r4 800a21a: | 4798 blx r3 800a21c: \-------------------------- e6bb b.n 8009f96 <ip4_output_if_src+0x5e> 800a21e: bf00 nop 800a220: 200001b0 .word 0x200001b0 800a224: 0800d026 .word 0x0800d026 800a228: 0800d032 .word 0x0800d032 800a22c: 0800b232 .word 0x0800b232 800a230: 0800d04b .word 0x0800d04b 800a234: 20008100 .word 0x20008100 800a238: 0800d078 .word 0x0800d078 800a23c: 0800d09b .word 0x0800d09b 800a240: 0800b87f .word 0x0800b87f 800a244: 20001104 .word 0x20001104 800a248: 0800d0bb .word 0x0800d0bb 800a24c: 00010241 .word 0x00010241 800a250: 0800250d .word 0x0800250d 0800a254 : { 800a254: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} if (p->len <= SIZEOF_ETH_HDR) { 800a258: 8943 ldrh r3, [r0, #10] 800a25a: 2b0e cmp r3, #14 { 800a25c: b089 sub sp, #36 @ 0x24 800a25e: 4605 mov r5, r0 800a260: 460c mov r4, r1 if (p->len <= SIZEOF_ETH_HDR) { 800a262: /-- d807 bhi.n 800a274 <ethernet_input+0x20> ETHARP_STATS_INC(etharp.proterr); 800a264: /--|-> 4ba2 ldr r3, [pc, #648] @ (800a4f0 ) 800a266: | | 8d1a ldrh r2, [r3, #40] @ 0x28 800a268: | | 3201 adds r2, #1 800a26a: | | 851a strh r2, [r3, #40] @ 0x28 ETHARP_STATS_INC(etharp.drop); 800a26c: | | 8bda ldrh r2, [r3, #30] 800a26e: | | 3201 adds r2, #1 800a270: | | 83da strh r2, [r3, #30] goto free_and_return; 800a272: /-----------------|--|-- e02b b.n 800a2cc <ethernet_input+0x78> ethhdr = (struct eth_hdr *)p->payload; 800a274: | | \-> 6840 ldr r0, [r0, #4] if (p->if_idx == NETIF_NO_INDEX) { 800a276: | | 7beb ldrb r3, [r5, #15] type = ethhdr->type; 800a278: | | 8986 ldrh r6, [r0, #12] if (p->if_idx == NETIF_NO_INDEX) { 800a27a: | | /-- b91b cbnz r3, 800a284 <ethernet_input+0x30> p->if_idx = netif_get_index(netif); 800a27c: | | | f891 3038 ldrb.w r3, [r1, #56] @ 0x38 800a280: | | | 3301 adds r3, #1 800a282: | | | 73eb strb r3, [r5, #15] if (ethhdr->dest.addr[0] & 1) { 800a284: | | \-> 7803 ldrb r3, [r0, #0] 800a286: | | 07df lsls r7, r3, #31 800a288: | /-----------|----- d50a bpl.n 800a2a0 <ethernet_input+0x4c> if (ethhdr->dest.addr[0] == LL_IP4_MULTICAST_ADDR_0) { 800a28a: | | | 2b01 cmp r3, #1 800a28c: | | /-----|----- d122 bne.n 800a2d4 <ethernet_input+0x80> if ((ethhdr->dest.addr[1] == LL_IP4_MULTICAST_ADDR_1) && 800a28e: | | | | 7843 ldrb r3, [r0, #1] 800a290: | +-----|-----|----- b933 cbnz r3, 800a2a0 <ethernet_input+0x4c> 800a292: | | | | 7883 ldrb r3, [r0, #2] 800a294: | | | | 2b5e cmp r3, #94 @ 0x5e 800a296: | +-----|-----|----- d103 bne.n 800a2a0 <ethernet_input+0x4c> p->flags |= PBUF_FLAG_LLMCAST; 800a298: | | | | 7b6b ldrb r3, [r5, #13] 800a29a: | | | | f043 0310 orr.w r3, r3, #16 p->flags |= PBUF_FLAG_LLBCAST; 800a29e: | | /--|-----|----> 736b strb r3, [r5, #13] switch (type) { 800a2a0: | >--|--|-----|----> 2e08 cmp r6, #8 800a2a2: | | | | /--|----- d021 beq.n 800a2e8 <ethernet_input+0x94> 800a2a4: | | | | | | f5b6 6fc1 cmp.w r6, #1544 @ 0x608 800a2a8: | | | | | \----- d1dc bne.n 800a264 <ethernet_input+0x10> if (!(netif->flags & NETIF_FLAG_ETHARP)) { 800a2aa: | | | | | f894 3035 ldrb.w r3, [r4, #53] @ 0x35 800a2ae: | | | | | 0719 lsls r1, r3, #28 800a2b0: +-----|--|--|--|-------- d50c bpl.n 800a2cc <ethernet_input+0x78> if (pbuf_remove_header(p, next_hdr_offset)) { 800a2b2: | | | | | 210e movs r1, #14 800a2b4: | | | | | 4628 mov r0, r5 800a2b6: | | | | | f7f8 f983 bl 80025c0 <pbuf_remove_header> 800a2ba: | | | | | 4f8d ldr r7, [pc, #564] @ (800a4f0 ) 800a2bc: | | | | | 4681 mov r9, r0 800a2be: | | | | | /----- b328 cbz r0, 800a30c <ethernet_input+0xb8> ETHARP_STATS_INC(etharp.lenerr); 800a2c0: | | | | | | 8c7b ldrh r3, [r7, #34] @ 0x22 800a2c2: | | | | | | 3301 adds r3, #1 800a2c4: | | | | | | 847b strh r3, [r7, #34] @ 0x22 ETHARP_STATS_INC(etharp.drop); 800a2c6: | /--|--|--|--|--|----> 8bfb ldrh r3, [r7, #30] 800a2c8: | | | | | | | 3301 adds r3, #1 800a2ca: | | | | | | | 83fb strh r3, [r7, #30] pbuf_free(p); 800a2cc: >--|--|--|--|--|--|----> 4628 mov r0, r5 800a2ce: | | | | | | | f7ff fd75 bl 8009dbc <pbuf_free.isra.0> return ERR_OK; 800a2d2: | | | | | | | /-- e017 b.n 800a304 <ethernet_input+0xb0> else if (eth_addr_cmp(ðhdr->dest, ðbroadcast)) { 800a2d4: | | | | \--|--|--|-> 4987 ldr r1, [pc, #540] @ (800a4f4 ) 800a2d6: | | | | | | | 2206 movs r2, #6 800a2d8: | | | | | | | f000 fe4e bl 800af78 <memcmp> 800a2dc: | | | | | | | 2800 cmp r0, #0 800a2de: | | \--|-----|--|--|-- d1df bne.n 800a2a0 <ethernet_input+0x4c> p->flags |= PBUF_FLAG_LLBCAST; 800a2e0: | | | | | | 7b6b ldrb r3, [r5, #13] 800a2e2: | | | | | | f043 0308 orr.w r3, r3, #8 800a2e6: | | \-----|--|--|-- e7da b.n 800a29e <ethernet_input+0x4a> if (!(netif->flags & NETIF_FLAG_ETHARP)) { 800a2e8: | | \--|--|-> f894 3035 ldrb.w r3, [r4, #53] @ 0x35 800a2ec: | | | | 0718 lsls r0, r3, #28 800a2ee: +--|--------------|--|-- d5ed bpl.n 800a2cc <ethernet_input+0x78> if (pbuf_remove_header(p, next_hdr_offset)) { 800a2f0: | | | | 210e movs r1, #14 800a2f2: | | | | 4628 mov r0, r5 800a2f4: | | | | f7f8 f964 bl 80025c0 <pbuf_remove_header> 800a2f8: | | | | 2800 cmp r0, #0 800a2fa: +--|--------------|--|-- d1e7 bne.n 800a2cc <ethernet_input+0x78> ip4_input(p, netif); 800a2fc: | | | | 4621 mov r1, r4 800a2fe: | | | | 4628 mov r0, r5 800a300: | | | | f7fb feb4 bl 800606c <ip4_input> } 800a304: | | | \-> 2000 movs r0, #0 800a306: | | | b009 add sp, #36 @ 0x24 800a308: | | | e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} hdr = (struct etharp_hdr *)p->payload; 800a30c: | | \----> f8d5 8004 ldr.w r8, [r5, #4] if ((hdr->hwtype != PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET)) || 800a310: | | f8b8 3000 ldrh.w r3, [r8] 800a314: | | f5b3 7f80 cmp.w r3, #256 @ 0x100 800a318: | | /----- d10b bne.n 800a332 <ethernet_input+0xde> 800a31a: | | | f898 3004 ldrb.w r3, [r8, #4] 800a31e: | | | 2b06 cmp r3, #6 800a320: | | +----- d107 bne.n 800a332 <ethernet_input+0xde> (hdr->hwlen != ETH_HWADDR_LEN) || 800a322: | | | f898 3005 ldrb.w r3, [r8, #5] 800a326: | | | 2b04 cmp r3, #4 800a328: | | +----- d103 bne.n 800a332 <ethernet_input+0xde> (hdr->protolen != sizeof(ip4_addr_t)) || 800a32a: | | | f8b8 3002 ldrh.w r3, [r8, #2] 800a32e: | | | 2b08 cmp r3, #8 800a330: | | | /-- d003 beq.n 800a33a <ethernet_input+0xe6> ETHARP_STATS_INC(etharp.proterr); 800a332: | | \--|-> 8d3b ldrh r3, [r7, #40] @ 0x28 800a334: | | | 3301 adds r3, #1 800a336: | | | 853b strh r3, [r7, #40] @ 0x28 800a338: | \-----------------|-- e7c5 b.n 800a2c6 <ethernet_input+0x72> ETHARP_STATS_INC(etharp.recv); 800a33a: | \-> 8b7b ldrh r3, [r7, #26] SMEMCPY(netifaddr.addr, netif->hwaddr, ETH_HWADDR_LEN); 800a33c: | f8d4 002e ldr.w r0, [r4, #46] @ 0x2e ACD_FOREACH(acd, netif->acd_list) { 800a340: | 6be6 ldr r6, [r4, #60] @ 0x3c SMEMCPY(netifaddr.addr, netif->hwaddr, ETH_HWADDR_LEN); 800a342: | 9006 str r0, [sp, #24] 800a344: | 3301 adds r3, #1 800a346: | 837b strh r3, [r7, #26] IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&sipaddr, &hdr->sipaddr); 800a348: | f8d8 a00e ldr.w sl, [r8, #14] SMEMCPY(netifaddr.addr, netif->hwaddr, ETH_HWADDR_LEN); 800a34c: | 8e63 ldrh r3, [r4, #50] @ 0x32 IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&dipaddr, &hdr->dipaddr); 800a34e: | f8d8 b018 ldr.w fp, [r8, #24] SMEMCPY(netifaddr.addr, netif->hwaddr, ETH_HWADDR_LEN); 800a352: | f8ad 301c strh.w r3, [sp, #28] ACD_FOREACH(acd, netif->acd_list) { 800a356: | /--/-X b966 cbnz r6, 800a372 <ethernet_input+0x11e> if (ip4_addr_isany_val(*netif_ip4_addr(netif))) { 800a358: | | | 6823 ldr r3, [r4, #0] IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&sipaddr, &hdr->sipaddr); 800a35a: | | | f8d8 200e ldr.w r2, [r8, #14] IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&dipaddr, &hdr->dipaddr); 800a35e: | | | f8d8 1018 ldr.w r1, [r8, #24] IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&sipaddr, &hdr->sipaddr); 800a362: | | | 9206 str r2, [sp, #24] if (ip4_addr_isany_val(*netif_ip4_addr(netif))) { 800a364: | | | f108 0a08 add.w sl, r8, #8 800a368: | | | 2b00 cmp r3, #0 800a36a: | /--------|--|-- d140 bne.n 800a3ee <ethernet_input+0x19a> etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr), 800a36c: | /--|--------|--|-> f04f 0b02 mov.w fp, #2 800a370: | /--|--|--------|--|-- e045 b.n 800a3fe <ethernet_input+0x1aa> switch(acd->state) { 800a372: | | | | | \-> 7a33 ldrb r3, [r6, #8] 800a374: | | | | | 2b03 cmp r3, #3 800a376: | | | | | /-- d802 bhi.n 800a37e <ethernet_input+0x12a> 800a378: | | | | /--|--|-- b9d3 cbnz r3, 800a3b0 <ethernet_input+0x15c> ACD_FOREACH(acd, netif->acd_list) { 800a37a: | | | | /--|--|--|-> 6836 ldr r6, [r6, #0] 800a37c: | | | | | | \--|-- e7eb b.n 800a356 <ethernet_input+0x102> switch(acd->state) { 800a37e: | | | | | | \-> 1f1a subs r2, r3, #4 800a380: | | | | | | 2a02 cmp r2, #2 800a382: | | | | +--|-------- d8fa bhi.n 800a37a <ethernet_input+0x126> if (ip4_addr_eq(&sipaddr, &acd->ipaddr) && 800a384: | | | | | | 6872 ldr r2, [r6, #4] 800a386: | | | | | | 4592 cmp sl, r2 800a388: | | | | +--|-------- d1f7 bne.n 800a37a <ethernet_input+0x126> !eth_addr_eq(&netifaddr, &hdr->shwaddr)) { 800a38a: | | | | | | 2206 movs r2, #6 800a38c: | | | | | | f108 0108 add.w r1, r8, #8 800a390: | | | | | | a806 add r0, sp, #24 800a392: | | | | | | 9304 str r3, [sp, #16] 800a394: | | | | | | f000 fdf0 bl 800af78 <memcmp> if (ip4_addr_eq(&sipaddr, &acd->ipaddr) && 800a398: | | | | | | 9b04 ldr r3, [sp, #16] 800a39a: | | | | | | 2800 cmp r0, #0 800a39c: | | | | +--|-------- d0ed beq.n 800a37a <ethernet_input+0x126> if (acd->state == ACD_STATE_PASSIVE_ONGOING) { 800a39e: | | | | | | 2b06 cmp r3, #6 800a3a0: | | | | | | /----- d11b bne.n 800a3da <ethernet_input+0x186> acd->state = ACD_STATE_OFF; 800a3a2: | | | | | | | 2300 movs r3, #0 800a3a4: | | | | | | | 7233 strb r3, [r6, #8] acd->acd_conflict_callback(netif, ACD_DECLINE); 800a3a6: | | | | | | | 2102 movs r1, #2 800a3a8: | | | | | | | 6933 ldr r3, [r6, #16] 800a3aa: | | | | | | | 4620 mov r0, r4 800a3ac: | | | | | | | 4798 blx r3 800a3ae: | | | | +--|--|----- e7e4 b.n 800a37a <ethernet_input+0x126> if ((ip4_addr_eq(&sipaddr, &acd->ipaddr)) || 800a3b0: | | | | | \--|----> 6873 ldr r3, [r6, #4] 800a3b2: | | | | | | 459a cmp sl, r3 800a3b4: | | | | | | /-- d00c beq.n 800a3d0 <ethernet_input+0x17c> 800a3b6: | | | | | | | f1ba 0f00 cmp.w sl, #0 800a3ba: | | | | +-----|--|-- d1de bne.n 800a37a <ethernet_input+0x126> (ip4_addr_isany_val(sipaddr) && 800a3bc: | | | | | | | 459b cmp fp, r3 800a3be: | | | | +-----|--|-- d1dc bne.n 800a37a <ethernet_input+0x126> !eth_addr_eq(&netifaddr, &hdr->shwaddr))) { 800a3c0: | | | | | | | 2206 movs r2, #6 800a3c2: | | | | | | | f108 0108 add.w r1, r8, #8 800a3c6: | | | | | | | a806 add r0, sp, #24 800a3c8: | | | | | | | f000 fdd6 bl 800af78 <memcmp> ip4_addr_eq(&dipaddr, &acd->ipaddr) && 800a3cc: | | | | | | | 2800 cmp r0, #0 800a3ce: | | | | +-----|--|-- d0d4 beq.n 800a37a <ethernet_input+0x126> acd_restart(netif, acd); 800a3d0: | | | | | | >-> 4631 mov r1, r6 800a3d2: | | | | | | | 4620 mov r0, r4 800a3d4: | | | | | | | f7fa fab0 bl 8004938 <acd_restart.lto_priv.0> 800a3d8: | | | | +-----|--|-- e7cf b.n 800a37a <ethernet_input+0x126> if (acd->lastconflict > 0) { 800a3da: | | | | | \--|-> 7b33 ldrb r3, [r6, #12] 800a3dc: | | | | | | 2b00 cmp r3, #0 800a3de: | | | | | \-- d1f7 bne.n 800a3d0 <ethernet_input+0x17c> etharp_acd_announce(netif, &acd->ipaddr); 800a3e0: | | | | | 1d31 adds r1, r6, #4 800a3e2: | | | | | 4620 mov r0, r4 800a3e4: | | | | | f7ff fab3 bl 800994e <etharp_acd_announce.isra.0> acd->lastconflict = DEFEND_INTERVAL * ACD_TICKS_PER_SECOND; 800a3e8: | | | | | 2364 movs r3, #100 @ 0x64 800a3ea: | | | | | 7333 strb r3, [r6, #12] 800a3ec: | | | | \----------- e7c5 b.n 800a37a <ethernet_input+0x126> from_us = (u8_t)ip4_addr_eq(&sipaddr, netif_ip4_addr(netif)); 800a3ee: | | | \-------------> 1ad2 subs r2, r2, r3 800a3f0: | | | 4256 negs r6, r2 800a3f2: | | | 4156 adcs r6, r2 etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr), 800a3f4: | | | 4299 cmp r1, r3 800a3f6: | | \----------------- d1b9 bne.n 800a36c <ethernet_input+0x118> 800a3f8: | | f04f 0901 mov.w r9, #1 800a3fc: | | 46cb mov fp, r9 LWIP_ASSERT("netif->hwaddr_len == ETH_HWADDR_LEN", netif->hwaddr_len == ETH_HWADDR_LEN); 800a3fe: | \-------------------> f894 3034 ldrb.w r3, [r4, #52] @ 0x34 800a402: | 2b06 cmp r3, #6 800a404: | /-- d00c beq.n 800a420 <ethernet_input+0x1cc> 800a406: | | b672 cpsid i 800a408: | | 4b3b ldr r3, [pc, #236] @ (800a4f8 ) 800a40a: | | 4a3c ldr r2, [pc, #240] @ (800a4fc ) 800a40c: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800a410: | | 4b3b ldr r3, [pc, #236] @ (800a500 ) 800a412: | | 9300 str r3, [sp, #0] 800a414: | | 483b ldr r0, [pc, #236] @ (800a504 ) 800a416: | | f44f 73d5 mov.w r3, #426 @ 0x1aa 800a41a: | | f7f6 ff6d bl 80012f8 <printf_> 800a41e: | | be00 bkpt 0x0000 if (ip4_addr_isany(ipaddr) || 800a420: | \-> 9b06 ldr r3, [sp, #24] 800a422: | 2b00 cmp r3, #0 800a424: | /-- d042 beq.n 800a4ac <ethernet_input+0x258> ip4_addr_isbroadcast(ipaddr, netif) || 800a426: | | 4621 mov r1, r4 800a428: | | 4618 mov r0, r3 800a42a: | | 9305 str r3, [sp, #20] 800a42c: | | f7fd fe10 bl 8008050 <ip4_addr_isbroadcast_u32> if (ip4_addr_isany(ipaddr) || 800a430: | | 9004 str r0, [sp, #16] 800a432: | | 2800 cmp r0, #0 800a434: | +-- d13a bne.n 800a4ac <ethernet_input+0x258> ip4_addr_ismulticast(ipaddr)) { 800a436: | | 9b05 ldr r3, [sp, #20] 800a438: | | f003 03f0 and.w r3, r3, #240 @ 0xf0 ip4_addr_isbroadcast(ipaddr, netif) || 800a43c: | | 2be0 cmp r3, #224 @ 0xe0 800a43e: | +-- d035 beq.n 800a4ac <ethernet_input+0x258> i = etharp_find_entry(ipaddr, flags, netif); 800a440: | | 4659 mov r1, fp 800a442: | | a806 add r0, sp, #24 800a444: | | f7ff fa98 bl 8009978 <etharp_find_entry.isra.0> if (i < 0) { 800a448: | | 1e03 subs r3, r0, #0 800a44a: | +-- db2f blt.n 800a4ac <ethernet_input+0x258> arp_table[i].state = ETHARP_STATE_STABLE; 800a44c: | | 492e ldr r1, [pc, #184] @ (800a508 ) arp_table[i].ctime = 0; 800a44e: | | 9a04 ldr r2, [sp, #16] arp_table[i].state = ETHARP_STATE_STABLE; 800a450: | | 2018 movs r0, #24 800a452: | | fb00 fc03 mul.w ip, r0, r3 800a456: | | eb01 0e0c add.w lr, r1, ip 800a45a: | | f04f 0b02 mov.w fp, #2 800a45e: | | f88e b014 strb.w fp, [lr, #20] SMEMCPY(&arp_table[i].ethaddr, ethaddr, ETH_HWADDR_LEN); 800a462: | | f04f 0b0c mov.w fp, #12 arp_table[i].netif = netif; 800a466: | | f8ce 4008 str.w r4, [lr, #8] SMEMCPY(&arp_table[i].ethaddr, ethaddr, ETH_HWADDR_LEN); 800a46a: | | fb13 b300 smlabb r3, r3, r0, fp 800a46e: | | f8da 0000 ldr.w r0, [sl] 800a472: | | 50c8 str r0, [r1, r3] 800a474: | | eb03 0b01 add.w fp, r3, r1 800a478: | | f8ba 3004 ldrh.w r3, [sl, #4] 800a47c: | | f8ab 3004 strh.w r3, [fp, #4] if (arp_table[i].q != NULL) { 800a480: | | f851 b00c ldr.w fp, [r1, ip] arp_table[i].ctime = 0; 800a484: | | f8ae 2012 strh.w r2, [lr, #18] if (arp_table[i].q != NULL) { 800a488: | | f1bb 0f00 cmp.w fp, #0 800a48c: | +-- d00e beq.n 800a4ac <ethernet_input+0x258> ethernet_output(netif, p, (struct eth_addr *)(netif->hwaddr), ethaddr, ETHTYPE_IP); 800a48e: | | f44f 6300 mov.w r3, #2048 @ 0x800 arp_table[i].q = NULL; 800a492: | | f841 200c str.w r2, [r1, ip] ethernet_output(netif, p, (struct eth_addr *)(netif->hwaddr), ethaddr, ETHTYPE_IP); 800a496: | | 4620 mov r0, r4 800a498: | | 9300 str r3, [sp, #0] 800a49a: | | f104 022e add.w r2, r4, #46 @ 0x2e 800a49e: | | 4653 mov r3, sl 800a4a0: | | 4659 mov r1, fp 800a4a2: | | f7fd fdfd bl 80080a0 <ethernet_output> pbuf_free(p); 800a4a6: | | 4658 mov r0, fp 800a4a8: | | f7ff fc88 bl 8009dbc <pbuf_free.isra.0> switch (hdr->opcode) { 800a4ac: | \-> f8b8 3006 ldrh.w r3, [r8, #6] 800a4b0: | f5b3 7f80 cmp.w r3, #256 @ 0x100 800a4b4: | /-- d007 beq.n 800a4c6 <ethernet_input+0x272> 800a4b6: | | f5b3 7f00 cmp.w r3, #512 @ 0x200 800a4ba: +--------------------|-- f43f af07 beq.w 800a2cc <ethernet_input+0x78> ETHARP_STATS_INC(etharp.err); 800a4be: | | 8dbb ldrh r3, [r7, #44] @ 0x2c 800a4c0: | | 3301 adds r3, #1 800a4c2: | | 85bb strh r3, [r7, #44] @ 0x2c break; 800a4c4: +--------------------|-- e702 b.n 800a2cc <ethernet_input+0x78> if (for_us && !from_us) { 800a4c6: | \-> f1b9 0f00 cmp.w r9, #0 800a4ca: +----------------------- f43f aeff beq.w 800a2cc <ethernet_input+0x78> 800a4ce: | 2e00 cmp r6, #0 800a4d0: +----------------------- f47f aefc bne.w 800a2cc <ethernet_input+0x78> etharp_raw(netif, 800a4d4: | 2202 movs r2, #2 (struct eth_addr *)netif->hwaddr, &hdr->shwaddr, 800a4d6: | f104 032e add.w r3, r4, #46 @ 0x2e etharp_raw(netif, 800a4da: | 9203 str r2, [sp, #12] 800a4dc: | aa06 add r2, sp, #24 800a4de: | e9cd a201 strd sl, r2, [sp, #4] 800a4e2: | 9400 str r4, [sp, #0] 800a4e4: | 4652 mov r2, sl 800a4e6: | 4619 mov r1, r3 800a4e8: | 4620 mov r0, r4 800a4ea: | f7fb f961 bl 80057b0 <etharp_raw.lto_priv.0> 800a4ee: \----------------------- e6ed b.n 800a2cc <ethernet_input+0x78> 800a4f0: 20001104 .word 0x20001104 800a4f4: 0800d361 .word 0x0800d361 800a4f8: 200001b0 .word 0x200001b0 800a4fc: 0800d0ca .word 0x0800d0ca 800a500: 0800c3a3 .word 0x0800c3a3 800a504: 0800b232 .word 0x0800b232 800a508: 200012b0 .word 0x200012b0 0800a50c : { 800a50c: b538 push {r3, r4, r5, lr} if (inp->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) { 800a50e: f891 3035 ldrb.w r3, [r1, #53] @ 0x35 800a512: f013 0f18 tst.w r3, #24 { 800a516: 4605 mov r5, r0 800a518: 460c mov r4, r1 if (inp->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) { 800a51a: /----- d00a beq.n 800a532 <tcpip_input+0x26> LOCK_TCPIP_CORE(); 800a51c: | f7fe fd7c bl 8009018 <sys_mutex_lock.constprop.0> ret = input_fn(p, inp); 800a520: | 4621 mov r1, r4 800a522: | 4628 mov r0, r5 800a524: | f7ff fe96 bl 800a254 <ethernet_input> 800a528: | /-> 4604 mov r4, r0 UNLOCK_TCPIP_CORE(); 800a52a: | | f7fe fdb9 bl 80090a0 <sys_mutex_unlock.constprop.0> } 800a52e: | | 4620 mov r0, r4 800a530: | | bd38 pop {r3, r4, r5, pc} LOCK_TCPIP_CORE(); 800a532: \--|-> f7fe fd71 bl 8009018 <sys_mutex_lock.constprop.0> ret = input_fn(p, inp); 800a536: | 4621 mov r1, r4 800a538: | 4628 mov r0, r5 800a53a: | f7fb fd97 bl 800606c <ip4_input> 800a53e: \-- e7f3 b.n 800a528 <tcpip_input+0x1c> 0800a540 : udp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p, 800a540: e92d 47ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, lr} 800a544: f8dd a030 ldr.w sl, [sp, #48] @ 0x30 800a548: 460d mov r5, r1 800a54a: 4690 mov r8, r2 800a54c: 4699 mov r9, r3 LWIP_ERROR("udp_sendto_if_src: invalid pcb", pcb != NULL, return ERR_ARG); 800a54e: 4606 mov r6, r0 800a550: /----- b940 cbnz r0, 800a564 <udp_sendto_if_src.constprop.0.isra.0+0x24> 800a552: | 4b42 ldr r3, [pc, #264] @ (800a65c ) 800a554: | 4842 ldr r0, [pc, #264] @ (800a660 ) 800a556: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac } 800a55a: /--|----> b004 add sp, #16 800a55c: | | e8bd 47f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, lr} LWIP_ERROR("udp_sendto_if_src: invalid netif", netif != NULL, return ERR_ARG); 800a560: | | f7f6 beca b.w 80012f8 <printf_> LWIP_ERROR("udp_sendto_if_src: invalid pbuf", p != NULL, return ERR_ARG); 800a564: | \--/-X b921 cbnz r1, 800a570 <udp_sendto_if_src.constprop.0.isra.0+0x30> 800a566: | | 4b3d ldr r3, [pc, #244] @ (800a65c ) 800a568: | | 483e ldr r0, [pc, #248] @ (800a664 ) 800a56a: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800a56e: +-----|-- e7f4 b.n 800a55a <udp_sendto_if_src.constprop.0.isra.0+0x1a> LWIP_ERROR("udp_sendto_if_src: invalid netif", netif != NULL, return ERR_ARG); 800a570: | /--\-X b923 cbnz r3, 800a57c <udp_sendto_if_src.constprop.0.isra.0+0x3c> 800a572: | | 4b3a ldr r3, [pc, #232] @ (800a65c ) 800a574: | | 483c ldr r0, [pc, #240] @ (800a668 ) 800a576: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800a57a: \--|----- e7ee b.n 800a55a <udp_sendto_if_src.constprop.0.isra.0+0x1a> if (pcb->local_port == 0) { 800a57c: \----> 8a42 ldrh r2, [r0, #18] 800a57e: /-- b13a cbz r2, 800a590 <udp_sendto_if_src.constprop.0.isra.0+0x50> if ((u16_t)(p->tot_len + UDP_HLEN) < p->tot_len) { 800a580: /-----|-> 892a ldrh r2, [r5, #8] 800a582: | | f64f 73f7 movw r3, #65527 @ 0xfff7 800a586: | | 429a cmp r2, r3 800a588: | /--|-- d908 bls.n 800a59c <udp_sendto_if_src.constprop.0.isra.0+0x5c> } 800a58a: /--|--|--|-> b004 add sp, #16 800a58c: | | | | e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} err = udp_bind(pcb, &pcb->local_ip, pcb->local_port); 800a590: | | | \-> 4601 mov r1, r0 800a592: | | | f7fa f96f bl 8004874 <udp_bind> if (err != ERR_OK) { 800a596: | | | 2800 cmp r0, #0 800a598: | \--|----- d0f2 beq.n 800a580 <udp_sendto_if_src.constprop.0.isra.0+0x40> 800a59a: +-----|----- e7f6 b.n 800a58a <udp_sendto_if_src.constprop.0.isra.0+0x4a> return pbuf_add_header_impl(p, header_size_increment, 0); 800a59c: | \----> 2200 movs r2, #0 800a59e: | 2108 movs r1, #8 800a5a0: | 4628 mov r0, r5 800a5a2: | f7f7 ffd5 bl 8002550 <pbuf_add_header_impl.lto_priv.0> if (pbuf_add_header(p, UDP_HLEN)) { 800a5a6: | 2800 cmp r0, #0 800a5a8: | /-------- d055 beq.n 800a656 <udp_sendto_if_src.constprop.0.isra.0+0x116> q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM); 800a5aa: | | 2108 movs r1, #8 800a5ac: | | 2022 movs r0, #34 @ 0x22 800a5ae: | | f7fe fe63 bl 8009278 <pbuf_alloc.constprop.0> if (q == NULL) { 800a5b2: | | 4604 mov r4, r0 800a5b4: | | 2800 cmp r0, #0 800a5b6: +--|-------- d0e8 beq.n 800a58a <udp_sendto_if_src.constprop.0.isra.0+0x4a> if (p->tot_len != 0) { 800a5b8: | | 892b ldrh r3, [r5, #8] 800a5ba: | | /----- b12b cbz r3, 800a5c8 <udp_sendto_if_src.constprop.0.isra.0+0x88> pbuf_cat(h, t); 800a5bc: | | | 4629 mov r1, r5 800a5be: | | | f7f8 f85d bl 800267c <pbuf_cat> pbuf_ref(t); 800a5c2: | | | 4628 mov r0, r5 800a5c4: | | | f7f8 f836 bl 8002634 <pbuf_ref> LWIP_ASSERT("check that first pbuf can hold struct udp_hdr", 800a5c8: | | >----> 8963 ldrh r3, [r4, #10] 800a5ca: | | | 2b07 cmp r3, #7 800a5cc: | | | /-- d80c bhi.n 800a5e8 <udp_sendto_if_src.constprop.0.isra.0+0xa8> 800a5ce: | | | | b672 cpsid i 800a5d0: | | | | 4b22 ldr r3, [pc, #136] @ (800a65c ) 800a5d2: | | | | 4a26 ldr r2, [pc, #152] @ (800a66c ) 800a5d4: | | | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800a5d8: | | | | 4b25 ldr r3, [pc, #148] @ (800a670 ) 800a5da: | | | | 9300 str r3, [sp, #0] 800a5dc: | | | | 4825 ldr r0, [pc, #148] @ (800a674 ) 800a5de: | | | | f240 330d movw r3, #781 @ 0x30d 800a5e2: | | | | f7f6 fe89 bl 80012f8 <printf_> 800a5e6: | | | | be00 bkpt 0x0000 800a5e8: | | | \-> 8a73 ldrh r3, [r6, #18] udphdr = (struct udp_hdr *)q->payload; 800a5ea: | | | 6867 ldr r7, [r4, #4] udphdr->dest = lwip_htons(dst_port); 800a5ec: | | | 2243 movs r2, #67 @ 0x43 800a5ee: | | | ba5b rev16 r3, r3 800a5f0: | | | 70fa strb r2, [r7, #3] udphdr->len = lwip_htons(q->tot_len); 800a5f2: | | | 8922 ldrh r2, [r4, #8] udphdr->src = lwip_htons(pcb->local_port); 800a5f4: | | | 803b strh r3, [r7, #0] udphdr->dest = lwip_htons(dst_port); 800a5f6: | | | 2300 movs r3, #0 800a5f8: | | | 70bb strb r3, [r7, #2] udphdr->chksum = 0x0000; 800a5fa: | | | 71bb strb r3, [r7, #6] 800a5fc: | | | 71fb strb r3, [r7, #7] 800a5fe: | | | ba53 rev16 r3, r2 udphdr->len = lwip_htons(q->tot_len); 800a600: | | | 80bb strh r3, [r7, #4] if (IP_IS_V6(dst_ip) || (pcb->flags & UDP_FLAGS_NOCHKSUM) == 0) { 800a602: | | | 7c33 ldrb r3, [r6, #16] 800a604: | | | 07db lsls r3, r3, #31 800a606: | | | /-- d40e bmi.n 800a626 <udp_sendto_if_src.constprop.0.isra.0+0xe6> return inet_chksum_pseudo(p, proto, proto_len, ip_2_ip4(src), ip_2_ip4(dest)); 800a608: | | | | f8d8 3000 ldr.w r3, [r8] 800a60c: | | | | 9300 str r3, [sp, #0] 800a60e: | | | | f8da 3000 ldr.w r3, [sl] 800a612: | | | | 2111 movs r1, #17 800a614: | | | | 4620 mov r0, r4 800a616: | | | | f7ff f957 bl 80098c8 <inet_chksum_pseudo.isra.0> udpchksum = 0xffff; 800a61a: | | | | f64f 73ff movw r3, #65535 @ 0xffff 800a61e: | | | | 2800 cmp r0, #0 800a620: | | | | bf18 it ne 800a622: | | | | 4603 movne r3, r0 udphdr->chksum = udpchksum; 800a624: | | | | 80fb strh r3, [r7, #6] err = ip_output_if_src(q, src_ip, dst_ip, ttl, pcb->tos, ip_proto, netif); 800a626: | | | \-> 2311 movs r3, #17 800a628: | | | f8cd 9008 str.w r9, [sp, #8] 800a62c: | | | 9301 str r3, [sp, #4] 800a62e: | | | 7ab3 ldrb r3, [r6, #10] 800a630: | | | 9300 str r3, [sp, #0] 800a632: | | | 7af3 ldrb r3, [r6, #11] 800a634: | | | 4642 mov r2, r8 800a636: | | | 4651 mov r1, sl 800a638: | | | 4620 mov r0, r4 800a63a: | | | f7ff fc7d bl 8009f38 <ip4_output_if_src> if (q != p) { 800a63e: | | | 42a5 cmp r5, r4 800a640: | | | /-- d002 beq.n 800a648 <udp_sendto_if_src.constprop.0.isra.0+0x108> pbuf_free(q); 800a642: | | | | 4620 mov r0, r4 800a644: | | | | f7ff fbba bl 8009dbc <pbuf_free.isra.0> UDP_STATS_INC(udp.xmit); 800a648: | | | \-> 4a0b ldr r2, [pc, #44] @ (800a678 ) 800a64a: | | | f8b2 3078 ldrh.w r3, [r2, #120] @ 0x78 800a64e: | | | 3301 adds r3, #1 800a650: | | | f8a2 3078 strh.w r3, [r2, #120] @ 0x78 return err; 800a654: \--|--|----- e799 b.n 800a58a <udp_sendto_if_src.constprop.0.isra.0+0x4a> q = p; 800a656: \--|----> 462c mov r4, r5 800a658: \----- e7b6 b.n 800a5c8 <udp_sendto_if_src.constprop.0.isra.0+0x88> 800a65a: bf00 nop 800a65c: 200001b0 .word 0x200001b0 800a660: 0800d0ee .word 0x0800d0ee 800a664: 0800d115 .word 0x0800d115 800a668: 0800d13d .word 0x0800d13d 800a66c: 0800d166 .word 0x0800d166 800a670: 0800c614 .word 0x0800c614 800a674: 0800b232 .word 0x0800b232 800a678: 20001104 .word 0x20001104 0800a67c : udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p, 800a67c: b537 push {r0, r1, r2, r4, r5, lr} LWIP_ERROR("udp_sendto_if: invalid pcb", pcb != NULL, return ERR_ARG); 800a67e: /----- b940 cbnz r0, 800a692 <udp_sendto_if.constprop.0.isra.0+0x16> 800a680: | 4b12 ldr r3, [pc, #72] @ (800a6cc ) 800a682: | 4813 ldr r0, [pc, #76] @ (800a6d0 ) 800a684: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac } 800a688: /--|----> b003 add sp, #12 800a68a: | | e8bd 4030 ldmia.w sp!, {r4, r5, lr} LWIP_ERROR("udp_sendto_if: invalid netif", netif != NULL, return ERR_ARG); 800a68e: | | f7f6 be33 b.w 80012f8 <printf_> LWIP_ERROR("udp_sendto_if: invalid pbuf", p != NULL, return ERR_ARG); 800a692: | \--/-X b921 cbnz r1, 800a69e <udp_sendto_if.constprop.0.isra.0+0x22> 800a694: | | 4b0d ldr r3, [pc, #52] @ (800a6cc ) 800a696: | | 480f ldr r0, [pc, #60] @ (800a6d4 ) 800a698: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800a69c: +-----|-- e7f4 b.n 800a688 <udp_sendto_if.constprop.0.isra.0+0xc> LWIP_ERROR("udp_sendto_if: invalid netif", netif != NULL, return ERR_ARG); 800a69e: | /--\-X b923 cbnz r3, 800a6aa <udp_sendto_if.constprop.0.isra.0+0x2e> 800a6a0: | | 4b0a ldr r3, [pc, #40] @ (800a6cc ) 800a6a2: | | 480d ldr r0, [pc, #52] @ (800a6d8 ) 800a6a4: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800a6a8: \--|----- e7ee b.n 800a688 <udp_sendto_if.constprop.0.isra.0+0xc> if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) || 800a6aa: \----> 6804 ldr r4, [r0, #0] 800a6ac: /-- b11c cbz r4, 800a6b6 <udp_sendto_if.constprop.0.isra.0+0x3a> ip4_addr_ismulticast(ip_2_ip4(&pcb->local_ip))) { 800a6ae: | f004 05f0 and.w r5, r4, #240 @ 0xf0 if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) || 800a6b2: | 2de0 cmp r5, #224 @ 0xe0 800a6b4: /--|-- d105 bne.n 800a6c2 <udp_sendto_if.constprop.0.isra.0+0x46> src_ip = netif_ip_addr4(netif); 800a6b6: | \-> 461c mov r4, r3 return udp_sendto_if_src(pcb, p, dst_ip, dst_port, netif, src_ip); 800a6b8: /--|----> 9400 str r4, [sp, #0] 800a6ba: | | f7ff ff41 bl 800a540 <udp_sendto_if_src.constprop.0.isra.0> } 800a6be: | | /-> b003 add sp, #12 800a6c0: | | | bd30 pop {r4, r5, pc} if (!ip4_addr_eq(ip_2_ip4(&(pcb->local_ip)), netif_ip4_addr(netif))) { 800a6c2: | \--|-> 681d ldr r5, [r3, #0] 800a6c4: | | 42ac cmp r4, r5 800a6c6: | \-- d1fa bne.n 800a6be <udp_sendto_if.constprop.0.isra.0+0x42> if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) || 800a6c8: | 4604 mov r4, r0 800a6ca: \-------- e7f5 b.n 800a6b8 <udp_sendto_if.constprop.0.isra.0+0x3c> 800a6cc: 200001b0 .word 0x200001b0 800a6d0: 0800d194 .word 0x0800d194 800a6d4: 0800d1b7 .word 0x0800d1b7 800a6d8: 0800d1db .word 0x0800d1db 0800a6dc : dhcp_select(struct netif *netif) 800a6dc: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} LWIP_ERROR("dhcp_select: netif != NULL", (netif != NULL), return ERR_ARG;); 800a6e0: 4607 mov r7, r0 dhcp_select(struct netif *netif) 800a6e2: b085 sub sp, #20 LWIP_ERROR("dhcp_select: netif != NULL", (netif != NULL), return ERR_ARG;); 800a6e4: /-- b940 cbnz r0, 800a6f8 <dhcp_select.isra.0+0x1c> 800a6e6: | 4b47 ldr r3, [pc, #284] @ (800a804 ) 800a6e8: | 4847 ldr r0, [pc, #284] @ (800a808 ) 800a6ea: | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac } 800a6ee: /--|-> b005 add sp, #20 800a6f0: | | e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr} LWIP_ERROR("dhcp_select: dhcp != NULL", (dhcp != NULL), return ERR_VAL;); 800a6f4: | | f7f6 be00 b.w 80012f8 <printf_> dhcp = netif_dhcp_data(netif); 800a6f8: | \-> 6a44 ldr r4, [r0, #36] @ 0x24 LWIP_ERROR("dhcp_select: dhcp != NULL", (dhcp != NULL), return ERR_VAL;); 800a6fa: | /-- b924 cbnz r4, 800a706 <dhcp_select.isra.0+0x2a> 800a6fc: | | 4b41 ldr r3, [pc, #260] @ (800a804 ) 800a6fe: | | 4843 ldr r0, [pc, #268] @ (800a80c ) 800a700: | | f8d3 11ac ldr.w r1, [r3, #428] @ 0x1ac 800a704: \--|-- e7f3 b.n 800a6ee <dhcp_select.isra.0+0x12> dhcp_set_state(dhcp, DHCP_STATE_REQUESTING); 800a706: \-> 2101 movs r1, #1 800a708: 4620 mov r0, r4 800a70a: f7fa f979 bl 8004a00 <dhcp_set_state.lto_priv.0> p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len); 800a70e: f10d 030e add.w r3, sp, #14 800a712: 2203 movs r2, #3 800a714: 4621 mov r1, r4 800a716: 4638 mov r0, r7 800a718: f7fa fa90 bl 8004c3c <dhcp_create_msg.lto_priv.0> if (p_out != NULL) { 800a71c: 4606 mov r6, r0 800a71e: 2800 cmp r0, #0 800a720: /----- d051 beq.n 800a7c6 <dhcp_select.isra.0+0xea> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); 800a722: | 6845 ldr r5, [r0, #4] 800a724: | f8bd 000e ldrh.w r0, [sp, #14] 800a728: | f8df 90f0 ldr.w r9, [pc, #240] @ 800a81c 800a72c: | 35f0 adds r5, #240 @ 0xf0 800a72e: | 2302 movs r3, #2 800a730: | 2239 movs r2, #57 @ 0x39 800a732: | 4629 mov r1, r5 800a734: | f7fa f9ea bl 8004b0c <dhcp_option.lto_priv.0> options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif)); 800a738: | 8dba ldrh r2, [r7, #44] @ 0x2c 800a73a: | 4629 mov r1, r5 800a73c: | f7fa fa2e bl 8004b9c <dhcp_option_short.lto_priv.0> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4); 800a740: | 2304 movs r3, #4 800a742: | 2232 movs r2, #50 @ 0x32 800a744: | 4629 mov r1, r5 800a746: | f7fa f9e1 bl 8004b0c <dhcp_option.lto_priv.0> 800a74a: | 4603 mov r3, r0 options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr))); 800a74c: | 69e0 ldr r0, [r4, #28] 800a74e: | f7fd fcf1 bl 8008134 <lwip_htonl> 800a752: | 4629 mov r1, r5 800a754: | 4602 mov r2, r0 800a756: | 4618 mov r0, r3 800a758: | f7fa fa44 bl 8004be4 <dhcp_option_long.lto_priv.0> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_SERVER_ID, 4); 800a75c: | 2304 movs r3, #4 800a75e: | 2236 movs r2, #54 @ 0x36 800a760: | 4629 mov r1, r5 800a762: | f7fa f9d3 bl 8004b0c <dhcp_option.lto_priv.0> 800a766: | 4603 mov r3, r0 options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr)))); 800a768: | 69a0 ldr r0, [r4, #24] 800a76a: | f7fd fce3 bl 8008134 <lwip_htonl> 800a76e: | 4629 mov r1, r5 800a770: | 4602 mov r2, r0 800a772: | 4618 mov r0, r3 800a774: | f7fa fa36 bl 8004be4 <dhcp_option_long.lto_priv.0> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); 800a778: | 2303 movs r3, #3 800a77a: | 2237 movs r2, #55 @ 0x37 800a77c: | 4629 mov r1, r5 800a77e: | f7fa f9c5 bl 8004b0c <dhcp_option.lto_priv.0> 800a782: | f04f 0803 mov.w r8, #3 800a786: | f8ad 000e strh.w r0, [sp, #14] options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); 800a78a: | /-> f819 2b01 ldrb.w r2, [r9], #1 800a78e: | | f8bd 000e ldrh.w r0, [sp, #14] 800a792: | | 4629 mov r1, r5 800a794: | | f7fa f9e2 bl 8004b5c <dhcp_option_byte.lto_priv.0> for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { 800a798: | | f108 38ff add.w r8, r8, #4294967295 @ 0xffffffff 800a79c: | | f018 08ff ands.w r8, r8, #255 @ 0xff options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); 800a7a0: | | f8ad 000e strh.w r0, [sp, #14] for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { 800a7a4: | \-- d1f1 bne.n 800a78a <dhcp_select.isra.0+0xae> dhcp_option_trailer(options_out_len, msg_out->options, p_out); 800a7a6: | 4632 mov r2, r6 800a7a8: | 4629 mov r1, r5 800a7aa: | f7fa fad9 bl 8004d60 <dhcp_option_trailer.lto_priv.0> result = udp_sendto_if_src(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif, IP4_ADDR_ANY); 800a7ae: | 4b18 ldr r3, [pc, #96] @ (800a810 ) 800a7b0: | 4818 ldr r0, [pc, #96] @ (800a814 ) 800a7b2: | 9300 str r3, [sp, #0] 800a7b4: | 6800 ldr r0, [r0, #0] 800a7b6: | 4a18 ldr r2, [pc, #96] @ (800a818 ) 800a7b8: | 463b mov r3, r7 800a7ba: | 4631 mov r1, r6 800a7bc: | f7ff fec0 bl 800a540 <udp_sendto_if_src.constprop.0.isra.0> pbuf_free(p_out); 800a7c0: | 4630 mov r0, r6 800a7c2: | f7ff fafb bl 8009dbc <pbuf_free.isra.0> if (dhcp->tries < 255) { 800a7c6: \----> 79a3 ldrb r3, [r4, #6] 800a7c8: 2bff cmp r3, #255 @ 0xff dhcp->tries++; 800a7ca: bf1c itt ne 800a7cc: 3301 addne r3, #1 800a7ce: 71a3 strbne r3, [r4, #6] msecs = (u16_t)((dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000); 800a7d0: 79a2 ldrb r2, [r4, #6] 800a7d2: 2a05 cmp r2, #5 800a7d4: bf9f itttt ls 800a7d6: 2301 movls r3, #1 800a7d8: 4093 lslls r3, r2 800a7da: ebc3 1243 rsbls r2, r3, r3, lsl #5 800a7de: eb03 0382 addls.w r3, r3, r2, lsl #2 800a7e2: bf9a itte ls 800a7e4: 00db lslls r3, r3, #3 800a7e6: b29b uxthls r3, r3 800a7e8: f64e 2360 movwhi r3, #60000 @ 0xea60 dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); 800a7ec: f44f 72fa mov.w r2, #500 @ 0x1f4 800a7f0: f203 13f3 addw r3, r3, #499 @ 0x1f3 800a7f4: b29b uxth r3, r3 800a7f6: fbb3 f3f2 udiv r3, r3, r2 800a7fa: 8123 strh r3, [r4, #8] } 800a7fc: b005 add sp, #20 800a7fe: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} 800a802: bf00 nop 800a804: 200001b0 .word 0x200001b0 800a808: 0800d200 .word 0x0800d200 800a80c: 0800d223 .word 0x0800d223 800a810: 0800d32c .word 0x0800d32c 800a814: 2000126c .word 0x2000126c 800a818: 0800d354 .word 0x0800d354 800a81c: 0800d358 .word 0x0800d358 0800a820 : dhcp_reboot(struct netif *netif) 800a820: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr} struct dhcp *dhcp = netif_dhcp_data(netif); 800a824: 6a44 ldr r4, [r0, #36] @ 0x24 dhcp_reboot(struct netif *netif) 800a826: 4607 mov r7, r0 dhcp_set_state(dhcp, DHCP_STATE_REBOOTING); 800a828: 2103 movs r1, #3 800a82a: 4620 mov r0, r4 800a82c: f7fa f8e8 bl 8004a00 <dhcp_set_state.lto_priv.0> p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len); 800a830: f10d 0306 add.w r3, sp, #6 800a834: 2203 movs r2, #3 800a836: 4621 mov r1, r4 800a838: 4638 mov r0, r7 800a83a: f7fa f9ff bl 8004c3c <dhcp_create_msg.lto_priv.0> if (p_out != NULL) { 800a83e: 4606 mov r6, r0 800a840: 2800 cmp r0, #0 800a842: /----- d042 beq.n 800a8ca <dhcp_reboot.isra.0+0xaa> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); 800a844: | 6845 ldr r5, [r0, #4] 800a846: | f8bd 0006 ldrh.w r0, [sp, #6] 800a84a: | f8df 90c0 ldr.w r9, [pc, #192] @ 800a90c 800a84e: | 35f0 adds r5, #240 @ 0xf0 800a850: | 2302 movs r3, #2 800a852: | 2239 movs r2, #57 @ 0x39 800a854: | 4629 mov r1, r5 800a856: | f7fa f959 bl 8004b0c <dhcp_option.lto_priv.0> options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN_MIN_REQUIRED); 800a85a: | f44f 7210 mov.w r2, #576 @ 0x240 800a85e: | 4629 mov r1, r5 800a860: | f7fa f99c bl 8004b9c <dhcp_option_short.lto_priv.0> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4); 800a864: | 2304 movs r3, #4 800a866: | 2232 movs r2, #50 @ 0x32 800a868: | 4629 mov r1, r5 800a86a: | f7fa f94f bl 8004b0c <dhcp_option.lto_priv.0> 800a86e: | 4603 mov r3, r0 options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr))); 800a870: | 69e0 ldr r0, [r4, #28] 800a872: | f7fd fc5f bl 8008134 <lwip_htonl> 800a876: | 4629 mov r1, r5 800a878: | 4602 mov r2, r0 800a87a: | 4618 mov r0, r3 800a87c: | f7fa f9b2 bl 8004be4 <dhcp_option_long.lto_priv.0> options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); 800a880: | 2303 movs r3, #3 800a882: | 2237 movs r2, #55 @ 0x37 800a884: | 4629 mov r1, r5 800a886: | f7fa f941 bl 8004b0c <dhcp_option.lto_priv.0> 800a88a: | f04f 0803 mov.w r8, #3 800a88e: | f8ad 0006 strh.w r0, [sp, #6] options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); 800a892: | /-> f819 2b01 ldrb.w r2, [r9], #1 800a896: | | f8bd 0006 ldrh.w r0, [sp, #6] 800a89a: | | 4629 mov r1, r5 800a89c: | | f7fa f95e bl 8004b5c <dhcp_option_byte.lto_priv.0> for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { 800a8a0: | | f108 38ff add.w r8, r8, #4294967295 @ 0xffffffff 800a8a4: | | f018 08ff ands.w r8, r8, #255 @ 0xff options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); 800a8a8: | | f8ad 0006 strh.w r0, [sp, #6] for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { 800a8ac: | \-- d1f1 bne.n 800a892 <dhcp_reboot.isra.0+0x72> dhcp_option_trailer(options_out_len, msg_out->options, p_out); 800a8ae: | 4632 mov r2, r6 800a8b0: | 4629 mov r1, r5 800a8b2: | f7fa fa55 bl 8004d60 <dhcp_option_trailer.lto_priv.0> result = udp_sendto_if(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif); 800a8b6: | 4813 ldr r0, [pc, #76] @ (800a904 ) 800a8b8: | 4a13 ldr r2, [pc, #76] @ (800a908 ) 800a8ba: | 6800 ldr r0, [r0, #0] 800a8bc: | 463b mov r3, r7 800a8be: | 4631 mov r1, r6 800a8c0: | f7ff fedc bl 800a67c <udp_sendto_if.constprop.0.isra.0> pbuf_free(p_out); 800a8c4: | 4630 mov r0, r6 800a8c6: | f7ff fa79 bl 8009dbc <pbuf_free.isra.0> if (dhcp->tries < 255) { 800a8ca: \----> 79a3 ldrb r3, [r4, #6] 800a8cc: 2bff cmp r3, #255 @ 0xff dhcp->tries++; 800a8ce: bf1c itt ne 800a8d0: 3301 addne r3, #1 800a8d2: 71a3 strbne r3, [r4, #6] msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000); 800a8d4: 79a3 ldrb r3, [r4, #6] 800a8d6: 2b09 cmp r3, #9 800a8d8: bf9f itttt ls 800a8da: ebc3 1243 rsbls r2, r3, r3, lsl #5 800a8de: eb03 0382 addls.w r3, r3, r2, lsl #2 800a8e2: 00db lslls r3, r3, #3 800a8e4: b29b uxthls r3, r3 800a8e6: bf88 it hi 800a8e8: f242 7310 movwhi r3, #10000 @ 0x2710 dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); 800a8ec: f44f 72fa mov.w r2, #500 @ 0x1f4 800a8f0: f203 13f3 addw r3, r3, #499 @ 0x1f3 800a8f4: b29b uxth r3, r3 800a8f6: fbb3 f3f2 udiv r3, r3, r2 800a8fa: 8123 strh r3, [r4, #8] } 800a8fc: b003 add sp, #12 800a8fe: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} 800a902: bf00 nop 800a904: 2000126c .word 0x2000126c 800a908: 0800d354 .word 0x0800d354 800a90c: 0800d358 .word 0x0800d358 0800a910 : uint16_t usbd_ep_write_packet(usbd_device *usbd_dev, uint8_t addr, 800a910: b410 push {r4} return usbd_dev->driver->ep_write_packet(usbd_dev, addr, buf, len); 800a912: f8d0 40fc ldr.w r4, [r0, #252] @ 0xfc 800a916: 69e4 ldr r4, [r4, #28] 800a918: 46a4 mov ip, r4 } 800a91a: f85d 4b04 ldr.w r4, [sp], #4 return usbd_dev->driver->ep_write_packet(usbd_dev, addr, buf, len); 800a91e: 4760 bx ip 0800a920 : } /* * */ int main() 800a920: e92d 4880 stmdb sp!, {r7, fp, lr} 800a924: b0b3 sub sp, #204 @ 0xcc 800a926: af00 add r7, sp, #0 BGRT_INT_DIS(); 800a928: f3bf 8f4f dsb sy 800a92c: b672 cpsid i bgrt_xlist_init((bgrt_xlist_t *)vic); 800a92e: 4cd0 ldr r4, [pc, #832] @ (800ac70 ) BGRT_ASSERT(kblock, "The #kblock must not be NULL!"); #ifdef BGRT_CONFIG_USE_VIC bgrt_vic_init(&kblock->vic); #endif BGRT_ATM_INIT_ISR(&kblock->hpmap); BGRT_ATM_INIT_ISR(&kblock->lpmap); 800a930: 4626 mov r6, r4 BGRT_ATM_INIT_ISR(&kblock->hpmap); 800a932: 2500 movs r5, #0 800a934: 4620 mov r0, r4 800a936: f7fd fc95 bl 8008264 <bgrt_xlist_init> BGRT_ATM_INIT_ISR(&kblock->lpmap); 800a93a: f846 5f8c str.w r5, [r6, #140]! vic->prio = BGRT_PRIO_LOWEST + 1 ; /* ADLINT:SL:[W0165] signed/unsigned*/ 800a93e: 2320 movs r3, #32 800a940: f884 3084 strb.w r3, [r4, #132] @ 0x84 BGRT_ATM_INIT_ISR(&kblock->hpmap); 800a944: f8c4 5088 str.w r5, [r4, #136] @ 0x88 BGRT_ATM_BSET_ISR(&kblock->lpmap, BGRT_KBLOCK_VRESCH); 800a948: f3bf 8f5b dmb ish 800a94c: /-> e856 3f00 ldrex r3, [r6] 800a950: | f043 0304 orr.w r3, r3, #4 800a954: | e846 3200 strex r2, r3, [r6] 800a958: | 2a00 cmp r2, #0 800a95a: \-- d1f7 bne.n 800a94c <main.isra.0+0x2c> 800a95c: f3bf 8f5b dmb ish sched->ready = (bgrt_xlist_t *)sched->plst; 800a960: f104 009c add.w r0, r4, #156 @ 0x9c 800a964: f8c4 0094 str.w r0, [r4, #148] @ 0x94 bgrt_xlist_init(sched->ready); 800a968: f7fd fc7c bl 8008264 <bgrt_xlist_init> sched->expired = (bgrt_xlist_t *)sched->plst + 1; /* ADLINT:SL:[W0567] Int to pointer*/ 800a96c: f504 7090 add.w r0, r4, #288 @ 0x120 800a970: f8c4 0098 str.w r0, [r4, #152] @ 0x98 bgrt_xlist_init(sched->expired); 800a974: f7fd fc76 bl 8008264 <bgrt_xlist_init> sched->current_proc = (bgrt_proc_t *)0; /* ADLINT:SL:[W0567] Int to pointer*/ 800a978: f8c4 5090 str.w r5, [r4, #144] @ 0x90 sched->nested_crit_sec = (bgrt_cnt_t)0; 800a97c: f8c4 51a4 str.w r5, [r4, #420] @ 0x1a4 bgrt_kblock_init((bgrt_kblock_t *)&bgrt_kernel.kblock); bgrt_sched_init((bgrt_sched_t *)&bgrt_kernel.sched); #endif /*BGRT_CONFIG_MP*/ BGRT_SPIN_INIT(&bgrt_kernel.timer); BGRT_SPIN_LOCK(&bgrt_kernel.timer); bgrt_kernel.timer.val = (bgrt_tmr_t)0; 800a980: f8c4 51ac str.w r5, [r4, #428] @ 0x1ac bgrt_kernel.timer.tick = (void(*)(void))0; /* ADLINT:SL:[W0566,W0567] I know. */ 800a984: f8c4 51a8 str.w r5, [r4, #424] @ 0x1a8 __asm__ __volatile__ ( 800a988: 4dba ldr r5, [pc, #744] @ (800ac74 ) 800a98a: f385 8809 msr PSP, r5 800a98e: f3bf 8f4f dsb sy 800a992: f3bf 8f6f isb sy BGRT_SYS_SHPR3 |= (BGRT_CONFIG_SCHED_PRIO << (8 - BGRT_CONFIG_PRIO_BITS)) << 16; /* PendSV */ 800a996: 4bb8 ldr r3, [pc, #736] @ (800ac78 ) 800a998: 7eda ldrb r2, [r3, #27] 800a99a: b2d2 uxtb r2, r2 800a99c: 76da strb r2, [r3, #27] BGRT_SYS_SHPR3 |= (BGRT_CONFIG_SCHED_PRIO << (8 - BGRT_CONFIG_PRIO_BITS)) << 24; /* SysTick */ 800a99e: 7eda ldrb r2, [r3, #27] 800a9a0: b2d2 uxtb r2, r2 800a9a2: 76da strb r2, [r3, #27] break; case RCC_HSE: RCC_CR |= RCC_CR_HSEON; break; case RCC_HSI: RCC_CR |= RCC_CR_HSION; 800a9a4: 4bb5 ldr r3, [pc, #724] @ (800ac7c ) 800a9a6: f8d3 2800 ldr.w r2, [r3, #2048] @ 0x800 800a9aa: f042 0201 orr.w r2, r2, #1 800a9ae: f8c3 2800 str.w r2, [r3, #2048] @ 0x800 return RCC_CR & RCC_CR_HSIRDY; 800a9b2: /-> f8d3 2800 ldr.w r2, [r3, #2048] @ 0x800 while (!rcc_is_osc_ready(osc)); 800a9b6: | 0790 lsls r0, r2, #30 800a9b8: \-- d5fb bpl.n 800a9b2 <main.isra.0+0x92> void rcc_set_sysclk_source(uint32_t clk) { uint32_t reg32; reg32 = RCC_CFGR; 800a9ba: f8d3 2808 ldr.w r2, [r3, #2056] @ 0x808 reg32 &= ~((1 << 1) | (1 << 0)); 800a9be: f022 0203 bic.w r2, r2, #3 RCC_CFGR = (reg32 | clk); 800a9c2: f8c3 2808 str.w r2, [r3, #2056] @ 0x808 RCC_CR |= RCC_CR_HSEON; 800a9c6: f8d3 2800 ldr.w r2, [r3, #2048] @ 0x800 800a9ca: f442 3280 orr.w r2, r2, #65536 @ 0x10000 800a9ce: f8c3 2800 str.w r2, [r3, #2048] @ 0x800 return RCC_CR & RCC_CR_HSERDY; 800a9d2: 4baa ldr r3, [pc, #680] @ (800ac7c ) 800a9d4: /-> f8d3 2800 ldr.w r2, [r3, #2048] @ 0x800 while (!rcc_is_osc_ready(osc)); 800a9d8: | 0391 lsls r1, r2, #14 800a9da: \-- d5fb bpl.n 800a9d4 <main.isra.0+0xb4> 800a9dc: f8d3 2840 ldr.w r2, [r3, #2112] @ 0x840 /**@{*/ void pwr_set_vos_scale(enum pwr_vos_scale scale) { uint32_t reg32; reg32 = PWR_CR & ~(PWR_CR_VOS_MASK << PWR_CR_VOS_SHIFT); 800a9e0: 49a7 ldr r1, [pc, #668] @ (800ac80 ) 800a9e2: f042 5280 orr.w r2, r2, #268435456 @ 0x10000000 800a9e6: f8c3 2840 str.w r2, [r3, #2112] @ 0x840 800a9ea: 680a ldr r2, [r1, #0] reg32 |= (scale & PWR_CR_VOS_MASK) << PWR_CR_VOS_SHIFT; 800a9ec: f442 4240 orr.w r2, r2, #49152 @ 0xc000 PWR_CR = reg32; 800a9f0: 600a str r2, [r1, #0] void rcc_set_hpre(uint32_t hpre) { uint32_t reg32; reg32 = RCC_CFGR; 800a9f2: f8d3 2808 ldr.w r2, [r3, #2056] @ 0x808 reg32 &= ~((1 << 4) | (1 << 5) | (1 << 6) | (1 << 7)); 800a9f6: f022 02f0 bic.w r2, r2, #240 @ 0xf0 RCC_CFGR = (reg32 | (hpre << 4)); 800a9fa: f8c3 2808 str.w r2, [r3, #2056] @ 0x808 reg32 = RCC_CFGR; 800a9fe: f8d3 2808 ldr.w r2, [r3, #2056] @ 0x808 reg32 &= ~((1 << 10) | (1 << 11) | (1 << 12)); 800aa02: f422 52e0 bic.w r2, r2, #7168 @ 0x1c00 RCC_CFGR = (reg32 | (ppre1 << 10)); 800aa06: f442 52a0 orr.w r2, r2, #5120 @ 0x1400 800aa0a: f8c3 2808 str.w r2, [r3, #2056] @ 0x808 reg32 = RCC_CFGR; 800aa0e: f8d3 2808 ldr.w r2, [r3, #2056] @ 0x808 reg32 &= ~((1 << 13) | (1 << 14) | (1 << 15)); 800aa12: f422 4260 bic.w r2, r2, #57344 @ 0xe000 RCC_CFGR = (reg32 | (ppre2 << 13)); 800aa16: f442 4200 orr.w r2, r2, #32768 @ 0x8000 800aa1a: f8c3 2808 str.w r2, [r3, #2056] @ 0x808 RCC_CR &= ~RCC_CR_PLLON; 800aa1e: f8d3 2800 ldr.w r2, [r3, #2048] @ 0x800 800aa22: f022 7280 bic.w r2, r2, #16777216 @ 0x1000000 800aa26: f8c3 2800 str.w r2, [r3, #2048] @ 0x800 { /* Use reset value if not legal, for parts without pllr */ if (pllr < 2) { pllr = 2; } RCC_PLLCFGR = RCC_PLLCFGR_PLLSRC | /* HSE */ 800aa2a: 4a96 ldr r2, [pc, #600] @ (800ac84 ) 800aa2c: f8c3 2804 str.w r2, [r3, #2052] @ 0x804 RCC_CR |= RCC_CR_PLLON; 800aa30: f8d3 2800 ldr.w r2, [r3, #2048] @ 0x800 800aa34: f042 7280 orr.w r2, r2, #16777216 @ 0x1000000 800aa38: f8c3 2800 str.w r2, [r3, #2048] @ 0x800 return RCC_CR & RCC_CR_PLLRDY; 800aa3c: 4b8f ldr r3, [pc, #572] @ (800ac7c ) 800aa3e: /-> f8d3 2800 ldr.w r2, [r3, #2048] @ 0x800 while (!rcc_is_osc_ready(osc)); 800aa42: | 0192 lsls r2, r2, #6 800aa44: \-- d5fb bpl.n 800aa3e <main.isra.0+0x11e> #include #include void flash_dcache_enable(void) { FLASH_ACR |= FLASH_ACR_DCEN; 800aa46: f8d3 2c00 ldr.w r2, [r3, #3072] @ 0xc00 800aa4a: f442 6280 orr.w r2, r2, #1024 @ 0x400 800aa4e: f8c3 2c00 str.w r2, [r3, #3072] @ 0xc00 FLASH_ACR &= ~FLASH_ACR_DCEN; } void flash_icache_enable(void) { FLASH_ACR |= FLASH_ACR_ICEN; 800aa52: f8d3 2c00 ldr.w r2, [r3, #3072] @ 0xc00 800aa56: f442 7200 orr.w r2, r2, #512 @ 0x200 800aa5a: f8c3 2c00 str.w r2, [r3, #3072] @ 0xc00 void flash_set_ws(uint32_t ws) { uint32_t reg32; reg32 = FLASH_ACR; 800aa5e: f8d3 2c00 ldr.w r2, [r3, #3072] @ 0xc00 reg32 &= ~(FLASH_ACR_LATENCY_MASK << FLASH_ACR_LATENCY_SHIFT); 800aa62: f022 020f bic.w r2, r2, #15 reg32 |= (ws << FLASH_ACR_LATENCY_SHIFT); 800aa66: f442 62c0 orr.w r2, r2, #1536 @ 0x600 800aa6a: f042 0205 orr.w r2, r2, #5 FLASH_ACR = reg32; 800aa6e: f8c3 2c00 str.w r2, [r3, #3072] @ 0xc00 reg32 = RCC_CFGR; 800aa72: f8d3 2808 ldr.w r2, [r3, #2056] @ 0x808 reg32 &= ~((1 << 1) | (1 << 0)); 800aa76: f022 0203 bic.w r2, r2, #3 RCC_CFGR = (reg32 | clk); 800aa7a: f042 0202 orr.w r2, r2, #2 800aa7e: f8c3 2808 str.w r2, [r3, #2056] @ 0x808 while (((RCC_CFGR >> RCC_CFGR_SWS_SHIFT) & RCC_CFGR_SWS_MASK) != 800aa82: 4b7e ldr r3, [pc, #504] @ (800ac7c ) 800aa84: /-> f8d3 2808 ldr.w r2, [r3, #2056] @ 0x808 800aa88: | f002 020c and.w r2, r2, #12 800aa8c: | 2a08 cmp r2, #8 800aa8e: \-- d1f9 bne.n 800aa84 <main.isra.0+0x164> /* Wait for PLL clock to be selected. */ rcc_wait_for_sysclk_status(RCC_PLL); /* Set the peripheral clock frequencies used. */ rcc_ahb_frequency = clock->ahb_frequency; 800aa90: 497d ldr r1, [pc, #500] @ (800ac88 ) 800aa92: 4a7e ldr r2, [pc, #504] @ (800ac8c ) 800aa94: 608a str r2, [r1, #8] RCC_CR &= ~RCC_CR_HSION; 800aa96: f8d3 1800 ldr.w r1, [r3, #2048] @ 0x800 systick_set_clocksource(STK_CSR_CLKSOURCE_AHB); systick_set_reload(rcc_ahb_frequency / 1000); systick_interrupt_enable(); systick_counter_enable(); gpio_mode_setup(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, 800aa9a: 487d ldr r0, [pc, #500] @ (800ac90 ) 800aa9c: f021 0101 bic.w r1, r1, #1 800aaa0: f8c3 1800 str.w r1, [r3, #2048] @ 0x800 800aaa4: f8d3 1830 ldr.w r1, [r3, #2096] @ 0x830 800aaa8: f041 0101 orr.w r1, r1, #1 800aaac: f8c3 1830 str.w r1, [r3, #2096] @ 0x830 800aab0: f8d3 1830 ldr.w r1, [r3, #2096] @ 0x830 800aab4: f041 0108 orr.w r1, r1, #8 800aab8: f8c3 1830 str.w r1, [r3, #2096] @ 0x830 * @param[in] clocksource uint8_t. Clock source from @ref systick_clksource. */ void systick_set_clocksource(uint8_t clocksource) { STK_CSR = (STK_CSR & ~STK_CSR_CLKSOURCE) | 800aabc: f04f 23e0 mov.w r3, #3758153728 @ 0xe000e000 { uint16_t i; uint32_t afrl, afrh; afrl = GPIO_AFRL(gpioport); afrh = GPIO_AFRH(gpioport); 800aac0: f04f 0900 mov.w r9, #0 800aac4: 6919 ldr r1, [r3, #16] 800aac6: f041 0104 orr.w r1, r1, #4 800aaca: 6119 str r1, [r3, #16] systick_set_reload(rcc_ahb_frequency / 1000); 800aacc: f44f 717a mov.w r1, #1000 @ 0x3e8 800aad0: fbb2 f2f1 udiv r2, r2, r1 STK_RVR = (value & STK_RVR_RELOAD); 800aad4: 615a str r2, [r3, #20] * */ void systick_interrupt_enable(void) { STK_CSR |= STK_CSR_TICKINT; 800aad6: 691a ldr r2, [r3, #16] 800aad8: f042 0202 orr.w r2, r2, #2 800aadc: 611a str r2, [r3, #16] * */ void systick_counter_enable(void) { STK_CSR |= STK_CSR_ENABLE; 800aade: 691a ldr r2, [r3, #16] 800aae0: f042 0201 orr.w r2, r2, #1 800aae4: 611a str r2, [r3, #16] gpio_mode_setup(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, 800aae6: 2101 movs r1, #1 800aae8: 2203 movs r2, #3 800aaea: f7fc ff00 bl 80078ee <gpio_mode_setup.constprop.0> GPIO0|GPIO1); /* DEBUG */ gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, 800aaee: 2102 movs r1, #2 800aaf0: f44f 52c0 mov.w r2, #6144 @ 0x1800 800aaf4: f7fc fefb bl 80078ee <gpio_mode_setup.constprop.0> afrl = GPIO_AFRL(gpioport); 800aaf8: f8d0 c020 ldr.w ip, [r0, #32] afrh = GPIO_AFRH(gpioport); 800aafc: 6a41 ldr r1, [r0, #36] @ 0x24 for (i = 8; i < 16; i++) { if (!((1 << i) & gpios)) { continue; } afrh &= ~GPIO_AFR_MASK(i - 8); afrh |= GPIO_AFR(i - 8, alt_func_num); 800aafe: f04f 0e0a mov.w lr, #10 afrh &= ~GPIO_AFR_MASK(i - 8); 800ab02: 200f movs r0, #15 if (!((1 << i) & gpios)) { 800ab04: /----> f109 0308 add.w r3, r9, #8 800ab08: | fa42 f303 asr.w r3, r2, r3 800ab0c: | 07db lsls r3, r3, #31 800ab0e: | /-- d508 bpl.n 800ab22 <main.isra.0+0x202> afrh &= ~GPIO_AFR_MASK(i - 8); 800ab10: | | ea4f 0389 mov.w r3, r9, lsl #2 800ab14: | | fa00 f803 lsl.w r8, r0, r3 800ab18: | | ea21 0108 bic.w r1, r1, r8 afrh |= GPIO_AFR(i - 8, alt_func_num); 800ab1c: | | fa0e f303 lsl.w r3, lr, r3 800ab20: | | 4319 orrs r1, r3 for (i = 8; i < 16; i++) { 800ab22: | \-> f109 0901 add.w r9, r9, #1 800ab26: | f1b9 0f08 cmp.w r9, #8 800ab2a: \----- d1eb bne.n 800ab04 <main.isra.0+0x1e4> } GPIO_AFRL(gpioport) = afrl; 800ab2c: 4b58 ldr r3, [pc, #352] @ (800ac90 ) GPIO11|GPIO12); /* USBFS */ gpio_set_af(GPIOA, GPIO_AF10, GPIO11|GPIO12); gpio_mode_setup(GPIOD, GPIO_MODE_OUTPUT, 800ab2e: 4859 ldr r0, [pc, #356] @ (800ac94 ) 800ab30: f8c3 c020 str.w ip, [r3, #32] 800ab34: f44f 4200 mov.w r2, #32768 @ 0x8000 GPIO_AFRH(gpioport) = afrh; 800ab38: 6259 str r1, [r3, #36] @ 0x24 800ab3a: 2101 movs r1, #1 800ab3c: f7fc fed7 bl 80078ee <gpio_mode_setup.constprop.0> usbd_dev = driver->init(); 800ab40: f7f5 fd60 bl 8000604 <stm32f107_usbd_init.lto_priv.0> usbd_dev->ctrl_buf_len = control_buffer_size; 800ab44: 2240 movs r2, #64 @ 0x40 800ab46: 8282 strh r2, [r0, #20] usbd_dev->user_callback_ctr[0][USB_TRANSACTION_SETUP] = 800ab48: 4a53 ldr r2, [pc, #332] @ (800ac98 ) 800ab4a: f8c0 2090 str.w r2, [r0, #144] @ 0x90 usbd_dev->user_callback_ctr[0][USB_TRANSACTION_OUT] = 800ab4e: 4a53 ldr r2, [pc, #332] @ (800ac9c ) usbd_dev->driver = driver; 800ab50: f8df a174 ldr.w sl, [pc, #372] @ 800acc8 usbd_dev->user_callback_ctr[0][USB_TRANSACTION_OUT] = 800ab54: f8c0 208c str.w r2, [r0, #140] @ 0x8c usbd_dev->user_callback_ctr[0][USB_TRANSACTION_IN] = 800ab58: 4a51 ldr r2, [pc, #324] @ (800aca0 ) 800ab5a: f8c0 2088 str.w r2, [r0, #136] @ 0x88 usbdev = usbd_init(&__usb_driver, &dev, configs, 800ab5e: 4a51 ldr r2, [pc, #324] @ (800aca4 ) vint->func = func; 800ab60: 4951 ldr r1, [pc, #324] @ (800aca8 ) usbd_dev->ctrl_buf = control_buffer; 800ab62: 6105 str r5, [r0, #16] usbd_dev->desc = dev; 800ab64: f10a 0334 add.w r3, sl, #52 @ 0x34 800ab68: 6003 str r3, [r0, #0] 800ab6a: 6010 str r0, [r2, #0] usbd_dev->config = conf; 800ab6c: 4b4f ldr r3, [pc, #316] @ (800acac ) usbd_dev->user_callback_set_config[i] = callback; 800ab6e: 4a50 ldr r2, [pc, #320] @ (800acb0 ) 800ab70: 6043 str r3, [r0, #4] 800ab72: f8c0 20e8 str.w r2, [r0, #232] @ 0xe8 usbd_dev->strings = strings; 800ab76: f10a 0348 add.w r3, sl, #72 @ 0x48 item->prev = item; 800ab7a: 4a4e ldr r2, [pc, #312] @ (800acb4 ) 800ab7c: 6083 str r3, [r0, #8] usbd_dev->extra_string_idx = 0; 800ab7e: f04f 0800 mov.w r8, #0 pitem->prio = prio; 800ab82: f04f 0b01 mov.w fp, #1 usbd_dev->num_strings = num_strings; 800ab86: 2303 movs r3, #3 800ab88: 60c3 str r3, [r0, #12] pitem->list = (bgrt_xlist_t *)0; /* ADLINT:SL:[W0567] Int to pointer*/ 800ab8a: f8c2 8008 str.w r8, [r2, #8] vint->arg = arg; 800ab8e: e9c2 1004 strd r1, r0, [r2, #16] pitem->prio = prio; 800ab92: f882 b00c strb.w fp, [r2, #12] item->next = item; 800ab96: e9c2 2200 strd r2, r2, [r2] NVIC_ISER(irqn / 32) = (1 << (irqn % 32)); 800ab9a: f04f 22e0 mov.w r2, #3758153728 @ 0xe000e000 GPIO_PUPD_NONE, GPIO15); /* BLUE LED */ usb_init(); idle_stack = alloca(BGRT_PROC_STACK_SIZE * sizeof(bgrt_stack_t)); 800ab9e: f5ad 7d00 sub.w sp, sp, #512 @ 0x200 usbd_dev->extra_string = NULL; 800aba2: e9c0 8840 strd r8, r8, [r0, #256] @ 0x100 usbd_dev->user_callback_set_config[i] = NULL; 800aba6: e9c0 883b strd r8, r8, [r0, #236] @ 0xec usbd_dev->driver = driver; 800abaa: f8c0 a0fc str.w sl, [r0, #252] @ 0xfc usbd_dev->user_callback_set_config[i] = NULL; 800abae: f8c0 80f4 str.w r8, [r0, #244] @ 0xf4 bgrt_pitem_init((bgrt_pitem_t *)proc, prio); 800abb2: 211f movs r1, #31 800abb4: f8c2 9108 str.w r9, [r2, #264] @ 0x108 800abb8: 4638 mov r0, r7 800abba: f7fc ff33 bl 8007a24 <bgrt_pitem_init> 800abbe: 466d mov r5, sp 800abc0: 4641 mov r1, r8 800abc2: 2280 movs r2, #128 @ 0x80 800abc4: f107 0014 add.w r0, r7, #20 pcounter->map = (bgrt_map_t)0; 800abc8: f8c7 8094 str.w r8, [r7, #148] @ 0x94 pcounter->counter[p] = (bgrt_cnt_t)0; /* ADLINT:SL:[W0705] Out of range access!*/ 800abcc: f000 f982 bl 800aed4 <memset> proc->pmain = pmain; 800abd0: 4939 ldr r1, [pc, #228] @ (800acb8 ) 800abd2: f8c7 10a8 str.w r1, [r7, #168] @ 0xa8 bgrt_proc_init_cs(&idle_proc, &idle, &idle_cb, &idle_cb, 800abd6: f505 70fe add.w r0, r5, #508 @ 0x1fc proc->sstart = sstart; 800abda: f8c7 00b8 str.w r0, [r7, #184] @ 0xb8 *sstart = (bgrt_stack_t)0x01000000; /* psr */ 800abde: f04f 7080 mov.w r0, #16777216 @ 0x1000000 *(--sstart) = (bgrt_stack_t)pmain; /* pc !!! pmain !!! */ 800abe2: e9c5 107e strd r1, r0, [r5, #504] @ 0x1f8 *(--sstart) = (bgrt_stack_t)return_address; /* lr !!! return_address !!! */ 800abe6: 4935 ldr r1, [pc, #212] @ (800acbc ) 800abe8: f8c5 11f4 str.w r1, [r5, #500] @ 0x1f4 *(--sstart) = (bgrt_stack_t)0x03; /* r3 */ 800abec: 2303 movs r3, #3 800abee: 2112 movs r1, #18 800abf0: e9c5 317b strd r3, r1, [r5, #492] @ 0x1ec proc->flags = (is_rt)?(BGRT_PROC_FLG_RT|BGRT_PROC_FLG_RR):(BGRT_PROC_FLG_RR); /* Default behavior is round robin scheduling*/ 800abf4: f44f 52fa mov.w r2, #8000 @ 0x1f40 *(--sstart) = (bgrt_stack_t)0x11; /* r11 */ 800abf8: 2311 movs r3, #17 800abfa: f06f 0002 mvn.w r0, #2 800abfe: e9c5 3076 strd r3, r0, [r5, #472] @ 0x1d8 800ac02: 823a strh r2, [r7, #16] *(--sstart) = (bgrt_stack_t)0x09; /* r9 */ 800ac04: f04f 0c10 mov.w ip, #16 proc->sv_hook = sv_hook; 800ac08: 4a2d ldr r2, [pc, #180] @ (800acc0 ) *(--sstart) = (bgrt_stack_t)0x08; /* r8 */ 800ac0a: f8c5 91cc str.w r9, [r5, #460] @ 0x1cc *(--sstart) = (bgrt_stack_t)0x09; /* r9 */ 800ac0e: 2309 movs r3, #9 800ac10: e9c5 3c74 strd r3, ip, [r5, #464] @ 0x1d0 *(--sstart) = (bgrt_stack_t)0x06; /* r6 */ 800ac14: f04f 0e07 mov.w lr, #7 800ac18: 2306 movs r3, #6 800ac1a: e9c5 3e71 strd r3, lr, [r5, #452] @ 0x1c4 proc->rs_hook = rs_hook; 800ac1e: e9c7 222b strd r2, r2, [r7, #172] @ 0xac *(--sstart) = (bgrt_stack_t)0x02; /* r2 */ 800ac22: 2102 movs r1, #2 proc->arg = arg; 800ac24: 4a27 ldr r2, [pc, #156] @ (800acc4 ) *(--sstart) = (bgrt_stack_t)arg; /* r0 !!! arg !!! */ 800ac26: f8c5 21e0 str.w r2, [r5, #480] @ 0x1e0 *(--sstart) = (bgrt_stack_t)0x04; /* r4 */ 800ac2a: 2304 movs r3, #4 800ac2c: f04f 0905 mov.w r9, #5 800ac30: e9c5 396f strd r3, r9, [r5, #444] @ 0x1bc *(--sstart) = (bgrt_stack_t)0x01; /* r1 */ 800ac34: e9c5 b179 strd fp, r1, [r5, #484] @ 0x1e4 BGRT_USPD_INIT(proc); /* ADLINT:SL:[W0567,W0425] Int to pointer, multiline macro*/ 800ac38: 2315 movs r3, #21 *(--sstart) = (bgrt_stack_t)0x04; /* r4 */ 800ac3a: f505 75de add.w r5, r5, #444 @ 0x1bc bgrt_sched_proc_run(proc, BGRT_PROC_STATE_READY); 800ac3e: 4638 mov r0, r7 proc->time_quant = time_quant; 800ac40: f8c7 b098 str.w fp, [r7, #152] @ 0x98 proc->cnt_lock = (bgrt_cnt_t)0; 800ac44: e9c7 8828 strd r8, r8, [r7, #160] @ 0xa0 proc->timer = time_quant; 800ac48: f8c7 b09c str.w fp, [r7, #156] @ 0x9c BGRT_USPD_INIT(proc); /* ADLINT:SL:[W0567,W0425] Int to pointer, multiline macro*/ 800ac4c: e9c7 582f strd r5, r8, [r7, #188] @ 0xbc proc->arg = arg; 800ac50: f8c7 20b4 str.w r2, [r7, #180] @ 0xb4 BGRT_USPD_INIT(proc); /* ADLINT:SL:[W0567,W0425] Int to pointer, multiline macro*/ 800ac54: f887 30c4 strb.w r3, [r7, #196] @ 0xc4 bgrt_sched_proc_run(proc, BGRT_PROC_STATE_READY); 800ac58: f7fd fc40 bl 80084dc <bgrt_sched_proc_run> BGRT_INT_ENA(); 800ac5c: f3bf 8f4f dsb sy 800ac60: b662 cpsie i 800ac62: f3bf 8f6f isb sy bgrt_pitem_t * work; BGRT_ASSERT(vic, "The #vic must not be NULL!"); /*Everything is done on local CPU core, just disable interrupts.*/ BGRT_VINT_CS_START(); /*Get list head*/ work = (bgrt_pitem_t *)bgrt_xlist_head((bgrt_xlist_t *)vic); 800ac66: f8df 8008 ldr.w r8, [pc, #8] @ 800ac70 bgrt_atm_bset(&kblock->lpmap, BGRT_KBLOCK_VRESCH); /* ADLINT:SL:[W0109] KBLOCK*/ 800ac6a: f108 098c add.w r9, r8, #140 @ 0x8c 800ac6e: /----------------------- e02d b.n 800accc <main.isra.0+0x3ac> 800ac70: | 200001b0 .word 0x200001b0 800ac74: | 2000818c .word 0x2000818c 800ac78: | e000ed00 .word 0xe000ed00 800ac7c: | 40023000 .word 0x40023000 800ac80: | 40007000 .word 0x40007000 800ac84: | 27405408 .word 0x27405408 800ac88: | 20000050 .word 0x20000050 800ac8c: | 0a037a00 .word 0x0a037a00 800ac90: | 40020000 .word 0x40020000 800ac94: | 40020c00 .word 0x40020c00 800ac98: | 08000dc9 .word 0x08000dc9 800ac9c: | 08000e25 .word 0x08000e25 800aca0: | 08000d0b .word 0x08000d0b 800aca4: | 20000060 .word 0x20000060 800aca8: | 08000221 .word 0x08000221 800acac: | 2000005c .word 0x2000005c 800acb0: | 080001ad .word 0x080001ad 800acb4: | 20000198 .word 0x20000198 800acb8: | 080021f9 .word 0x080021f9 800acbc: | 08007d89 .word 0x08007d89 800acc0: | 0800023d .word 0x0800023d 800acc4: | 200081cc .word 0x200081cc 800acc8: | 0800d4a8 .word 0x0800d4a8 bgrt_prio_t lprio; bgrt_vint_t * work; BGRT_ASSERT(vic, "The #vic must not be NULL!"); lprio = vic->prio; 800accc: >----------------------> f894 5084 ldrb.w r5, [r4, #132] @ 0x84 BGRT_VINT_CS_START(); 800acd0: | f04f 00f0 mov.w r0, #240 @ 0xf0 800acd4: | f380 8811 msr BASEPRI, r0 800acd8: | f3bf 8f4f dsb sy 800acdc: | f3bf 8f6f isb sy work = (bgrt_pitem_t *)bgrt_xlist_head((bgrt_xlist_t *)vic); 800ace0: | 4640 mov r0, r8 800ace2: | f7fc ffab bl 8007c3c <bgrt_xlist_head> if (work) 800ace6: | 4683 mov fp, r0 800ace8: | /----------------- b120 cbz r0, 800acf4 <main.isra.0+0x3d4> if (work->prio < lprio) 800acea: | | 7b03 ldrb r3, [r0, #12] 800acec: | | 42ab cmp r3, r5 800acee: | | /-------------- d22a bcs.n 800ad46 <main.isra.0+0x426> bgrt_pitem_cut(work); 800acf0: | | | f7fc ff50 bl 8007b94 <bgrt_pitem_cut> BGRT_VINT_CS_END(); 800acf4: | >--|-------------> f04f 0000 mov.w r0, #0 800acf8: | | | f380 8811 msr BASEPRI, r0 800acfc: | | | f3bf 8f4f dsb sy 800ad00: | | | f3bf 8f6f isb sy work = _vint_pop(vic,lprio); /*Is there any work?*/ if (work) 800ad04: | | | f1bb 0f00 cmp.w fp, #0 800ad08: | | | /-------- d120 bne.n 800ad4c <main.isra.0+0x42c> 800ad0a: | | | | f3bf 8f5b dmb ish 800ad0e: | | | | /-> e856 3f00 ldrex r3, [r6] 800ad12: | | | | | f023 0201 bic.w r2, r3, #1 800ad16: | | | | | e846 2100 strex r1, r2, [r6] 800ad1a: | | | | | 2900 cmp r1, #0 800ad1c: | | | | \-- d1f7 bne.n 800ad0e <main.isra.0+0x3ee> 800ad1e: | | | | f3bf 8f5b dmb ish if (bgrt_atm_bclr(&kblock->lpmap, BGRT_KBLOCK_VSCALL)) 800ad22: | | | | 07d9 lsls r1, r3, #31 800ad24: | | | /--|-------- d529 bpl.n 800ad7a <main.isra.0+0x45a> return BGRT_CURR_PROC; 800ad26: | | | | | f8d4 5090 ldr.w r5, [r4, #144] @ 0x90 scret = bgrt_priv_do_syscall(uspd->scnum, uspd->scarg); 800ad2a: | | | | | f895 20c4 ldrb.w r2, [r5, #196] @ 0xc4 800ad2e: | | | | | f8d5 00c0 ldr.w r0, [r5, #192] @ 0xc0 if (BGRT_SYSCALL_CHECK(syscall_num, syscall_arg)) 800ad32: | | | | | 2a14 cmp r2, #20 800ad34: | | | | | b2d3 uxtb r3, r2 800ad36: | | | | | /-- d917 bls.n 800ad68 <main.isra.0+0x448> uspd->scret = scret; 800ad38: | | | | | | 2308 movs r3, #8 800ad3a: | | | | | | f885 30c5 strb.w r3, [r5, #197] @ 0xc5 uspd->scnum = BGRT_SC_ENUM_END; 800ad3e: | | | | | /--|-> 2315 movs r3, #21 800ad40: | | | | | | | f885 30c4 strb.w r3, [r5, #196] @ 0xc4 800ad44: +-----|--|--|--|--|--|-- e7c2 b.n 800accc <main.isra.0+0x3ac> work = (bgrt_pitem_t *)bgrt_xlist_head((bgrt_xlist_t *)vic); 800ad46: | | \--|--|--|--|-> f04f 0b00 mov.w fp, #0 800ad4a: | \-----|--|--|--|-- e7d3 b.n 800acf4 <main.isra.0+0x3d4> { /*func is used twice, so...*/ bgrt_code_t func; func = work->func; 800ad4c: | | \--|--|-> f8db 3010 ldr.w r3, [fp, #16] /*Is it valid?*/ if (func) 800ad50: | | | | 2b00 cmp r3, #0 800ad52: +-----------|-----|--|-- d0bb beq.n 800accc <main.isra.0+0x3ac> { /*Remember current priority*/ vic->prio = ((bgrt_pitem_t *)work)->prio; 800ad54: | | | | f89b 200c ldrb.w r2, [fp, #12] 800ad58: | | | | f884 2084 strb.w r2, [r4, #132] @ 0x84 /*Do work.*/ func(work->arg); 800ad5c: | | | | f8db 0014 ldr.w r0, [fp, #20] 800ad60: | | | | 4798 blx r3 /*A work is done, remind last priority.*/ vic->prio = lprio; 800ad62: | | | | f884 5084 strb.w r5, [r4, #132] @ 0x84 800ad66: +-----------|-----|--|-- e7b1 b.n 800accc <main.isra.0+0x3ac> return (BGRT_SC_TBL_READ(syscall_handler[syscall_num]))(syscall_arg); /* ADLINT:SL:[W0147,W0644] type conversion,void val */ 800ad68: | | | \-> eb0a 0383 add.w r3, sl, r3, lsl #2 800ad6c: | | | 6d5b ldr r3, [r3, #84] @ 0x54 800ad6e: | | | 4798 blx r3 if (BGRT_ST_ROLL != scret) 800ad70: | | | 2809 cmp r0, #9 uspd->scret = scret; 800ad72: | | | f885 00c5 strb.w r0, [r5, #197] @ 0xc5 if (BGRT_ST_ROLL != scret) 800ad76: +-----------|-----|----- d0a9 beq.n 800accc <main.isra.0+0x3ac> 800ad78: | | \----- e7e1 b.n 800ad3e <main.isra.0+0x41e> 800ad7a: | \----------> f3bf 8f5b dmb ish 800ad7e: | /-> e856 3f00 ldrex r3, [r6] 800ad82: | | f023 0206 bic.w r2, r3, #6 800ad86: | | e846 2100 strex r1, r2, [r6] 800ad8a: | | 2900 cmp r1, #0 800ad8c: | \-- d1f7 bne.n 800ad7e <main.isra.0+0x45e> 800ad8e: | f3bf 8f5b dmb ish if (work) 800ad92: | f013 0f06 tst.w r3, #6 800ad96: | /-------------------- d07f beq.n 800ae98 <main.isra.0+0x578> if (is_periodic) 800ad98: | | 079a lsls r2, r3, #30 current_proc = sched->current_proc; 800ad9a: | | f8d4 5090 ldr.w r5, [r4, #144] @ 0x90 if (is_periodic) 800ad9e: | | /-------------- d56a bpl.n 800ae76 <main.isra.0+0x556> if (!current_proc) 800ada0: | | /--|-------------- b1c5 cbz r5, 800add4 <main.isra.0+0x4b4> if ((bgrt_xlist_t *)((bgrt_pitem_t *)current_proc)->list == sched->ready) 800ada2: | | | | f8d4 3094 ldr.w r3, [r4, #148] @ 0x94 800ada6: | | | | 68a8 ldr r0, [r5, #8] 800ada8: | | | | 4298 cmp r0, r3 800adaa: | | +--|-------------- d113 bne.n 800add4 <main.isra.0+0x4b4> current_proc->flags &= BGRT_PROC_STATE_CLEAR_RUN_MASK; 800adac: | | | | 7c2a ldrb r2, [r5, #16] 800adae: | | | | f022 0303 bic.w r3, r2, #3 current_proc->flags |= BGRT_PROC_STATE_READY; 800adb2: | | | | f043 0302 orr.w r3, r3, #2 800adb6: | | | | 742b strb r3, [r5, #16] if (current_proc->flags & BGRT_PROC_FLG_RR) 800adb8: | | | | 0653 lsls r3, r2, #25 800adba: | | | | /-- d502 bpl.n 800adc2 <main.isra.0+0x4a2> bgrt_xlist_switch(sched->ready, ((bgrt_pitem_t *)current_proc)->prio); 800adbc: | | | | | 7b29 ldrb r1, [r5, #12] 800adbe: | | | | | f7fc fdff bl 80079c0 <bgrt_xlist_switch> if (current_proc->timer > (bgrt_tmr_t)1) 800adc2: | | | | \-> f8d5 309c ldr.w r3, [r5, #156] @ 0x9c 800adc6: | | | | 2b01 cmp r3, #1 800adc8: | | | | /-------- d937 bls.n 800ae3a <main.isra.0+0x51a> current_proc->timer--;/*No! Decrement a process timer!*/ 800adca: | | | | | f8d5 309c ldr.w r3, [r5, #156] @ 0x9c 800adce: | | | | | 3b01 subs r3, #1 800add0: | | | | | f8c5 309c str.w r3, [r5, #156] @ 0x9c current_proc = sched->current_proc; 800add4: | | >--|-----|-------> f8d4 3090 ldr.w r3, [r4, #144] @ 0x90 if (current_proc) 800add8: | | | | | /-- b12b cbz r3, 800ade6 <main.isra.0+0x4c6> if (current_proc->sv_hook) 800adda: | | | | | | f8d3 20ac ldr.w r2, [r3, #172] @ 0xac 800adde: | | | | | +-- b112 cbz r2, 800ade6 <main.isra.0+0x4c6> current_proc->sv_hook(current_proc->arg); 800ade0: | | | | | | f8d3 00b4 ldr.w r0, [r3, #180] @ 0xb4 800ade4: | | | | | | 4790 blx r2 if ((bgrt_map_t)0 == sched->ready->map) 800ade6: | | | | | \-> f8d4 2094 ldr.w r2, [r4, #148] @ 0x94 800adea: | | | | | f8d2 3080 ldr.w r3, [r2, #128] @ 0x80 800adee: | | | | | /-- b92b cbnz r3, 800adfc <main.isra.0+0x4dc> sched->ready = sched->expired; 800adf0: | | | | | | f8d4 1098 ldr.w r1, [r4, #152] @ 0x98 sched->current_proc = (bgrt_proc_t *)0; /* ADLINT:SL:[W0567] Int to pointer*/ 800adf4: | | | | | | f8c4 3090 str.w r3, [r4, #144] @ 0x90 sched->expired = buf; 800adf8: | | | | | | e9c4 1225 strd r1, r2, [r4, #148] @ 0x94 if ((bgrt_map_t)0 == sched->ready->map) 800adfc: | | | | | \-> f8d4 0094 ldr.w r0, [r4, #148] @ 0x94 800ae00: | | | | | f8d0 3080 ldr.w r3, [r0, #128] @ 0x80 800ae04: | | | | | 2b00 cmp r3, #0 800ae06: | | | | /--|-------- d042 beq.n 800ae8e <main.isra.0+0x56e> current_proc = (bgrt_proc_t *)bgrt_xlist_head(sched->ready); /* Preemptive multitasking!*/ 800ae08: | | | | | | f7fc ff18 bl 8007c3c <bgrt_xlist_head> sched->current_proc = current_proc; 800ae0c: | | | | | | f8c4 0090 str.w r0, [r4, #144] @ 0x90 current_proc->flags &= BGRT_PROC_STATE_CLEAR_RUN_MASK; 800ae10: | | | | | | 7c03 ldrb r3, [r0, #16] 800ae12: | | | | | | f023 0303 bic.w r3, r3, #3 current_proc->flags |= BGRT_PROC_STATE_RUNNING; 800ae16: | | | | | | f043 0303 orr.w r3, r3, #3 800ae1a: | | | | | | 7403 strb r3, [r0, #16] if (current_proc->rs_hook) 800ae1c: | | | | | | f8d0 30b0 ldr.w r3, [r0, #176] @ 0xb0 800ae20: | | | | | | /-- b113 cbz r3, 800ae28 <main.isra.0+0x508> current_proc->rs_hook(current_proc->arg); 800ae22: | | | | | | | f8d0 00b4 ldr.w r0, [r0, #180] @ 0xb4 800ae26: | | | | | | | 4798 blx r3 800ae28: | | | | | | \-> f8d4 3090 ldr.w r3, [r4, #144] @ 0x90 if (BGRT_SC_ENUM_END != BGRT_GET_USPD()->scnum) /* ADLINT:SL:[W0422] Yes this code is unsafe!*/ 800ae2c: | | | | | | f893 30c4 ldrb.w r3, [r3, #196] @ 0xc4 800ae30: | | | | | | 2b15 cmp r3, #21 800ae32: +--|--|--|--|--|-------- f43f af4b beq.w 800accc <main.isra.0+0x3ac> bgrt_atm_bset(&kblock->lpmap, BGRT_KBLOCK_VSCALL); 800ae36: | | | | | | 2101 movs r1, #1 800ae38: | | | | | | /----- e02a b.n 800ae90 <main.isra.0+0x570> bgrt_pitem_fast_cut((bgrt_pitem_t *)current_proc); 800ae3a: | | | | | \--|----> 4628 mov r0, r5 800ae3c: | | | | | | f7fc fe20 bl 8007a80 <bgrt_pitem_fast_cut> if ( 800ae40: | | | | | | f995 3010 ldrsb.w r3, [r5, #16] flags = current_proc->flags; 800ae44: | | | | | | 7c2a ldrb r2, [r5, #16] if ( 800ae46: | | | | | | 2b00 cmp r3, #0 800ae48: | | | | | | /-- db09 blt.n 800ae5e <main.isra.0+0x53e> current_proc->timer = current_proc->time_quant; 800ae4a: | | | | | | | f8d5 3098 ldr.w r3, [r5, #152] @ 0x98 BGRT_SCHED_PROC_INSERT_EXPIRED(current_proc, BGRT_PROC_NEW_SCHED(current_proc)); 800ae4e: | | | | | | | f8d4 1098 ldr.w r1, [r4, #152] @ 0x98 current_proc->timer = current_proc->time_quant; 800ae52: | | | | | | | f8c5 309c str.w r3, [r5, #156] @ 0x9c BGRT_SCHED_PROC_INSERT_EXPIRED(current_proc, BGRT_PROC_NEW_SCHED(current_proc)); 800ae56: | | | | | | | 4628 mov r0, r5 800ae58: | | | | | | | f7fd fad2 bl 8008400 <bgrt_pitem_insert> 800ae5c: | | +--|--|-----|--|-- e7ba b.n 800add4 <main.isra.0+0x4b4> ((bgrt_pitem_t *)current_proc)->list = (void *)0; /* ADLINT:SL:[W0567] Int to pointer*/ 800ae5e: | | | | | | \-> 2300 movs r3, #0 BGRT_PROC_SET_STATE(current_proc, BGRT_PROC_NEW_STATE(flags)); /* ADLINT:SL:[W0447] coma operator*/ 800ae60: | | | | | | f012 0f20 tst.w r2, #32 ((bgrt_pitem_t *)current_proc)->list = (void *)0; /* ADLINT:SL:[W0567] Int to pointer*/ 800ae64: | | | | | | 60ab str r3, [r5, #8] BGRT_PROC_SET_STATE(current_proc, BGRT_PROC_NEW_STATE(flags)); /* ADLINT:SL:[W0447] coma operator*/ 800ae66: | | | | | | f002 03f0 and.w r3, r2, #240 @ 0xf0 800ae6a: | | | | | | bf0c ite eq 800ae6c: | | | | | | 2204 moveq r2, #4 800ae6e: | | | | | | 2205 movne r2, #5 800ae70: | | | | | | 4313 orrs r3, r2 current_proc->flags |= BGRT_PROC_STATE_READY; 800ae72: | | | | | | /-> 742b strb r3, [r5, #16] 800ae74: | | +--|--|-----|--|-- e7ae b.n 800add4 <main.isra.0+0x4b4> if (current_proc) 800ae76: | | | \--|-----|--|-> 2d00 cmp r5, #0 800ae78: | | +-----|-----|--|-- d0ac beq.n 800add4 <main.isra.0+0x4b4> if (BGRT_PROC_STATE_RUNNING == (current_proc->flags & BGRT_PROC_STATE_RUN_MASK)) 800ae7a: | | | | | | 7c2b ldrb r3, [r5, #16] 800ae7c: | | | | | | f003 0203 and.w r2, r3, #3 800ae80: | | | | | | 2a03 cmp r2, #3 800ae82: | | \-----|-----|--|-- d1a7 bne.n 800add4 <main.isra.0+0x4b4> current_proc->flags &= BGRT_PROC_STATE_CLEAR_RUN_MASK; 800ae84: | | | | | f023 0303 bic.w r3, r3, #3 current_proc->flags |= BGRT_PROC_STATE_READY; 800ae88: | | | | | f043 0302 orr.w r3, r3, #2 800ae8c: | | | | \-- e7f1 b.n 800ae72 <main.isra.0+0x552> bgrt_atm_bset(&kblock->lpmap, BGRT_KBLOCK_VRESCH); /* ADLINT:SL:[W0109] KBLOCK*/ 800ae8e: | | \-----|----> 2104 movs r1, #4 bgrt_atm_bset(&kblock->lpmap, BGRT_KBLOCK_VSCALL); 800ae90: | | \----> 4648 mov r0, r9 800ae92: | | f7f6 f9f5 bl 8001280 <bgrt_atm_bset.lto_priv.0.lto_priv.0> 800ae96: +--|-------------------- e719 b.n 800accc <main.isra.0+0x3ac> BGRT_INT_LOCK(); 800ae98: | \-------------------> f04f 00f0 mov.w r0, #240 @ 0xf0 800ae9c: | f380 8811 msr BASEPRI, r0 800aea0: | f3bf 8f4f dsb sy 800aea4: | f3bf 8f6f isb sy kernel_mode = (bgrt_bool_t)0; 800aea8: | 4b09 ldr r3, [pc, #36] @ (800aed0 ) BGRT_SYS_ICSR |= BGRT_PENDSV_SET; 800aeaa: | f04f 22e0 mov.w r2, #3758153728 @ 0xe000e000 kernel_mode = (bgrt_bool_t)0; 800aeae: | f883 b004 strb.w fp, [r3, #4] BGRT_SYS_ICSR |= BGRT_PENDSV_SET; 800aeb2: | f8d2 3d04 ldr.w r3, [r2, #3332] @ 0xd04 800aeb6: | f043 5380 orr.w r3, r3, #268435456 @ 0x10000000 800aeba: | f8c2 3d04 str.w r3, [r2, #3332] @ 0xd04 BGRT_INT_FREE(); 800aebe: | f04f 0000 mov.w r0, #0 800aec2: | f380 8811 msr BASEPRI, r0 800aec6: | f3bf 8f4f dsb sy 800aeca: | f3bf 8f6f isb sy } 800aece: \----------------------- e6fd b.n 800accc <main.isra.0+0x3ac> 800aed0: 20000050 .word 0x20000050 0800aed4 : 800aed4: 0783 lsls r3, r0, #30 800aed6: b530 push {r4, r5, lr} 800aed8: /----------------------- d047 beq.n 800af6a <memset+0x96> 800aeda: | 1e54 subs r4, r2, #1 800aedc: | 2a00 cmp r2, #0 800aede: | /-------------------- d03e beq.n 800af5e <memset+0x8a> 800aee0: | | b2ca uxtb r2, r1 800aee2: | | 4603 mov r3, r0 800aee4: | | /-- e001 b.n 800aeea <memset+0x16> 800aee6: | | /--|-> 3c01 subs r4, #1 800aee8: | +--------------|--|-- d339 bcc.n 800af5e <memset+0x8a> 800aeea: | | | \-> f803 2b01 strb.w r2, [r3], #1 800aeee: | | | 079d lsls r5, r3, #30 800aef0: | | \----- d1f9 bne.n 800aee6 <memset+0x12> 800aef2: | | /----------------> 2c03 cmp r4, #3 800aef4: | | | /----- d92c bls.n 800af50 <memset+0x7c> 800aef6: | | | | b2cd uxtb r5, r1 800aef8: | | | | eb05 2505 add.w r5, r5, r5, lsl #8 800aefc: | | | | 2c0f cmp r4, #15 800aefe: | | | | eb05 4505 add.w r5, r5, r5, lsl #16 800af02: | | | /--------|----- d935 bls.n 800af70 <memset+0x9c> 800af04: | | | | | f1a4 0210 sub.w r2, r4, #16 800af08: | | | | | f022 0c0f bic.w ip, r2, #15 800af0c: | | | | | f103 0e10 add.w lr, r3, #16 800af10: | | | | | 44e6 add lr, ip 800af12: | | | | | ea4f 1c12 mov.w ip, r2, lsr #4 800af16: | | | | | 461a mov r2, r3 800af18: | | | | | /-> e9c2 5500 strd r5, r5, [r2] 800af1c: | | | | | | e9c2 5502 strd r5, r5, [r2, #8] 800af20: | | | | | | 3210 adds r2, #16 800af22: | | | | | | 4572 cmp r2, lr 800af24: | | | | | \-- d1f8 bne.n 800af18 <memset+0x44> 800af26: | | | | | f10c 0201 add.w r2, ip, #1 800af2a: | | | | | f014 0f0c tst.w r4, #12 800af2e: | | | | | eb03 1202 add.w r2, r3, r2, lsl #4 800af32: | | | | | f004 0c0f and.w ip, r4, #15 800af36: | | | | /--|----- d013 beq.n 800af60 <memset+0x8c> 800af38: | | | | /--|--|----> f1ac 0304 sub.w r3, ip, #4 800af3c: | | | | | | | f023 0303 bic.w r3, r3, #3 800af40: | | | | | | | 3304 adds r3, #4 800af42: | | | | | | | 4413 add r3, r2 800af44: | | | | | | | /-> f842 5b04 str.w r5, [r2], #4 800af48: | | | | | | | | 4293 cmp r3, r2 800af4a: | | | | | | | \-- d1fb bne.n 800af44 <memset+0x70> 800af4c: | | | | | | | f00c 0403 and.w r4, ip, #3 800af50: | +--|--|--|--|--\----X b12c cbz r4, 800af5e <memset+0x8a> 800af52: | | | | | | /----> b2c9 uxtb r1, r1 800af54: | | | | | | | 441c add r4, r3 800af56: | | | | | | | /-> f803 1b01 strb.w r1, [r3], #1 800af5a: | | | | | | | | 42a3 cmp r3, r4 800af5c: | | | | | | | \-- d1fb bne.n 800af56 <memset+0x82> 800af5e: | >--|--|--|--|--|----> bd30 pop {r4, r5, pc} 800af60: | | | | | \--|----> 4664 mov r4, ip 800af62: | | | | | | 4613 mov r3, r2 800af64: | | | | | | 2c00 cmp r4, #0 800af66: | | | | | \----- d1f4 bne.n 800af52 <memset+0x7e> 800af68: | \--|--|--|----------- e7f9 b.n 800af5e <memset+0x8a> 800af6a: \-----|--|--|----------> 4603 mov r3, r0 800af6c: | | | 4614 mov r4, r2 800af6e: \--|--|----------- e7c0 b.n 800aef2 <memset+0x1e> 800af70: \--|----------> 461a mov r2, r3 800af72: | 46a4 mov ip, r4 800af74: \----------- e7e0 b.n 800af38 <memset+0x64> 800af76: bf00 nop 0800af78 : 800af78: 2a03 cmp r2, #3 800af7a: b430 push {r4, r5} 800af7c: /----------------- d915 bls.n 800afaa <memcmp+0x32> 800af7e: | ea41 0400 orr.w r4, r1, r0 800af82: | 07a4 lsls r4, r4, #30 800af84: | 4684 mov ip, r0 800af86: | 460b mov r3, r1 800af88: | /-- d004 beq.n 800af94 <memcmp+0x1c> 800af8a: | /--------|-> 1e54 subs r4, r2, #1 800af8c: | /--|--------|-- e00f b.n 800afae <memcmp+0x36> 800af8e: | | | /--|-> 3a04 subs r2, #4 800af90: | | | | | 2a03 cmp r2, #3 800af92: | | | /--|--|-- d908 bls.n 800afa6 <memcmp+0x2e> 800af94: | | | | | \-> 4619 mov r1, r3 800af96: | | | | | 4660 mov r0, ip 800af98: | | | | | f853 4b04 ldr.w r4, [r3], #4 800af9c: | | | | | f85c 5b04 ldr.w r5, [ip], #4 800afa0: | | | | | 42a5 cmp r5, r4 800afa2: | | | | \----- d0f4 beq.n 800af8e <memcmp+0x16> 800afa4: | | \--|-------- e7f1 b.n 800af8a <memcmp+0x12> 800afa6: | | \-------> 4660 mov r0, ip 800afa8: | | 4619 mov r1, r3 800afaa: \--|-------------> 1e54 subs r4, r2, #1 800afac: | /-------- b17a cbz r2, 800afce <memcmp+0x56> 800afae: \-----|-------> 1e43 subs r3, r0, #1 800afb0: | 3901 subs r1, #1 800afb2: | 1902 adds r2, r0, r4 800afb4: | /-- e001 b.n 800afba <memcmp+0x42> 800afb6: | /--|-> 429a cmp r2, r3 800afb8: +--|--|-- d009 beq.n 800afce <memcmp+0x56> 800afba: | | \-> f813 0f01 ldrb.w r0, [r3, #1]! 800afbe: | | f811 cf01 ldrb.w ip, [r1, #1]! 800afc2: | | 4560 cmp r0, ip 800afc4: | \----- d0f7 beq.n 800afb6 <memcmp+0x3e> 800afc6: | eba0 000c sub.w r0, r0, ip 800afca: | bc30 pop {r4, r5} 800afcc: | 4770 bx lr 800afce: \-------> 2000 movs r0, #0 800afd0: bc30 pop {r4, r5} 800afd2: 4770 bx lr 0800afd4 : 800afd4: 4684 mov ip, r0 800afd6: ea41 0300 orr.w r3, r1, r0 800afda: f013 0303 ands.w r3, r3, #3 800afde: /-------- d16d bne.n 800b0bc <memcpy+0xe8> 800afe0: /--|-------> 3a40 subs r2, #64 @ 0x40 800afe2: | | /----- d341 bcc.n 800b068 <memcpy+0x94> 800afe4: | | | /-> f851 3b04 ldr.w r3, [r1], #4 800afe8: | | | | f840 3b04 str.w r3, [r0], #4 800afec: | | | | f851 3b04 ldr.w r3, [r1], #4 800aff0: | | | | f840 3b04 str.w r3, [r0], #4 800aff4: | | | | f851 3b04 ldr.w r3, [r1], #4 800aff8: | | | | f840 3b04 str.w r3, [r0], #4 800affc: | | | | f851 3b04 ldr.w r3, [r1], #4 800b000: | | | | f840 3b04 str.w r3, [r0], #4 800b004: | | | | f851 3b04 ldr.w r3, [r1], #4 800b008: | | | | f840 3b04 str.w r3, [r0], #4 800b00c: | | | | f851 3b04 ldr.w r3, [r1], #4 800b010: | | | | f840 3b04 str.w r3, [r0], #4 800b014: | | | | f851 3b04 ldr.w r3, [r1], #4 800b018: | | | | f840 3b04 str.w r3, [r0], #4 800b01c: | | | | f851 3b04 ldr.w r3, [r1], #4 800b020: | | | | f840 3b04 str.w r3, [r0], #4 800b024: | | | | f851 3b04 ldr.w r3, [r1], #4 800b028: | | | | f840 3b04 str.w r3, [r0], #4 800b02c: | | | | f851 3b04 ldr.w r3, [r1], #4 800b030: | | | | f840 3b04 str.w r3, [r0], #4 800b034: | | | | f851 3b04 ldr.w r3, [r1], #4 800b038: | | | | f840 3b04 str.w r3, [r0], #4 800b03c: | | | | f851 3b04 ldr.w r3, [r1], #4 800b040: | | | | f840 3b04 str.w r3, [r0], #4 800b044: | | | | f851 3b04 ldr.w r3, [r1], #4 800b048: | | | | f840 3b04 str.w r3, [r0], #4 800b04c: | | | | f851 3b04 ldr.w r3, [r1], #4 800b050: | | | | f840 3b04 str.w r3, [r0], #4 800b054: | | | | f851 3b04 ldr.w r3, [r1], #4 800b058: | | | | f840 3b04 str.w r3, [r0], #4 800b05c: | | | | f851 3b04 ldr.w r3, [r1], #4 800b060: | | | | f840 3b04 str.w r3, [r0], #4 800b064: | | | | 3a40 subs r2, #64 @ 0x40 800b066: | | | \-- d2bd bcs.n 800afe4 <memcpy+0x10> 800b068: | | \----> 3230 adds r2, #48 @ 0x30 800b06a: | | /----- d311 bcc.n 800b090 <memcpy+0xbc> 800b06c: | | | /-> f851 3b04 ldr.w r3, [r1], #4 800b070: | | | | f840 3b04 str.w r3, [r0], #4 800b074: | | | | f851 3b04 ldr.w r3, [r1], #4 800b078: | | | | f840 3b04 str.w r3, [r0], #4 800b07c: | | | | f851 3b04 ldr.w r3, [r1], #4 800b080: | | | | f840 3b04 str.w r3, [r0], #4 800b084: | | | | f851 3b04 ldr.w r3, [r1], #4 800b088: | | | | f840 3b04 str.w r3, [r0], #4 800b08c: | | | | 3a10 subs r2, #16 800b08e: | | | \-- d2ed bcs.n 800b06c <memcpy+0x98> 800b090: | | \----> 320c adds r2, #12 800b092: | | /----- d305 bcc.n 800b0a0 <memcpy+0xcc> 800b094: | | | /-> f851 3b04 ldr.w r3, [r1], #4 800b098: | | | | f840 3b04 str.w r3, [r0], #4 800b09c: | | | | 3a04 subs r2, #4 800b09e: | | | \-- d2f9 bcs.n 800b094 <memcpy+0xc0> 800b0a0: | | >----> 3204 adds r2, #4 800b0a2: | | | /-- d008 beq.n 800b0b6 <memcpy+0xe2> 800b0a4: | | | | 07d2 lsls r2, r2, #31 800b0a6: | | | | bf1c itt ne 800b0a8: | | | | f811 3b01 ldrbne.w r3, [r1], #1 800b0ac: | | | | f800 3b01 strbne.w r3, [r0], #1 800b0b0: | | | +-- d301 bcc.n 800b0b6 <memcpy+0xe2> 800b0b2: | | | | 880b ldrh r3, [r1, #0] 800b0b4: | | | | 8003 strh r3, [r0, #0] 800b0b6: | | | \-> 4660 mov r0, ip 800b0b8: | | | 4770 bx lr 800b0ba: | | | bf00 nop 800b0bc: | \--|----> 2a08 cmp r2, #8 800b0be: | | /-- d313 bcc.n 800b0e8 <memcpy+0x114> 800b0c0: | | | 078b lsls r3, r1, #30 800b0c2: +-----|--|-- d08d beq.n 800afe0 <memcpy+0xc> 800b0c4: | | | f010 0303 ands.w r3, r0, #3 800b0c8: +-----|--|-- d08a beq.n 800afe0 <memcpy+0xc> 800b0ca: | | | f1c3 0304 rsb r3, r3, #4 800b0ce: | | | 1ad2 subs r2, r2, r3 800b0d0: | | | 07db lsls r3, r3, #31 800b0d2: | | | bf1c itt ne 800b0d4: | | | f811 3b01 ldrbne.w r3, [r1], #1 800b0d8: | | | f800 3b01 strbne.w r3, [r0], #1 800b0dc: +-----|--|-- d380 bcc.n 800afe0 <memcpy+0xc> 800b0de: | | | f831 3b02 ldrh.w r3, [r1], #2 800b0e2: | | | f820 3b02 strh.w r3, [r0], #2 800b0e6: \-----|--|-- e77b b.n 800afe0 <memcpy+0xc> 800b0e8: | \-> 3a04 subs r2, #4 800b0ea: \----- d3d9 bcc.n 800b0a0 <memcpy+0xcc> 800b0ec: /-> 3a01 subs r2, #1 800b0ee: | f811 3b01 ldrb.w r3, [r1], #1 800b0f2: | f800 3b01 strb.w r3, [r0], #1 800b0f6: \-- d2f9 bcs.n 800b0ec <memcpy+0x118> 800b0f8: 780b ldrb r3, [r1, #0] 800b0fa: 7003 strb r3, [r0, #0] 800b0fc: 784b ldrb r3, [r1, #1] 800b0fe: 7043 strb r3, [r0, #1] 800b100: 788b ldrb r3, [r1, #2] 800b102: 7083 strb r3, [r0, #2] 800b104: 4660 mov r0, ip 800b106: 4770 bx lr ... 0800b140 : 800b140: b430 push {r4, r5} 800b142: f890 f000 pld [r0] 800b146: f020 0107 bic.w r1, r0, #7 800b14a: f06f 0c00 mvn.w ip, #0 800b14e: f010 0407 ands.w r4, r0, #7 800b152: f891 f020 pld [r1, #32] 800b156: /-------- f040 8048 bne.w 800b1ea <strlen+0xaa> 800b15a: | f04f 0400 mov.w r4, #0 800b15e: | f06f 0007 mvn.w r0, #7 800b162: | /----> e9d1 2300 ldrd r2, r3, [r1] 800b166: | | f891 f040 pld [r1, #64] @ 0x40 800b16a: | | f100 0008 add.w r0, r0, #8 800b16e: /--|--|----> fa82 f24c uadd8 r2, r2, ip 800b172: | | | faa4 f28c sel r2, r4, ip 800b176: | | | fa83 f34c uadd8 r3, r3, ip 800b17a: | | | faa2 f38c sel r3, r2, ip 800b17e: | | | /-- bb4b cbnz r3, 800b1d4 <strlen+0x94> 800b180: | | | | e9d1 2302 ldrd r2, r3, [r1, #8] 800b184: | | | | fa82 f24c uadd8 r2, r2, ip 800b188: | | | | f100 0008 add.w r0, r0, #8 800b18c: | | | | faa4 f28c sel r2, r4, ip 800b190: | | | | fa83 f34c uadd8 r3, r3, ip 800b194: | | | | faa2 f38c sel r3, r2, ip 800b198: | | | +-- b9e3 cbnz r3, 800b1d4 <strlen+0x94> 800b19a: | | | | e9d1 2304 ldrd r2, r3, [r1, #16] 800b19e: | | | | fa82 f24c uadd8 r2, r2, ip 800b1a2: | | | | f100 0008 add.w r0, r0, #8 800b1a6: | | | | faa4 f28c sel r2, r4, ip 800b1aa: | | | | fa83 f34c uadd8 r3, r3, ip 800b1ae: | | | | faa2 f38c sel r3, r2, ip 800b1b2: | | | +-- b97b cbnz r3, 800b1d4 <strlen+0x94> 800b1b4: | | | | e9d1 2306 ldrd r2, r3, [r1, #24] 800b1b8: | | | | f101 0120 add.w r1, r1, #32 800b1bc: | | | | fa82 f24c uadd8 r2, r2, ip 800b1c0: | | | | f100 0008 add.w r0, r0, #8 800b1c4: | | | | faa4 f28c sel r2, r4, ip 800b1c8: | | | | fa83 f34c uadd8 r3, r3, ip 800b1cc: | | | | faa2 f38c sel r3, r2, ip 800b1d0: | | | | 2b00 cmp r3, #0 800b1d2: | | \--|-- d0c6 beq.n 800b162 <strlen+0x22> 800b1d4: | | \-> 2a00 cmp r2, #0 800b1d6: | | bf04 itt eq 800b1d8: | | 3004 addeq r0, #4 800b1da: | | 461a moveq r2, r3 800b1dc: | | ba12 rev r2, r2 800b1de: | | fab2 f282 clz r2, r2 800b1e2: | | eb00 00d2 add.w r0, r0, r2, lsr #3 800b1e6: | | bc30 pop {r4, r5} 800b1e8: | | 4770 bx lr 800b1ea: | \-------> e9d1 2300 ldrd r2, r3, [r1] 800b1ee: | f004 0503 and.w r5, r4, #3 800b1f2: | f1c4 0000 rsb r0, r4, #0 800b1f6: | ea4f 05c5 mov.w r5, r5, lsl #3 800b1fa: | f014 0f04 tst.w r4, #4 800b1fe: | f891 f040 pld [r1, #64] @ 0x40 800b202: | fa0c f505 lsl.w r5, ip, r5 800b206: | ea62 0205 orn r2, r2, r5 800b20a: | bf1c itt ne 800b20c: | ea63 0305 ornne r3, r3, r5 800b210: | 4662 movne r2, ip 800b212: | f04f 0400 mov.w r4, #0 800b216: \----------- e7aa b.n 800b16e <strlen+0x2e> 800b218: 6d726554 .word 0x6d726554 800b21c: 6c616e69 .word 0x6c616e69 800b220: 20747300 .word 0x20747300 800b224: 42203d3d .word 0x42203d3d 800b228: 5f545247 .word 0x5f545247 800b22c: 4f5f5453 .word 0x4f5f5453 800b230: 255b004b .word 0x255b004b 800b234: 786c3830 .word 0x786c3830 800b238: 7341205d .word 0x7341205d 800b23c: 74726573 .word 0x74726573 800b240: 206e6f69 .word 0x206e6f69 800b244: 22732522 .word 0x22732522 800b248: 69616620 .word 0x69616620 800b24c: 2064656c .word 0x2064656c 800b250: 6c207461 .word 0x6c207461 800b254: 20656e69 .word 0x20656e69 800b258: 69206425 .word 0x69206425 800b25c: 7325206e .word 0x7325206e 800b260: 6365000a .word 0x6365000a 800b264: 00632e6d .word 0x00632e6d 800b268: 3830255b .word 0x3830255b 800b26c: 205d786c .word 0x205d786c 800b270: 73746c61 .word 0x73746c61 800b274: 635f7465 .word 0x635f7465 800b278: 77203a62 .word 0x77203a62 800b27c: 65646e49 .word 0x65646e49 800b280: 25203a78 .word 0x25203a78 800b284: 56772064 .word 0x56772064 800b288: 65756c61 .word 0x65756c61 800b28c: 6425203a .word 0x6425203a 800b290: 255b000a .word 0x255b000a 800b294: 786c3830 .word 0x786c3830 800b298: 7363205d .word 0x7363205d 800b29c: 3a62635f .word 0x3a62635f 800b2a0: 65526220 .word 0x65526220 800b2a4: 73657571 .word 0x73657571 800b2a8: 25203a74 .word 0x25203a74 800b2ac: 20783230 .word 0x20783230 800b2b0: 6c615677 .word 0x6c615677 800b2b4: 203a6575 .word 0x203a6575 800b2b8: 78343025 .word 0x78343025 800b2bc: 6e497720 .word 0x6e497720 800b2c0: 3a786564 .word 0x3a786564 800b2c4: 34302520 .word 0x34302520 800b2c8: 656c2078 .word 0x656c2078 800b2cc: 25203a6e .word 0x25203a6e 800b2d0: 61642064 .word 0x61642064 800b2d4: 253d6174 .word 0x253d6174 800b2d8: 0a783230 .word 0x0a783230 800b2dc: 30255b00 .word 0x30255b00 800b2e0: 5d786c38 .word 0x5d786c38 800b2e4: 64646120 .word 0x64646120 800b2e8: 73736572 .word 0x73736572 800b2ec: 7325203a .word 0x7325203a 800b2f0: 7075000a .word 0x7075000a 800b2f4: 776f6400 .word 0x776f6400 800b2f8: 255b006e .word 0x255b006e 800b2fc: 786c3830 .word 0x786c3830 800b300: 6669205d .word 0x6669205d 800b304: 20656361 .word 0x20656361 800b308: 25207369 .word 0x25207369 800b30c: 6d000a73 .word 0x6d000a73 800b310: 5f706d65 .word 0x5f706d65 800b314: 65657266 .word 0x65657266 800b318: 656d203a .word 0x656d203a 800b31c: 7270206d .word 0x7270206d 800b320: 7265706f .word 0x7265706f 800b324: 6120796c .word 0x6120796c 800b328: 6e67696c .word 0x6e67696c 800b32c: 6c006465 .word 0x6c006465 800b330: 2f706977 .word 0x2f706977 800b334: 2f637273 .word 0x2f637273 800b338: 65726f63 .word 0x65726f63 800b33c: 6d656d2f .word 0x6d656d2f 800b340: 00632e70 .word 0x00632e70 800b344: 3830255b .word 0x3830255b 800b348: 205d786c .word 0x205d786c 800b34c: 6974656e .word 0x6974656e 800b350: 65735f66 .word 0x65735f66 800b354: 696c5f74 .word 0x696c5f74 800b358: 645f6b6e .word 0x645f6b6e 800b35c: 3a6e776f .word 0x3a6e776f 800b360: 766e6920 .word 0x766e6920 800b364: 64696c61 .word 0x64696c61 800b368: 74656e20 .word 0x74656e20 800b36c: 70006669 .word 0x70006669 800b370: 5f667562 .word 0x5f667562 800b374: 6c616572 .word 0x6c616572 800b378: 3a636f6c .word 0x3a636f6c 800b37c: 21207020 .word 0x21207020 800b380: 554e203d .word 0x554e203d 800b384: 6c004c4c .word 0x6c004c4c 800b388: 2f706977 .word 0x2f706977 800b38c: 2f637273 .word 0x2f637273 800b390: 65726f63 .word 0x65726f63 800b394: 7562702f .word 0x7562702f 800b398: 00632e66 .word 0x00632e66 800b39c: 66756270 .word 0x66756270 800b3a0: 6165725f .word 0x6165725f 800b3a4: 636f6c6c .word 0x636f6c6c 800b3a8: 2071203a .word 0x2071203a 800b3ac: 4e203d21 .word 0x4e203d21 800b3b0: 004c4c55 .word 0x004c4c55 800b3b4: 3830255b .word 0x3830255b 800b3b8: 205d786c .word 0x205d786c 800b3bc: 66756270 .word 0x66756270 800b3c0: 706f635f .word 0x706f635f 800b3c4: 61705f79 .word 0x61705f79 800b3c8: 61697472 .word 0x61697472 800b3cc: 62705f6c .word 0x62705f6c 800b3d0: 203a6675 .word 0x203a6675 800b3d4: 79706f63 .word 0x79706f63 800b3d8: 6e656c5f .word 0x6e656c5f 800b3dc: 67696220 .word 0x67696220 800b3e0: 20726567 .word 0x20726567 800b3e4: 6e616874 .word 0x6e616874 800b3e8: 756f7320 .word 0x756f7320 800b3ec: 00656372 .word 0x00656372 800b3f0: 3830255b .word 0x3830255b 800b3f4: 205d786c .word 0x205d786c 800b3f8: 66756270 .word 0x66756270 800b3fc: 706f635f .word 0x706f635f 800b400: 61705f79 .word 0x61705f79 800b404: 61697472 .word 0x61697472 800b408: 62705f6c .word 0x62705f6c 800b40c: 203a6675 .word 0x203a6675 800b410: 67726174 .word 0x67726174 800b414: 6e207465 .word 0x6e207465 800b418: 6220746f .word 0x6220746f 800b41c: 65206769 .word 0x65206769 800b420: 67756f6e .word 0x67756f6e 800b424: 666f0068 .word 0x666f0068 800b428: 74657366 .word 0x74657366 800b42c: 206f745f .word 0x206f745f 800b430: 70203d3c .word 0x70203d3c 800b434: 2d6f745f .word 0x2d6f745f 800b438: 6e656c3e .word 0x6e656c3e 800b43c: 66666f00 .word 0x66666f00 800b440: 5f746573 .word 0x5f746573 800b444: 6d6f7266 .word 0x6d6f7266 800b448: 203d3c20 .word 0x203d3c20 800b44c: 72665f70 .word 0x72665f70 800b450: 3e2d6d6f .word 0x3e2d6d6f 800b454: 006e656c .word 0x006e656c 800b458: 3830255b .word 0x3830255b 800b45c: 205d786c .word 0x205d786c 800b460: 72665f70 .word 0x72665f70 800b464: 21206d6f .word 0x21206d6f 800b468: 554e203d .word 0x554e203d 800b46c: 5b004c4c .word 0x5b004c4c 800b470: 6c383025 .word 0x6c383025 800b474: 70205d78 .word 0x70205d78 800b478: 206f745f .word 0x206f745f 800b47c: 4e203d21 .word 0x4e203d21 800b480: 004c4c55 .word 0x004c4c55 800b484: 3830255b .word 0x3830255b 800b488: 205d786c .word 0x205d786c 800b48c: 66756270 .word 0x66756270 800b490: 706f635f .word 0x706f635f 800b494: 61705f79 .word 0x61705f79 800b498: 61697472 .word 0x61697472 800b49c: 62705f6c .word 0x62705f6c 800b4a0: 29286675 .word 0x29286675 800b4a4: 656f6420 .word 0x656f6420 800b4a8: 6f6e2073 .word 0x6f6e2073 800b4ac: 6c612074 .word 0x6c612074 800b4b0: 20776f6c .word 0x20776f6c 800b4b4: 6b636170 .word 0x6b636170 800b4b8: 71207465 .word 0x71207465 800b4bc: 65756575 .word 0x65756575 800b4c0: 5b002173 .word 0x5b002173 800b4c4: 6c383025 .word 0x6c383025 800b4c8: 70205d78 .word 0x70205d78 800b4cc: 5f667562 .word 0x5f667562 800b4d0: 79706f63 .word 0x79706f63 800b4d4: 7261705f .word 0x7261705f 800b4d8: 6c616974 .word 0x6c616974 800b4dc: 6e69203a .word 0x6e69203a 800b4e0: 696c6176 .word 0x696c6176 800b4e4: 75622064 .word 0x75622064 800b4e8: 255b0066 .word 0x255b0066 800b4ec: 786c3830 .word 0x786c3830 800b4f0: 6270205d .word 0x6270205d 800b4f4: 635f6675 .word 0x635f6675 800b4f8: 5f79706f .word 0x5f79706f 800b4fc: 74726170 .word 0x74726170 800b500: 3a6c6169 .word 0x3a6c6169 800b504: 766e6920 .word 0x766e6920 800b508: 64696c61 .word 0x64696c61 800b50c: 74616420 .word 0x74616420 800b510: 72747061 .word 0x72747061 800b514: 2d677300 .word 0x2d677300 800b518: 6e656c3e .word 0x6e656c3e 800b51c: 203d3d20 .word 0x203d3d20 800b520: 0a6e656c .word 0x0a6e656c 800b524: 70637400 .word 0x70637400 800b528: 6470755f .word 0x6470755f 800b52c: 5f657461 .word 0x5f657461 800b530: 5f766372 .word 0x5f766372 800b534: 5f6e6e61 .word 0x5f6e6e61 800b538: 3a646e77 .word 0x3a646e77 800b53c: 766e6920 .word 0x766e6920 800b540: 64696c61 .word 0x64696c61 800b544: 62637020 .word 0x62637020 800b548: 69776c00 .word 0x69776c00 800b54c: 72732f70 .word 0x72732f70 800b550: 6f632f63 .word 0x6f632f63 800b554: 742f6572 .word 0x742f6572 800b558: 632e7063 .word 0x632e7063 800b55c: 77656e00 .word 0x77656e00 800b560: 7663725f .word 0x7663725f 800b564: 6e6e615f .word 0x6e6e615f 800b568: 646e775f .word 0x646e775f 800b56c: 203d3c20 .word 0x203d3c20 800b570: 66667830 .word 0x66667830 800b574: 74006666 .word 0x74006666 800b578: 705f7063 .word 0x705f7063 800b57c: 65737261 .word 0x65737261 800b580: 3a74706f .word 0x3a74706f 800b584: 766e6920 .word 0x766e6920 800b588: 64696c61 .word 0x64696c61 800b58c: 62637020 .word 0x62637020 800b590: 69776c00 .word 0x69776c00 800b594: 72732f70 .word 0x72732f70 800b598: 6f632f63 .word 0x6f632f63 800b59c: 742f6572 .word 0x742f6572 800b5a0: 695f7063 .word 0x695f7063 800b5a4: 00632e6e .word 0x00632e6e 800b5a8: 5f706374 .word 0x5f706374 800b5ac: 7074756f .word 0x7074756f 800b5b0: 735f7475 .word 0x735f7475 800b5b4: 656d6765 .word 0x656d6765 800b5b8: 625f746e .word 0x625f746e 800b5bc: 3a797375 .word 0x3a797375 800b5c0: 766e6920 .word 0x766e6920 800b5c4: 64696c61 .word 0x64696c61 800b5c8: 67657320 .word 0x67657320 800b5cc: 69776c00 .word 0x69776c00 800b5d0: 72732f70 .word 0x72732f70 800b5d4: 6f632f63 .word 0x6f632f63 800b5d8: 742f6572 .word 0x742f6572 800b5dc: 6f5f7063 .word 0x6f5f7063 800b5e0: 632e7475 .word 0x632e7475 800b5e4: 70637400 .word 0x70637400 800b5e8: 7865725f .word 0x7865725f 800b5ec: 5f74696d .word 0x5f74696d 800b5f0: 5f6f7472 .word 0x5f6f7472 800b5f4: 70657270 .word 0x70657270 800b5f8: 3a657261 .word 0x3a657261 800b5fc: 766e6920 .word 0x766e6920 800b600: 64696c61 .word 0x64696c61 800b604: 62637020 .word 0x62637020 800b608: 6d656d00 .word 0x6d656d00 800b60c: 616d5f70 .word 0x616d5f70 800b610: 636f6c6c .word 0x636f6c6c 800b614: 656d203a .word 0x656d203a 800b618: 7020706d .word 0x7020706d 800b61c: 65706f72 .word 0x65706f72 800b620: 20796c72 .word 0x20796c72 800b624: 67696c61 .word 0x67696c61 800b628: 0064656e .word 0x0064656e 800b62c: 3830255b .word 0x3830255b 800b630: 205d786c .word 0x205d786c 800b634: 706d656d .word 0x706d656d 800b638: 6c616d5f .word 0x6c616d5f 800b63c: 3a636f6c .word 0x3a636f6c 800b640: 74756f20 .word 0x74756f20 800b644: 20666f20 .word 0x20666f20 800b648: 6f6d656d .word 0x6f6d656d 800b64c: 69207972 .word 0x69207972 800b650: 6f70206e .word 0x6f70206e 800b654: 25206c6f .word 0x25206c6f 800b658: 72000a73 .word 0x72000a73 800b65c: 65757178 .word 0x65757178 800b660: 21206575 .word 0x21206575 800b664: 554e203d .word 0x554e203d 800b668: 72004c4c .word 0x72004c4c 800b66c: 65757178 .word 0x65757178 800b670: 3e2d6575 .word 0x3e2d6575 800b674: 206d6573 .word 0x206d6573 800b678: 4e203d21 .word 0x4e203d21 800b67c: 004c4c55 .word 0x004c4c55 800b680: 66756270 .word 0x66756270 800b684: 203d2120 .word 0x203d2120 800b688: 4c4c554e .word 0x4c4c554e 800b68c: 71787400 .word 0x71787400 800b690: 65756575 .word 0x65756575 800b694: 203d2120 .word 0x203d2120 800b698: 4c4c554e .word 0x4c4c554e 800b69c: 71787400 .word 0x71787400 800b6a0: 65756575 .word 0x65756575 800b6a4: 65733e2d .word 0x65733e2d 800b6a8: 3d21206d .word 0x3d21206d 800b6ac: 4c554e20 .word 0x4c554e20 800b6b0: 6365004c .word 0x6365004c 800b6b4: 6e695f6d .word 0x6e695f6d 800b6b8: 00747570 .word 0x00747570 800b6bc: 5f737973 .word 0x5f737973 800b6c0: 656d6974 .word 0x656d6974 800b6c4: 3a74756f .word 0x3a74756f 800b6c8: 6d697420 .word 0x6d697420 800b6cc: 74756f65 .word 0x74756f65 800b6d0: 203d2120 .word 0x203d2120 800b6d4: 4c4c554e .word 0x4c4c554e 800b6d8: 6f70202c .word 0x6f70202c 800b6dc: 4d206c6f .word 0x4d206c6f 800b6e0: 5f504d45 .word 0x5f504d45 800b6e4: 5f535953 .word 0x5f535953 800b6e8: 454d4954 .word 0x454d4954 800b6ec: 2054554f .word 0x2054554f 800b6f0: 65207369 .word 0x65207369 800b6f4: 7974706d .word 0x7974706d 800b6f8: 69776c00 .word 0x69776c00 800b6fc: 72732f70 .word 0x72732f70 800b700: 6f632f63 .word 0x6f632f63 800b704: 742f6572 .word 0x742f6572 800b708: 6f656d69 .word 0x6f656d69 800b70c: 2e737475 .word 0x2e737475 800b710: 69540063 .word 0x69540063 800b714: 756f656d .word 0x756f656d 800b718: 69742074 .word 0x69742074 800b71c: 7420656d .word 0x7420656d 800b720: 6c206f6f .word 0x6c206f6f 800b724: 2c676e6f .word 0x2c676e6f 800b728: 78616d20 .word 0x78616d20 800b72c: 20736920 .word 0x20736920 800b730: 5049574c .word 0x5049574c 800b734: 4e49555f .word 0x4e49555f 800b738: 5f323354 .word 0x5f323354 800b73c: 2f58414d .word 0x2f58414d 800b740: 736d2034 .word 0x736d2034 800b744: 00736365 .word 0x00736365 800b748: 3830255b .word 0x3830255b 800b74c: 205d786c .word 0x205d786c 800b750: 786f626d .word 0x786f626d 800b754: 75713e2d .word 0x75713e2d 800b758: 00657565 .word 0x00657565 800b75c: 3830255b .word 0x3830255b 800b760: 205d786c .word 0x205d786c 800b764: 786f626d .word 0x786f626d 800b768: 75713e2d .word 0x75713e2d 800b76c: 2d657565 .word 0x2d657565 800b770: 6d65733e .word 0x6d65733e 800b774: 30255b00 .word 0x30255b00 800b778: 5d786c38 .word 0x5d786c38 800b77c: 6f626d20 .word 0x6f626d20 800b780: 70253d78 .word 0x70253d78 800b784: 7a697320 .word 0x7a697320 800b788: 64253d65 .word 0x64253d65 800b78c: 6166000a .word 0x6166000a 800b790: 64656c69 .word 0x64656c69 800b794: 206f7420 .word 0x206f7420 800b798: 61657263 .word 0x61657263 800b79c: 74206574 .word 0x74206574 800b7a0: 70697063 .word 0x70697063 800b7a4: 7268745f .word 0x7268745f 800b7a8: 20646165 .word 0x20646165 800b7ac: 786f626d .word 0x786f626d 800b7b0: 69776c00 .word 0x69776c00 800b7b4: 72732f70 .word 0x72732f70 800b7b8: 70612f63 .word 0x70612f63 800b7bc: 63742f69 .word 0x63742f69 800b7c0: 2e706970 .word 0x2e706970 800b7c4: 255b0063 .word 0x255b0063 800b7c8: 786c3830 .word 0x786c3830 800b7cc: 756d205d .word 0x756d205d 800b7d0: 2d786574 .word 0x2d786574 800b7d4: 78746d3e .word 0x78746d3e 800b7d8: 69616600 .word 0x69616600 800b7dc: 2064656c .word 0x2064656c 800b7e0: 63206f74 .word 0x63206f74 800b7e4: 74616572 .word 0x74616572 800b7e8: 6f6c2065 .word 0x6f6c2065 800b7ec: 745f6b63 .word 0x745f6b63 800b7f0: 70697063 .word 0x70697063 800b7f4: 726f635f .word 0x726f635f 800b7f8: 255b0065 .word 0x255b0065 800b7fc: 786c3830 .word 0x786c3830 800b800: 756d205d .word 0x756d205d 800b804: 3d786574 .word 0x3d786574 800b808: 000a7025 .word 0x000a7025 800b80c: 69706374 .word 0x69706374 800b810: 68745f70 .word 0x68745f70 800b814: 64616572 .word 0x64616572 800b818: 30255b00 .word 0x30255b00 800b81c: 5d786c38 .word 0x5d786c38 800b820: 28732520 .word 0x28732520 800b824: 69203a29 .word 0x69203a29 800b828: 2074696e .word 0x2074696e 800b82c: 656e6f64 .word 0x656e6f64 800b830: 255b000a .word 0x255b000a 800b834: 786c3830 .word 0x786c3830 800b838: 656d205d .word 0x656d205d 800b83c: 665f706d .word 0x665f706d 800b840: 3a656572 .word 0x3a656572 800b844: 70797420 .word 0x70797420 800b848: 203c2065 .word 0x203c2065 800b84c: 504d454d .word 0x504d454d 800b850: 58414d5f .word 0x58414d5f 800b854: 70637400 .word 0x70637400 800b858: 6572665f .word 0x6572665f 800b85c: 4c203a65 .word 0x4c203a65 800b860: 45545349 .word 0x45545349 800b864: 6173004e .word 0x6173004e 800b868: 7974696e .word 0x7974696e 800b86c: 65686320 .word 0x65686320 800b870: 6c206b63 .word 0x6c206b63 800b874: 656b6e69 .word 0x656b6e69 800b878: 696c2064 .word 0x696c2064 800b87c: 6c007473 .word 0x6c007473 800b880: 2f706977 .word 0x2f706977 800b884: 2f637273 .word 0x2f637273 800b888: 65726f63 .word 0x65726f63 800b88c: 7670692f .word 0x7670692f 800b890: 70692f34 .word 0x70692f34 800b894: 72665f34 .word 0x72665f34 800b898: 632e6761 .word 0x632e6761 800b89c: 72637000 .word 0x72637000 800b8a0: 203d2120 .word 0x203d2120 800b8a4: 4c4c554e .word 0x4c4c554e 800b8a8: 30255b00 .word 0x30255b00 800b8ac: 5d786c38 .word 0x5d786c38 800b8b0: 636e6920 .word 0x636e6920 800b8b4: 656d6572 .word 0x656d6572 800b8b8: 6d5f746e .word 0x6d5f746e 800b8bc: 696e6761 .word 0x696e6761 800b8c0: 65647574 .word 0x65647574 800b8c4: 203d3c20 .word 0x203d3c20 800b8c8: 6c3e2d70 .word 0x6c3e2d70 800b8cc: 70006e65 .word 0x70006e65 800b8d0: 20667562 .word 0x20667562 800b8d4: 20666572 .word 0x20666572 800b8d8: 7265766f .word 0x7265766f 800b8dc: 776f6c66 .word 0x776f6c66 800b8e0: 30255b00 .word 0x30255b00 800b8e4: 5d786c38 .word 0x5d786c38 800b8e8: 20682820 .word 0x20682820 800b8ec: 4e203d21 .word 0x4e203d21 800b8f0: 294c4c55 .word 0x294c4c55 800b8f4: 20262620 .word 0x20262620 800b8f8: 21207428 .word 0x21207428 800b8fc: 554e203d .word 0x554e203d 800b900: 20294c4c .word 0x20294c4c 800b904: 6f727028 .word 0x6f727028 800b908: 6d617267 .word 0x6d617267 800b90c: 2072656d .word 0x2072656d 800b910: 6c6f6976 .word 0x6c6f6976 800b914: 73657461 .word 0x73657461 800b918: 49504120 .word 0x49504120 800b91c: 2d700029 .word 0x2d700029 800b920: 746f743e .word 0x746f743e 800b924: 6e656c5f .word 0x6e656c5f 800b928: 203d3d20 .word 0x203d3d20 800b92c: 6c3e2d70 .word 0x6c3e2d70 800b930: 28206e65 .word 0x28206e65 800b934: 6c20666f .word 0x6c20666f 800b938: 20747361 .word 0x20747361 800b93c: 66756270 .word 0x66756270 800b940: 206e6920 .word 0x206e6920 800b944: 69616863 .word 0x69616863 800b948: 7000296e .word 0x7000296e 800b94c: 656e3e2d .word 0x656e3e2d 800b950: 3d207478 .word 0x3d207478 800b954: 554e203d .word 0x554e203d 800b958: 5b004c4c .word 0x5b004c4c 800b95c: 6c383025 .word 0x6c383025 800b960: 65205d78 .word 0x65205d78 800b964: 66696d63 .word 0x66696d63 800b968: 706e692e .word 0x706e692e 800b96c: 000a7475 .word 0x000a7475 800b970: 3830255b .word 0x3830255b 800b974: 205d786c .word 0x205d786c 800b978: 66756270 .word 0x66756270 800b97c: 706f635f .word 0x706f635f 800b980: 69203a79 .word 0x69203a79 800b984: 6c61766e .word 0x6c61766e 800b988: 73206469 .word 0x73206469 800b98c: 6372756f .word 0x6372756f 800b990: 255b0065 .word 0x255b0065 800b994: 786c3830 .word 0x786c3830 800b998: 6374205d .word 0x6374205d 800b99c: 63705f70 .word 0x63705f70 800b9a0: 75705f62 .word 0x75705f62 800b9a4: 3a656772 .word 0x3a656772 800b9a8: 766e6920 .word 0x766e6920 800b9ac: 64696c61 .word 0x64696c61 800b9b0: 62637020 .word 0x62637020 800b9b4: 70637400 .word 0x70637400 800b9b8: 736f6f5f .word 0x736f6f5f 800b9bc: 736e695f .word 0x736e695f 800b9c0: 5f747265 .word 0x5f747265 800b9c4: 6d676573 .word 0x6d676573 800b9c8: 3a746e65 .word 0x3a746e65 800b9cc: 766e6920 .word 0x766e6920 800b9d0: 64696c61 .word 0x64696c61 800b9d4: 65736320 .word 0x65736320 800b9d8: 63740067 .word 0x63740067 800b9dc: 72635f70 .word 0x72635f70 800b9e0: 65746165 .word 0x65746165 800b9e4: 6765735f .word 0x6765735f 800b9e8: 746e656d .word 0x746e656d 800b9ec: 6e69203a .word 0x6e69203a 800b9f0: 696c6176 .word 0x696c6176 800b9f4: 63702064 .word 0x63702064 800b9f8: 63740062 .word 0x63740062 800b9fc: 72635f70 .word 0x72635f70 800ba00: 65746165 .word 0x65746165 800ba04: 6765735f .word 0x6765735f 800ba08: 746e656d .word 0x746e656d 800ba0c: 6e69203a .word 0x6e69203a 800ba10: 696c6176 .word 0x696c6176 800ba14: 62702064 .word 0x62702064 800ba18: 70006675 .word 0x70006675 800ba1c: 6f743e2d .word 0x6f743e2d 800ba20: 656c5f74 .word 0x656c5f74 800ba24: 3d3e206e .word 0x3d3e206e 800ba28: 74706f20 .word 0x74706f20 800ba2c: 006e656c .word 0x006e656c 800ba30: 5f706374 .word 0x5f706374 800ba34: 75716e65 .word 0x75716e65 800ba38: 5f657565 .word 0x5f657565 800ba3c: 67616c66 .word 0x67616c66 800ba40: 6e203a73 .word 0x6e203a73 800ba44: 20646565 .word 0x20646565 800ba48: 68746965 .word 0x68746965 800ba4c: 54207265 .word 0x54207265 800ba50: 535f5043 .word 0x535f5043 800ba54: 6f204e59 .word 0x6f204e59 800ba58: 43542072 .word 0x43542072 800ba5c: 49465f50 .word 0x49465f50 800ba60: 6e69204e .word 0x6e69204e 800ba64: 616c6620 .word 0x616c6620 800ba68: 28207367 .word 0x28207367 800ba6c: 676f7270 .word 0x676f7270 800ba70: 6d6d6172 .word 0x6d6d6172 800ba74: 76207265 .word 0x76207265 800ba78: 616c6f69 .word 0x616c6f69 800ba7c: 20736574 .word 0x20736574 800ba80: 29495041 .word 0x29495041 800ba84: 70637400 .word 0x70637400 800ba88: 716e655f .word 0x716e655f 800ba8c: 65756575 .word 0x65756575 800ba90: 616c665f .word 0x616c665f 800ba94: 203a7367 .word 0x203a7367 800ba98: 61766e69 .word 0x61766e69 800ba9c: 2064696c .word 0x2064696c 800baa0: 00626370 .word 0x00626370 800baa4: 5f706374 .word 0x5f706374 800baa8: 75716e65 .word 0x75716e65 800baac: 5f657565 .word 0x5f657565 800bab0: 67616c66 .word 0x67616c66 800bab4: 63203a73 .word 0x63203a73 800bab8: 6b636568 .word 0x6b636568 800babc: 61687420 .word 0x61687420 800bac0: 69662074 .word 0x69662074 800bac4: 20747372 .word 0x20747372 800bac8: 66756270 .word 0x66756270 800bacc: 6e616320 .word 0x6e616320 800bad0: 6c6f6820 .word 0x6c6f6820 800bad4: 706f2064 .word 0x706f2064 800bad8: 6e656c74 .word 0x6e656c74 800badc: 67657300 .word 0x67657300 800bae0: 63743e2d .word 0x63743e2d 800bae4: 72646870 .word 0x72646870 800bae8: 746f6e20 .word 0x746f6e20 800baec: 696c6120 .word 0x696c6120 800baf0: 64656e67 .word 0x64656e67 800baf4: 70637400 .word 0x70637400 800baf8: 716e655f .word 0x716e655f 800bafc: 65756575 .word 0x65756575 800bb00: 616c665f .word 0x616c665f 800bb04: 203a7367 .word 0x203a7367 800bb08: 61766e69 .word 0x61766e69 800bb0c: 2064696c .word 0x2064696c 800bb10: 6d676573 .word 0x6d676573 800bb14: 20746e65 .word 0x20746e65 800bb18: 676e656c .word 0x676e656c 800bb1c: 74006874 .word 0x74006874 800bb20: 655f7063 .word 0x655f7063 800bb24: 6575716e .word 0x6575716e 800bb28: 665f6575 .word 0x665f6575 800bb2c: 7367616c .word 0x7367616c 800bb30: 6e69203a .word 0x6e69203a 800bb34: 696c6176 .word 0x696c6176 800bb38: 75712064 .word 0x75712064 800bb3c: 20657565 .word 0x20657565 800bb40: 676e656c .word 0x676e656c 800bb44: 74006874 .word 0x74006874 800bb48: 735f7063 .word 0x735f7063 800bb4c: 5f646e65 .word 0x5f646e65 800bb50: 3a6e6966 .word 0x3a6e6966 800bb54: 766e6920 .word 0x766e6920 800bb58: 64696c61 .word 0x64696c61 800bb5c: 62637020 .word 0x62637020 800bb60: 70637400 .word 0x70637400 800bb64: 74756f5f .word 0x74756f5f 800bb68: 5f747570 .word 0x5f747570 800bb6c: 746e6f63 .word 0x746e6f63 800bb70: 5f6c6f72 .word 0x5f6c6f72 800bb74: 6d676573 .word 0x6d676573 800bb78: 5f746e65 .word 0x5f746e65 800bb7c: 6974656e .word 0x6974656e 800bb80: 6e203a66 .word 0x6e203a66 800bb84: 656e206f .word 0x656e206f 800bb88: 20666974 .word 0x20666974 800bb8c: 65766967 .word 0x65766967 800bb90: 6374006e .word 0x6374006e 800bb94: 756f5f70 .word 0x756f5f70 800bb98: 74757074 .word 0x74757074 800bb9c: 6e6f635f .word 0x6e6f635f 800bba0: 6c6f7274 .word 0x6c6f7274 800bba4: 6765735f .word 0x6765735f 800bba8: 746e656d .word 0x746e656d 800bbac: 6e69203a .word 0x6e69203a 800bbb0: 696c6176 .word 0x696c6176 800bbb4: 62702064 .word 0x62702064 800bbb8: 74006675 .word 0x74006675 800bbbc: 735f7063 .word 0x735f7063 800bbc0: 5f646e65 .word 0x5f646e65 800bbc4: 74706d65 .word 0x74706d65 800bbc8: 63615f79 .word 0x63615f79 800bbcc: 69203a6b .word 0x69203a6b 800bbd0: 6c61766e .word 0x6c61766e 800bbd4: 70206469 .word 0x70206469 800bbd8: 74006263 .word 0x74006263 800bbdc: 725f7063 .word 0x725f7063 800bbe0: 69656365 .word 0x69656365 800bbe4: 203a6576 .word 0x203a6576 800bbe8: 6e6f7277 .word 0x6e6f7277 800bbec: 74732067 .word 0x74732067 800bbf0: 00657461 .word 0x00657461 800bbf4: 65736e69 .word 0x65736e69 800bbf8: 20702e67 .word 0x20702e67 800bbfc: 4e203d21 .word 0x4e203d21 800bc00: 004c4c55 .word 0x004c4c55 800bc04: 61736e69 .word 0x61736e69 800bc08: 6f20656e .word 0x6f20656e 800bc0c: 65736666 .word 0x65736666 800bc10: 70002174 .word 0x70002174 800bc14: 20667562 .word 0x20667562 800bc18: 206f6f74 .word 0x206f6f74 800bc1c: 726f6873 .word 0x726f6873 800bc20: 74002174 .word 0x74002174 800bc24: 725f7063 .word 0x725f7063 800bc28: 69656365 .word 0x69656365 800bc2c: 203a6576 .word 0x203a6576 800bc30: 6d676573 .word 0x6d676573 800bc34: 20746e65 .word 0x20746e65 800bc38: 20746f6e .word 0x20746f6e 800bc3c: 6d697274 .word 0x6d697274 800bc40: 2064656d .word 0x2064656d 800bc44: 72726f63 .word 0x72726f63 800bc48: 6c746365 .word 0x6c746365 800bc4c: 6f742079 .word 0x6f742079 800bc50: 76637220 .word 0x76637220 800bc54: 646e775f .word 0x646e775f 800bc58: 70637400 .word 0x70637400 800bc5c: 6365725f .word 0x6365725f 800bc60: 65766965 .word 0x65766965 800bc64: 6573203a .word 0x6573203a 800bc68: 6e656d67 .word 0x6e656d67 800bc6c: 6f6e2074 .word 0x6f6e2074 800bc70: 72742074 .word 0x72742074 800bc74: 656d6d69 .word 0x656d6d69 800bc78: 6f632064 .word 0x6f632064 800bc7c: 63657272 .word 0x63657272 800bc80: 20796c74 .word 0x20796c74 800bc84: 6f206f74 .word 0x6f206f74 800bc88: 7165736f .word 0x7165736f 800bc8c: 65757120 .word 0x65757120 800bc90: 74006575 .word 0x74006575 800bc94: 725f7063 .word 0x725f7063 800bc98: 69656365 .word 0x69656365 800bc9c: 203a6576 .word 0x203a6576 800bca0: 6c706374 .word 0x6c706374 800bca4: 3e206e65 .word 0x3e206e65 800bca8: 76637220 .word 0x76637220 800bcac: 646e775f .word 0x646e775f 800bcb0: 70637400 .word 0x70637400 800bcb4: 6365725f .word 0x6365725f 800bcb8: 65766965 .word 0x65766965 800bcbc: 6f6f203a .word 0x6f6f203a 800bcc0: 20716573 .word 0x20716573 800bcc4: 6c706374 .word 0x6c706374 800bcc8: 3e206e65 .word 0x3e206e65 800bccc: 76637220 .word 0x76637220 800bcd0: 646e775f .word 0x646e775f 800bcd4: 70637400 .word 0x70637400 800bcd8: 74756f5f .word 0x74756f5f 800bcdc: 3a747570 .word 0x3a747570 800bce0: 766e6920 .word 0x766e6920 800bce4: 64696c61 .word 0x64696c61 800bce8: 62637020 .word 0x62637020 800bcec: 6e6f6400 .word 0x6e6f6400 800bcf0: 63207427 .word 0x63207427 800bcf4: 206c6c61 .word 0x206c6c61 800bcf8: 5f706374 .word 0x5f706374 800bcfc: 7074756f .word 0x7074756f 800bd00: 66207475 .word 0x66207475 800bd04: 6c20726f .word 0x6c20726f 800bd08: 65747369 .word 0x65747369 800bd0c: 63702d6e .word 0x63702d6e 800bd10: 52007362 .word 0x52007362 800bd14: 6e205453 .word 0x6e205453 800bd18: 6520746f .word 0x6520746f 800bd1c: 63657078 .word 0x63657078 800bd20: 20646574 .word 0x20646574 800bd24: 65726568 .word 0x65726568 800bd28: 706f0021 .word 0x706f0021 800bd2c: 6e6f6974 .word 0x6e6f6974 800bd30: 6f6e2073 .word 0x6f6e2073 800bd34: 69662074 .word 0x69662074 800bd38: 64656c6c .word 0x64656c6c 800bd3c: 62637000 .word 0x62637000 800bd40: 203d2120 .word 0x203d2120 800bd44: 4c4c554e .word 0x4c4c554e 800bd48: 70637400 .word 0x70637400 800bd4c: 6263705f .word 0x6263705f 800bd50: 6d65725f .word 0x6d65725f 800bd54: 3a65766f .word 0x3a65766f 800bd58: 766e6920 .word 0x766e6920 800bd5c: 64696c61 .word 0x64696c61 800bd60: 62637020 .word 0x62637020 800bd64: 736e7500 .word 0x736e7500 800bd68: 20746e65 .word 0x20746e65 800bd6c: 6d676573 .word 0x6d676573 800bd70: 73746e65 .word 0x73746e65 800bd74: 61656c20 .word 0x61656c20 800bd78: 676e696b .word 0x676e696b 800bd7c: 616e7500 .word 0x616e7500 800bd80: 64656b63 .word 0x64656b63 800bd84: 67657320 .word 0x67657320 800bd88: 746e656d .word 0x746e656d 800bd8c: 656c2073 .word 0x656c2073 800bd90: 6e696b61 .word 0x6e696b61 800bd94: 6f6f0067 .word 0x6f6f0067 800bd98: 20716573 .word 0x20716573 800bd9c: 6d676573 .word 0x6d676573 800bda0: 73746e65 .word 0x73746e65 800bda4: 61656c20 .word 0x61656c20 800bda8: 676e696b .word 0x676e696b 800bdac: 30255b00 .word 0x30255b00 800bdb0: 5d786c38 .word 0x5d786c38 800bdb4: 70637420 .word 0x70637420 800bdb8: 6162615f .word 0x6162615f 800bdbc: 6e6f646e .word 0x6e6f646e 800bdc0: 6e69203a .word 0x6e69203a 800bdc4: 696c6176 .word 0x696c6176 800bdc8: 63702064 .word 0x63702064 800bdcc: 6f640062 .word 0x6f640062 800bdd0: 2074276e .word 0x2074276e 800bdd4: 6c6c6163 .word 0x6c6c6163 800bdd8: 70637420 .word 0x70637420 800bddc: 6f62615f .word 0x6f62615f 800bde0: 742f7472 .word 0x742f7472 800bde4: 615f7063 .word 0x615f7063 800bde8: 646e6162 .word 0x646e6162 800bdec: 66206e6f .word 0x66206e6f 800bdf0: 6c20726f .word 0x6c20726f 800bdf4: 65747369 .word 0x65747369 800bdf8: 63702d6e .word 0x63702d6e 800bdfc: 73007362 .word 0x73007362 800be00: 6c676e69 .word 0x6c676e69 800be04: 656e2065 .word 0x656e2065 800be08: 20666974 .word 0x20666974 800be0c: 65726c61 .word 0x65726c61 800be10: 20796461 .word 0x20796461 800be14: 00746573 .word 0x00746573 800be18: 7069776c .word 0x7069776c 800be1c: 6372732f .word 0x6372732f 800be20: 726f632f .word 0x726f632f 800be24: 656e2f65 .word 0x656e2f65 800be28: 2e666974 .word 0x2e666974 800be2c: 255b0063 .word 0x255b0063 800be30: 786c3830 .word 0x786c3830 800be34: 6374205d .word 0x6374205d 800be38: 65725f70 .word 0x65725f70 800be3c: 6e5f7663 .word 0x6e5f7663 800be40: 3a6c6c75 .word 0x3a6c6c75 800be44: 766e6920 .word 0x766e6920 800be48: 64696c61 .word 0x64696c61 800be4c: 62637020 .word 0x62637020 800be50: 6e6f6400 .word 0x6e6f6400 800be54: 63207427 .word 0x63207427 800be58: 206c6c61 .word 0x206c6c61 800be5c: 5f706374 .word 0x5f706374 800be60: 76636572 .word 0x76636572 800be64: 66206465 .word 0x66206465 800be68: 6c20726f .word 0x6c20726f 800be6c: 65747369 .word 0x65747369 800be70: 63702d6e .word 0x63702d6e 800be74: 74007362 .word 0x74007362 800be78: 665f7063 .word 0x665f7063 800be7c: 5f656572 .word 0x5f656572 800be80: 7473696c .word 0x7473696c 800be84: 203a6e65 .word 0x203a6e65 800be88: 53494c21 .word 0x53494c21 800be8c: 004e4554 .word 0x004e4554 800be90: 3830255b .word 0x3830255b 800be94: 205d786c .word 0x205d786c 800be98: 5f706374 .word 0x5f706374 800be9c: 636f7270 .word 0x636f7270 800bea0: 5f737365 .word 0x5f737365 800bea4: 75666572 .word 0x75666572 800bea8: 5f646573 .word 0x5f646573 800beac: 61746164 .word 0x61746164 800beb0: 6e69203a .word 0x6e69203a 800beb4: 696c6176 .word 0x696c6176 800beb8: 63702064 .word 0x63702064 800bebc: 63740062 .word 0x63740062 800bec0: 65725f70 .word 0x65725f70 800bec4: 74696d78 .word 0x74696d78 800bec8: 6f74725f .word 0x6f74725f 800becc: 6d6f635f .word 0x6d6f635f 800bed0: 3a74696d .word 0x3a74696d 800bed4: 766e6920 .word 0x766e6920 800bed8: 64696c61 .word 0x64696c61 800bedc: 62637020 .word 0x62637020 800bee0: 70637400 .word 0x70637400 800bee4: 6f6c735f .word 0x6f6c735f 800bee8: 726d7477 .word 0x726d7477 800beec: 6361203a .word 0x6361203a 800bef0: 65766974 .word 0x65766974 800bef4: 62637020 .word 0x62637020 800bef8: 74733e2d .word 0x74733e2d 800befc: 20657461 .word 0x20657461 800bf00: 43203d21 .word 0x43203d21 800bf04: 45534f4c .word 0x45534f4c 800bf08: 63740044 .word 0x63740044 800bf0c: 6c735f70 .word 0x6c735f70 800bf10: 6d74776f .word 0x6d74776f 800bf14: 61203a72 .word 0x61203a72 800bf18: 76697463 .word 0x76697463 800bf1c: 63702065 .word 0x63702065 800bf20: 733e2d62 .word 0x733e2d62 800bf24: 65746174 .word 0x65746174 800bf28: 203d2120 .word 0x203d2120 800bf2c: 5453494c .word 0x5453494c 800bf30: 74004e45 .word 0x74004e45 800bf34: 735f7063 .word 0x735f7063 800bf38: 74776f6c .word 0x74776f6c 800bf3c: 203a726d .word 0x203a726d 800bf40: 69746361 .word 0x69746361 800bf44: 70206576 .word 0x70206576 800bf48: 3e2d6263 .word 0x3e2d6263 800bf4c: 74617473 .word 0x74617473 800bf50: 3d212065 .word 0x3d212065 800bf54: 4d495420 .word 0x4d495420 800bf58: 41572d45 .word 0x41572d45 800bf5c: 74005449 .word 0x74005449 800bf60: 735f7063 .word 0x735f7063 800bf64: 74776f6c .word 0x74776f6c 800bf68: 3a726d69 .word 0x3a726d69 800bf6c: 72657020 .word 0x72657020 800bf70: 74736973 .word 0x74736973 800bf74: 63697420 .word 0x63697420 800bf78: 676e696b .word 0x676e696b 800bf7c: 74697720 .word 0x74697720 800bf80: 6e692068 .word 0x6e692068 800bf84: 696c662d .word 0x696c662d 800bf88: 20746867 .word 0x20746867 800bf8c: 61746164 .word 0x61746164 800bf90: 70637400 .word 0x70637400 800bf94: 6f6c735f .word 0x6f6c735f 800bf98: 6d697477 .word 0x6d697477 800bf9c: 70203a72 .word 0x70203a72 800bfa0: 69737265 .word 0x69737265 800bfa4: 74207473 .word 0x74207473 800bfa8: 696b6369 .word 0x696b6369 800bfac: 7720676e .word 0x7720676e 800bfb0: 20687469 .word 0x20687469 800bfb4: 74706d65 .word 0x74706d65 800bfb8: 65732079 .word 0x65732079 800bfbc: 6220646e .word 0x6220646e 800bfc0: 65666675 .word 0x65666675 800bfc4: 70730072 .word 0x70730072 800bfc8: 2074696c .word 0x2074696c 800bfcc: 6d203d3c .word 0x6d203d3c 800bfd0: 75007373 .word 0x75007373 800bfd4: 2d676573 .word 0x2d676573 800bfd8: 6e656c3e .word 0x6e656c3e 800bfdc: 30203e20 .word 0x30203e20 800bfe0: 70637400 .word 0x70637400 800bfe4: 6f6c735f .word 0x6f6c735f 800bfe8: 726d7477 .word 0x726d7477 800bfec: 696d203a .word 0x696d203a 800bff0: 656c6464 .word 0x656c6464 800bff4: 70637420 .word 0x70637420 800bff8: 203d2120 .word 0x203d2120 800bffc: 5f706374 .word 0x5f706374 800c000: 69746361 .word 0x69746361 800c004: 705f6576 .word 0x705f6576 800c008: 00736263 .word 0x00736263 800c00c: 5f706374 .word 0x5f706374 800c010: 776f6c73 .word 0x776f6c73 800c014: 3a726d74 .word 0x3a726d74 800c018: 72696620 .word 0x72696620 800c01c: 70207473 .word 0x70207473 800c020: 3d206263 .word 0x3d206263 800c024: 6374203d .word 0x6374203d 800c028: 63615f70 .word 0x63615f70 800c02c: 65766974 .word 0x65766974 800c030: 6263705f .word 0x6263705f 800c034: 63740073 .word 0x63740073 800c038: 6c735f70 .word 0x6c735f70 800c03c: 6d74776f .word 0x6d74776f 800c040: 54203a72 .word 0x54203a72 800c044: 2d454d49 .word 0x2d454d49 800c048: 54494157 .word 0x54494157 800c04c: 62637020 .word 0x62637020 800c050: 74733e2d .word 0x74733e2d 800c054: 20657461 .word 0x20657461 800c058: 54203d3d .word 0x54203d3d 800c05c: 2d454d49 .word 0x2d454d49 800c060: 54494157 .word 0x54494157 800c064: 70637400 .word 0x70637400 800c068: 6f6c735f .word 0x6f6c735f 800c06c: 726d7477 .word 0x726d7477 800c070: 696d203a .word 0x696d203a 800c074: 656c6464 .word 0x656c6464 800c078: 70637420 .word 0x70637420 800c07c: 203d2120 .word 0x203d2120 800c080: 5f706374 .word 0x5f706374 800c084: 705f7774 .word 0x705f7774 800c088: 00736263 .word 0x00736263 800c08c: 5f706374 .word 0x5f706374 800c090: 776f6c73 .word 0x776f6c73 800c094: 3a726d74 .word 0x3a726d74 800c098: 72696620 .word 0x72696620 800c09c: 70207473 .word 0x70207473 800c0a0: 3d206263 .word 0x3d206263 800c0a4: 6374203d .word 0x6374203d 800c0a8: 77745f70 .word 0x77745f70 800c0ac: 6263705f .word 0x6263705f 800c0b0: 255b0073 .word 0x255b0073 800c0b4: 786c3830 .word 0x786c3830 800c0b8: 6475205d .word 0x6475205d 800c0bc: 69625f70 .word 0x69625f70 800c0c0: 203a646e .word 0x203a646e 800c0c4: 61766e69 .word 0x61766e69 800c0c8: 2064696c .word 0x2064696c 800c0cc: 00626370 .word 0x00626370 800c0d0: 70636864 .word 0x70636864 800c0d4: 6263705f .word 0x6263705f 800c0d8: 6665725f .word 0x6665725f 800c0dc: 6e756f63 .word 0x6e756f63 800c0e0: 3a292874 .word 0x3a292874 800c0e4: 66657220 .word 0x66657220 800c0e8: 6e756f63 .word 0x6e756f63 800c0ec: 72652074 .word 0x72652074 800c0f0: 00726f72 .word 0x00726f72 800c0f4: 7069776c .word 0x7069776c 800c0f8: 6372732f .word 0x6372732f 800c0fc: 726f632f .word 0x726f632f 800c100: 70692f65 .word 0x70692f65 800c104: 642f3476 .word 0x642f3476 800c108: 2e706368 .word 0x2e706368 800c10c: 255b0063 .word 0x255b0063 800c110: 786c3830 .word 0x786c3830 800c114: 6475205d .word 0x6475205d 800c118: 65725f70 .word 0x65725f70 800c11c: 65766f6d .word 0x65766f6d 800c120: 6e69203a .word 0x6e69203a 800c124: 696c6176 .word 0x696c6176 800c128: 63702064 .word 0x63702064 800c12c: 255b0062 .word 0x255b0062 800c130: 786c3830 .word 0x786c3830 800c134: 6864205d .word 0x6864205d 800c138: 625f7063 .word 0x625f7063 800c13c: 3a646e69 .word 0x3a646e69 800c140: 74656e20 .word 0x74656e20 800c144: 21206669 .word 0x21206669 800c148: 554e203d .word 0x554e203d 800c14c: 5b004c4c .word 0x5b004c4c 800c150: 6c383025 .word 0x6c383025 800c154: 64205d78 .word 0x64205d78 800c158: 5f706368 .word 0x5f706368 800c15c: 646e6962 .word 0x646e6962 800c160: 6864203a .word 0x6864203a 800c164: 21207063 .word 0x21207063 800c168: 554e203d .word 0x554e203d 800c16c: 64004c4c .word 0x64004c4c 800c170: 5f706368 .word 0x5f706368 800c174: 6974706f .word 0x6974706f 800c178: 203a6e6f .word 0x203a6e6f 800c17c: 6974706f .word 0x6974706f 800c180: 5f736e6f .word 0x5f736e6f 800c184: 5f74756f .word 0x5f74756f 800c188: 206e656c .word 0x206e656c 800c18c: 2032202b .word 0x2032202b 800c190: 706f202b .word 0x706f202b 800c194: 6e6f6974 .word 0x6e6f6974 800c198: 6e656c5f .word 0x6e656c5f 800c19c: 203d3c20 .word 0x203d3c20 800c1a0: 50434844 .word 0x50434844 800c1a4: 54504f5f .word 0x54504f5f 800c1a8: 534e4f49 .word 0x534e4f49 800c1ac: 4e454c5f .word 0x4e454c5f 800c1b0: 63686400 .word 0x63686400 800c1b4: 706f5f70 .word 0x706f5f70 800c1b8: 6e6f6974 .word 0x6e6f6974 800c1bc: 7479625f .word 0x7479625f 800c1c0: 6f203a65 .word 0x6f203a65 800c1c4: 6f697470 .word 0x6f697470 800c1c8: 6f5f736e .word 0x6f5f736e 800c1cc: 6c5f7475 .word 0x6c5f7475 800c1d0: 3c206e65 .word 0x3c206e65 800c1d4: 43484420 .word 0x43484420 800c1d8: 504f5f50 .word 0x504f5f50 800c1dc: 4e4f4954 .word 0x4e4f4954 800c1e0: 454c5f53 .word 0x454c5f53 800c1e4: 6864004e .word 0x6864004e 800c1e8: 6f5f7063 .word 0x6f5f7063 800c1ec: 6f697470 .word 0x6f697470 800c1f0: 68735f6e .word 0x68735f6e 800c1f4: 3a74726f .word 0x3a74726f 800c1f8: 74706f20 .word 0x74706f20 800c1fc: 736e6f69 .word 0x736e6f69 800c200: 74756f5f .word 0x74756f5f 800c204: 6e656c5f .word 0x6e656c5f 800c208: 32202b20 .word 0x32202b20 800c20c: 203d3c20 .word 0x203d3c20 800c210: 50434844 .word 0x50434844 800c214: 54504f5f .word 0x54504f5f 800c218: 534e4f49 .word 0x534e4f49 800c21c: 4e454c5f .word 0x4e454c5f 800c220: 63686400 .word 0x63686400 800c224: 706f5f70 .word 0x706f5f70 800c228: 6e6f6974 .word 0x6e6f6974 800c22c: 6e6f6c5f .word 0x6e6f6c5f 800c230: 6f203a67 .word 0x6f203a67 800c234: 6f697470 .word 0x6f697470 800c238: 6f5f736e .word 0x6f5f736e 800c23c: 6c5f7475 .word 0x6c5f7475 800c240: 2b206e65 .word 0x2b206e65 800c244: 3c203420 .word 0x3c203420 800c248: 4844203d .word 0x4844203d 800c24c: 4f5f5043 .word 0x4f5f5043 800c250: 4f495450 .word 0x4f495450 800c254: 4c5f534e .word 0x4c5f534e 800c258: 5b004e45 .word 0x5b004e45 800c25c: 6c383025 .word 0x6c383025 800c260: 64205d78 .word 0x64205d78 800c264: 5f706368 .word 0x5f706368 800c268: 61657263 .word 0x61657263 800c26c: 6d5f6574 .word 0x6d5f6574 800c270: 203a6773 .word 0x203a6773 800c274: 6974656e .word 0x6974656e 800c278: 3d212066 .word 0x3d212066 800c27c: 4c554e20 .word 0x4c554e20 800c280: 255b004c .word 0x255b004c 800c284: 786c3830 .word 0x786c3830 800c288: 6864205d .word 0x6864205d 800c28c: 635f7063 .word 0x635f7063 800c290: 74616572 .word 0x74616572 800c294: 736d5f65 .word 0x736d5f65 800c298: 64203a67 .word 0x64203a67 800c29c: 20706368 .word 0x20706368 800c2a0: 4e203d21 .word 0x4e203d21 800c2a4: 004c4c55 .word 0x004c4c55 800c2a8: 70636864 .word 0x70636864 800c2ac: 6572635f .word 0x6572635f 800c2b0: 5f657461 .word 0x5f657461 800c2b4: 3a67736d .word 0x3a67736d 800c2b8: 65686320 .word 0x65686320 800c2bc: 74206b63 .word 0x74206b63 800c2c0: 20746168 .word 0x20746168 800c2c4: 73726966 .word 0x73726966 800c2c8: 62702074 .word 0x62702074 800c2cc: 63206675 .word 0x63206675 800c2d0: 68206e61 .word 0x68206e61 800c2d4: 20646c6f .word 0x20646c6f 800c2d8: 75727473 .word 0x75727473 800c2dc: 64207463 .word 0x64207463 800c2e0: 5f706368 .word 0x5f706368 800c2e4: 0067736d .word 0x0067736d 800c2e8: 50434844 .word 0x50434844 800c2ec: 6f687320 .word 0x6f687320 800c2f0: 20646c75 .word 0x20646c75 800c2f4: 65206562 .word 0x65206562 800c2f8: 6c62616e .word 0x6c62616e 800c2fc: 61206465 .word 0x61206465 800c300: 68742074 .word 0x68742074 800c304: 70207369 .word 0x70207369 800c308: 746e696f .word 0x746e696f 800c30c: 7562202c .word 0x7562202c 800c310: 74692074 .word 0x74692074 800c314: 20736920 .word 0x20736920 800c318: 21746f6e .word 0x21746f6e 800c31c: 30255b00 .word 0x30255b00 800c320: 5d786c38 .word 0x5d786c38 800c324: 74656e20 .word 0x74656e20 800c328: 735f6669 .word 0x735f6669 800c32c: 6c5f7465 .word 0x6c5f7465 800c330: 5f6b6e69 .word 0x5f6b6e69 800c334: 203a7075 .word 0x203a7075 800c338: 61766e69 .word 0x61766e69 800c33c: 2064696c .word 0x2064696c 800c340: 6974656e .word 0x6974656e 800c344: 6e690066 .word 0x6e690066 800c348: 696c6176 .word 0x696c6176 800c34c: 68642064 .word 0x68642064 800c350: 3e2d7063 .word 0x3e2d7063 800c354: 74617473 .word 0x74617473 800c358: 68630065 .word 0x68630065 800c35c: 206b6365 .word 0x206b6365 800c360: 6f636564 .word 0x6f636564 800c364: 695f6564 .word 0x695f6564 800c368: 61007864 .word 0x61007864 800c36c: 725f6463 .word 0x725f6463 800c370: 766f6d65 .word 0x766f6d65 800c374: 3a292865 .word 0x3a292865 800c378: 64636120 .word 0x64636120 800c37c: 746f6e20 .word 0x746f6e20 800c380: 206e6f20 .word 0x206e6f20 800c384: 7473696c .word 0x7473696c 800c388: 776c000a .word 0x776c000a 800c38c: 732f7069 .word 0x732f7069 800c390: 632f6372 .word 0x632f6372 800c394: 2f65726f .word 0x2f65726f 800c398: 34767069 .word 0x34767069 800c39c: 6463612f .word 0x6463612f 800c3a0: 6c00632e .word 0x6c00632e 800c3a4: 2f706977 .word 0x2f706977 800c3a8: 2f637273 .word 0x2f637273 800c3ac: 65726f63 .word 0x65726f63 800c3b0: 7670692f .word 0x7670692f 800c3b4: 74652f34 .word 0x74652f34 800c3b8: 70726168 .word 0x70726168 800c3bc: 6300632e .word 0x6300632e 800c3c0: 6b636568 .word 0x6b636568 800c3c4: 61687420 .word 0x61687420 800c3c8: 69662074 .word 0x69662074 800c3cc: 20747372 .word 0x20747372 800c3d0: 66756270 .word 0x66756270 800c3d4: 6e616320 .word 0x6e616320 800c3d8: 6c6f6820 .word 0x6c6f6820 800c3dc: 74732064 .word 0x74732064 800c3e0: 74637572 .word 0x74637572 800c3e4: 68746520 .word 0x68746520 800c3e8: 5f707261 .word 0x5f707261 800c3ec: 00726468 .word 0x00726468 800c3f0: 6974656e .word 0x6974656e 800c3f4: 683e2d66 .word 0x683e2d66 800c3f8: 64646177 .word 0x64646177 800c3fc: 656c5f72 .word 0x656c5f72 800c400: 756d206e .word 0x756d206e 800c404: 62207473 .word 0x62207473 800c408: 68742065 .word 0x68742065 800c40c: 61732065 .word 0x61732065 800c410: 6120656d .word 0x6120656d 800c414: 54452073 .word 0x54452073 800c418: 57485f48 .word 0x57485f48 800c41c: 52444441 .word 0x52444441 800c420: 4e454c5f .word 0x4e454c5f 800c424: 726f6620 .word 0x726f6620 800c428: 68746520 .word 0x68746520 800c42c: 21707261 .word 0x21707261 800c430: 70726100 .word 0x70726100 800c434: 6261745f .word 0x6261745f 800c438: 615b656c .word 0x615b656c 800c43c: 695f7072 .word 0x695f7072 800c440: 2e5d7864 .word 0x2e5d7864 800c444: 74617473 .word 0x74617473 800c448: 3d3e2065 .word 0x3d3e2065 800c44c: 48544520 .word 0x48544520 800c450: 5f505241 .word 0x5f505241 800c454: 54415453 .word 0x54415453 800c458: 54535f45 .word 0x54535f45 800c45c: 454c4241 .word 0x454c4241 800c460: 61706900 .word 0x61706900 800c464: 20726464 .word 0x20726464 800c468: 4e203d21 .word 0x4e203d21 800c46c: 004c4c55 .word 0x004c4c55 800c470: 65707974 .word 0x65707974 800c474: 65766f20 .word 0x65766f20 800c478: 6f6c6672 .word 0x6f6c6672 800c47c: 6f6e0077 .word 0x6f6e0077 800c480: 63617020 .word 0x63617020 800c484: 2074656b .word 0x2074656b 800c488: 75657571 .word 0x75657571 800c48c: 61207365 .word 0x61207365 800c490: 776f6c6c .word 0x776f6c6c 800c494: 00216465 .word 0x00216465 800c498: 63656863 .word 0x63656863 800c49c: 6874206b .word 0x6874206b 800c4a0: 66207461 .word 0x66207461 800c4a4: 74737269 .word 0x74737269 800c4a8: 75627020 .word 0x75627020 800c4ac: 61632066 .word 0x61632066 800c4b0: 6f68206e .word 0x6f68206e 800c4b4: 6920646c .word 0x6920646c 800c4b8: 20706d63 .word 0x20706d63 800c4bc: 7373656d .word 0x7373656d 800c4c0: 00656761 .word 0x00656761 800c4c4: 7069776c .word 0x7069776c 800c4c8: 6372732f .word 0x6372732f 800c4cc: 726f632f .word 0x726f632f 800c4d0: 70692f65 .word 0x70692f65 800c4d4: 692f3476 .word 0x692f3476 800c4d8: 2e706d63 .word 0x2e706d63 800c4dc: 72700063 .word 0x72700063 800c4e0: 21207665 .word 0x21207665 800c4e4: 7069203d .word 0x7069203d 800c4e8: 72700072 .word 0x72700072 800c4ec: 3e2d7665 .word 0x3e2d7665 800c4f0: 7478656e .word 0x7478656e 800c4f4: 203d3d20 .word 0x203d3d20 800c4f8: 00727069 .word 0x00727069 800c4fc: 66756270 .word 0x66756270 800c500: 72665f73 .word 0x72665f73 800c504: 20646565 .word 0x20646565 800c508: 6c63202b .word 0x6c63202b 800c50c: 3c206e65 .word 0x3c206e65 800c510: 7830203d .word 0x7830203d 800c514: 66666666 .word 0x66666666 800c518: 5f706900 .word 0x5f706900 800c51c: 73616572 .word 0x73616572 800c520: 62705f73 .word 0x62705f73 800c524: 6f636675 .word 0x6f636675 800c528: 20746e75 .word 0x20746e75 800c52c: 70203d3e .word 0x70203d3e 800c530: 73667562 .word 0x73667562 800c534: 6572665f .word 0x6572665f 800c538: 63006465 .word 0x63006465 800c53c: 6b636568 .word 0x6b636568 800c540: 61726620 .word 0x61726620 800c544: 6e656d67 .word 0x6e656d67 800c548: 64207374 .word 0x64207374 800c54c: 74276e6f .word 0x74276e6f 800c550: 65766f20 .word 0x65766f20 800c554: 70616c72 .word 0x70616c72 800c558: 206f6e00 .word 0x206f6e00 800c55c: 76657270 .word 0x76657270 800c560: 73756f69 .word 0x73756f69 800c564: 61726620 .word 0x61726620 800c568: 6e656d67 .word 0x6e656d67 800c56c: 74202c74 .word 0x74202c74 800c570: 20736968 .word 0x20736968 800c574: 7473756d .word 0x7473756d 800c578: 20656220 .word 0x20656220 800c57c: 20656874 .word 0x20656874 800c580: 73726966 .word 0x73726966 800c584: 72662074 .word 0x72662074 800c588: 656d6761 .word 0x656d6761 800c58c: 0021746e .word 0x0021746e 800c590: 696e6173 .word 0x696e6173 800c594: 63207974 .word 0x63207974 800c598: 6b636568 .word 0x6b636568 800c59c: 6c617600 .word 0x6c617600 800c5a0: 74616469 .word 0x74616469 800c5a4: 61645f65 .word 0x61645f65 800c5a8: 72676174 .word 0x72676174 800c5ac: 6e3a6d61 .word 0x6e3a6d61 800c5b0: 5f747865 .word 0x5f747865 800c5b4: 66756270 .word 0x66756270 800c5b8: 554e3d21 .word 0x554e3d21 800c5bc: 69004c4c .word 0x69004c4c 800c5c0: 65725f70 .word 0x65725f70 800c5c4: 5f737361 .word 0x5f737361 800c5c8: 66756270 .word 0x66756270 800c5cc: 6e756f63 .word 0x6e756f63 800c5d0: 3d3e2074 .word 0x3d3e2074 800c5d4: 656c6320 .word 0x656c6320 800c5d8: 6f6e006e .word 0x6f6e006e 800c5dc: 69662074 .word 0x69662074 800c5e0: 61747372 .word 0x61747372 800c5e4: 6f68746c .word 0x6f68746c 800c5e8: 20686775 .word 0x20686775 800c5ec: 7473756a .word 0x7473756a 800c5f0: 716e6520 .word 0x716e6520 800c5f4: 65756575 .word 0x65756575 800c5f8: 62700064 .word 0x62700064 800c5fc: 725f6675 .word 0x725f6675 800c600: 766f6d65 .word 0x766f6d65 800c604: 65685f65 .word 0x65685f65 800c608: 72656461 .word 0x72656461 800c60c: 69616620 .word 0x69616620 800c610: 0064656c .word 0x0064656c 800c614: 7069776c .word 0x7069776c 800c618: 6372732f .word 0x6372732f 800c61c: 726f632f .word 0x726f632f 800c620: 64752f65 .word 0x64752f65 800c624: 00632e70 .word 0x00632e70 800c628: 6e3e2d70 .word 0x6e3e2d70 800c62c: 20747865 .word 0x20747865 800c630: 4e203d21 .word 0x4e203d21 800c634: 004c4c55 .word 0x004c4c55 800c638: 6c3e2d70 .word 0x6c3e2d70 800c63c: 3d206e65 .word 0x3d206e65 800c640: 0030203d .word 0x0030203d 800c644: 743e2d70 .word 0x743e2d70 800c648: 6c5f746f .word 0x6c5f746f 800c64c: 3d206e65 .word 0x3d206e65 800c650: 2d70203d .word 0x2d70203d 800c654: 78656e3e .word 0x78656e3e 800c658: 743e2d74 .word 0x743e2d74 800c65c: 6c5f746f .word 0x6c5f746f 800c660: 74006e65 .word 0x74006e65 800c664: 695f7063 .word 0x695f7063 800c668: 7475706e .word 0x7475706e 800c66c: 6361203a .word 0x6361203a 800c670: 65766974 .word 0x65766974 800c674: 62637020 .word 0x62637020 800c678: 74733e2d .word 0x74733e2d 800c67c: 20657461 .word 0x20657461 800c680: 43203d21 .word 0x43203d21 800c684: 45534f4c .word 0x45534f4c 800c688: 63740044 .word 0x63740044 800c68c: 6e695f70 .word 0x6e695f70 800c690: 3a747570 .word 0x3a747570 800c694: 74636120 .word 0x74636120 800c698: 20657669 .word 0x20657669 800c69c: 2d626370 .word 0x2d626370 800c6a0: 6174733e .word 0x6174733e 800c6a4: 21206574 .word 0x21206574 800c6a8: 4954203d .word 0x4954203d 800c6ac: 572d454d .word 0x572d454d 800c6b0: 00544941 .word 0x00544941 800c6b4: 5f706374 .word 0x5f706374 800c6b8: 75706e69 .word 0x75706e69 800c6bc: 61203a74 .word 0x61203a74 800c6c0: 76697463 .word 0x76697463 800c6c4: 63702065 .word 0x63702065 800c6c8: 733e2d62 .word 0x733e2d62 800c6cc: 65746174 .word 0x65746174 800c6d0: 203d2120 .word 0x203d2120 800c6d4: 5453494c .word 0x5453494c 800c6d8: 74004e45 .word 0x74004e45 800c6dc: 695f7063 .word 0x695f7063 800c6e0: 7475706e .word 0x7475706e 800c6e4: 6370203a .word 0x6370203a 800c6e8: 6e3e2d62 .word 0x6e3e2d62 800c6ec: 20747865 .word 0x20747865 800c6f0: 70203d21 .word 0x70203d21 800c6f4: 28206263 .word 0x28206263 800c6f8: 6f666562 .word 0x6f666562 800c6fc: 63206572 .word 0x63206572 800c700: 65686361 .word 0x65686361 800c704: 63740029 .word 0x63740029 800c708: 6e695f70 .word 0x6e695f70 800c70c: 3a747570 .word 0x3a747570 800c710: 62637020 .word 0x62637020 800c714: 656e3e2d .word 0x656e3e2d 800c718: 21207478 .word 0x21207478 800c71c: 6370203d .word 0x6370203d 800c720: 61282062 .word 0x61282062 800c724: 72657466 .word 0x72657466 800c728: 63616320 .word 0x63616320 800c72c: 00296568 .word 0x00296568 800c730: 5f706374 .word 0x5f706374 800c734: 75706e69 .word 0x75706e69 800c738: 54203a74 .word 0x54203a74 800c73c: 2d454d49 .word 0x2d454d49 800c740: 54494157 .word 0x54494157 800c744: 62637020 .word 0x62637020 800c748: 74733e2d .word 0x74733e2d 800c74c: 20657461 .word 0x20657461 800c750: 54203d3d .word 0x54203d3d 800c754: 2d454d49 .word 0x2d454d49 800c758: 54494157 .word 0x54494157 800c75c: 70637400 .word 0x70637400 800c760: 706e695f .word 0x706e695f 800c764: 203a7475 .word 0x203a7475 800c768: 2d626370 .word 0x2d626370 800c76c: 6174733e .word 0x6174733e 800c770: 21206574 .word 0x21206574 800c774: 4c43203d .word 0x4c43203d 800c778: 4445534f .word 0x4445534f 800c77c: 62637000 .word 0x62637000 800c780: 6e733e2d .word 0x6e733e2d 800c784: 75715f64 .word 0x75715f64 800c788: 6c657565 .word 0x6c657565 800c78c: 3e206e65 .word 0x3e206e65 800c790: 6e003020 .word 0x6e003020 800c794: 6573206f .word 0x6573206f 800c798: 6e656d67 .word 0x6e656d67 800c79c: 6f742074 .word 0x6f742074 800c7a0: 65726620 .word 0x65726620 800c7a4: 63700065 .word 0x63700065 800c7a8: 6c3e2d62 .word 0x6c3e2d62 800c7ac: 65747369 .word 0x65747369 800c7b0: 2d72656e .word 0x2d72656e 800c7b4: 6363613e .word 0x6363613e 800c7b8: 20747065 .word 0x20747065 800c7bc: 4e203d21 .word 0x4e203d21 800c7c0: 004c4c55 .word 0x004c4c55 800c7c4: 2d626370 .word 0x2d626370 800c7c8: 6665723e .word 0x6665723e 800c7cc: 64657375 .word 0x64657375 800c7d0: 7461645f .word 0x7461645f 800c7d4: 3d3d2061 .word 0x3d3d2061 800c7d8: 4c554e20 .word 0x4c554e20 800c7dc: 6369004c .word 0x6369004c 800c7e0: 695f706d .word 0x695f706d 800c7e4: 7475706e .word 0x7475706e 800c7e8: 6f6d203a .word 0x6f6d203a 800c7ec: 676e6976 .word 0x676e6976 800c7f0: 3e2d7220 .word 0x3e2d7220 800c7f4: 6c796170 .word 0x6c796170 800c7f8: 2064616f .word 0x2064616f 800c7fc: 69206f74 .word 0x69206f74 800c800: 20706d63 .word 0x20706d63 800c804: 64616568 .word 0x64616568 800c808: 66207265 .word 0x66207265 800c80c: 656c6961 .word 0x656c6961 800c810: 63690064 .word 0x63690064 800c814: 695f706d .word 0x695f706d 800c818: 7475706e .word 0x7475706e 800c81c: 6572203a .word 0x6572203a 800c820: 726f7473 .word 0x726f7473 800c824: 20676e69 .word 0x20676e69 800c828: 6769726f .word 0x6769726f 800c82c: 6c616e69 .word 0x6c616e69 800c830: 3e2d7020 .word 0x3e2d7020 800c834: 6c796170 .word 0x6c796170 800c838: 2064616f .word 0x2064616f 800c83c: 6c696166 .word 0x6c696166 800c840: 4d006465 .word 0x4d006465 800c844: 4f4c4c41 .word 0x4f4c4c41 800c848: 35315f43 .word 0x35315f43 800c84c: 4d003633 .word 0x4d003633 800c850: 4f4c4c41 .word 0x4f4c4c41 800c854: 30315f43 .word 0x30315f43 800c858: 4d003432 .word 0x4d003432 800c85c: 4f4c4c41 .word 0x4f4c4c41 800c860: 31355f43 .word 0x31355f43 800c864: 414d0032 .word 0x414d0032 800c868: 434f4c4c .word 0x434f4c4c 800c86c: 0030385f .word 0x0030385f 800c870: 46554250 .word 0x46554250 800c874: 4f4f505f .word 0x4f4f505f 800c878: 4250004c .word 0x4250004c 800c87c: 525f4655 .word 0x525f4655 800c880: 522f4645 .word 0x522f4645 800c884: 53004d4f .word 0x53004d4f 800c888: 545f5359 .word 0x545f5359 800c88c: 4f454d49 .word 0x4f454d49 800c890: 54005455 .word 0x54005455 800c894: 50495043 .word 0x50495043 800c898: 47534d5f .word 0x47534d5f 800c89c: 4950415f .word 0x4950415f 800c8a0: 54454e00 .word 0x54454e00 800c8a4: 4e4e4f43 .word 0x4e4e4f43 800c8a8: 54454e00 .word 0x54454e00 800c8ac: 00465542 .word 0x00465542 800c8b0: 47415246 .word 0x47415246 800c8b4: 5542505f .word 0x5542505f 800c8b8: 45520046 .word 0x45520046 800c8bc: 44535341 .word 0x44535341 800c8c0: 00415441 .word 0x00415441 800c8c4: 5f504354 .word 0x5f504354 800c8c8: 00474553 .word 0x00474553 800c8cc: 5f504354 .word 0x5f504354 800c8d0: 5f424350 .word 0x5f424350 800c8d4: 5453494c .word 0x5453494c 800c8d8: 54004e45 .word 0x54004e45 800c8dc: 505f5043 .word 0x505f5043 800c8e0: 55004243 .word 0x55004243 800c8e4: 505f5044 .word 0x505f5044 800c8e8: 42004243 .word 0x42004243 800c8ec: 5f545247 .word 0x5f545247 800c8f0: 434f5250 .word 0x434f5250 800c8f4: 52474200 .word 0x52474200 800c8f8: 59535f54 .word 0x59535f54 800c8fc: 4200434e .word 0x4200434e 800c900: 5f545247 .word 0x5f545247 800c904: 55455551 .word 0x55455551 800c908: 68540045 .word 0x68540045 800c90c: 70232065 .word 0x70232065 800c910: 6e756f63 .word 0x6e756f63 800c914: 20726574 .word 0x20726574 800c918: 7473756d .word 0x7473756d 800c91c: 746f6e20 .word 0x746f6e20 800c920: 20656220 .word 0x20656220 800c924: 4c4c554e .word 0x4c4c554e 800c928: 67620021 .word 0x67620021 800c92c: 6b2f7472 .word 0x6b2f7472 800c930: 656e7265 .word 0x656e7265 800c934: 63702f6c .word 0x63702f6c 800c938: 746e756f .word 0x746e756f 800c93c: 632e7265 .word 0x632e7265 800c940: 65685400 .word 0x65685400 800c944: 79732320 .word 0x79732320 800c948: 6d20636e .word 0x6d20636e 800c94c: 20747375 .word 0x20747375 800c950: 20746f6e .word 0x20746f6e 800c954: 4e206562 .word 0x4e206562 800c958: 214c4c55 .word 0x214c4c55 800c95c: 72676200 .word 0x72676200 800c960: 656b2f74 .word 0x656b2f74 800c964: 6c656e72 .word 0x6c656e72 800c968: 6e79732f .word 0x6e79732f 800c96c: 00632e63 .word 0x00632e63 800c970: 20656854 .word 0x20656854 800c974: 696c7823 .word 0x696c7823 800c978: 6d207473 .word 0x6d207473 800c97c: 20747375 .word 0x20747375 800c980: 20746f6e .word 0x20746f6e 800c984: 4e206562 .word 0x4e206562 800c988: 214c4c55 .word 0x214c4c55 800c98c: 72676200 .word 0x72676200 800c990: 656b2f74 .word 0x656b2f74 800c994: 6c656e72 .word 0x6c656e72 800c998: 696c782f .word 0x696c782f 800c99c: 632e7473 .word 0x632e7473 800c9a0: 65685400 .word 0x65685400 800c9a4: 75632320 .word 0x75632320 800c9a8: 6e657272 .word 0x6e657272 800c9ac: 756d2074 .word 0x756d2074 800c9b0: 6e207473 .word 0x6e207473 800c9b4: 6220746f .word 0x6220746f 800c9b8: 554e2065 .word 0x554e2065 800c9bc: 00214c4c .word 0x00214c4c 800c9c0: 20656854 .word 0x20656854 800c9c4: 74697023 .word 0x74697023 800c9c8: 6d206d65 .word 0x6d206d65 800c9cc: 20747375 .word 0x20747375 800c9d0: 20746f6e .word 0x20746f6e 800c9d4: 4e206562 .word 0x4e206562 800c9d8: 214c4c55 .word 0x214c4c55 800c9dc: 72676200 .word 0x72676200 800c9e0: 656b2f74 .word 0x656b2f74 800c9e4: 6c656e72 .word 0x6c656e72 800c9e8: 7469702f .word 0x7469702f 800c9ec: 632e6d65 .word 0x632e6d65 800c9f0: 65685400 .word 0x65685400 800c9f4: 74692320 .word 0x74692320 800c9f8: 6d206d65 .word 0x6d206d65 800c9fc: 20747375 .word 0x20747375 800ca00: 20746f6e .word 0x20746f6e 800ca04: 4e206562 .word 0x4e206562 800ca08: 214c4c55 .word 0x214c4c55 800ca0c: 72676200 .word 0x72676200 800ca10: 656b2f74 .word 0x656b2f74 800ca14: 6c656e72 .word 0x6c656e72 800ca18: 6574692f .word 0x6574692f 800ca1c: 00632e6d .word 0x00632e6d 800ca20: 20656854 .word 0x20656854 800ca24: 74697023 .word 0x74697023 800ca28: 3e2d6d65 .word 0x3e2d6d65 800ca2c: 7473696c .word 0x7473696c 800ca30: 73756d20 .word 0x73756d20 800ca34: 6f6e2074 .word 0x6f6e2074 800ca38: 65622074 .word 0x65622074 800ca3c: 4c554e20 .word 0x4c554e20 800ca40: 5400214c .word 0x5400214c 800ca44: 23206568 .word 0x23206568 800ca48: 6d657469 .word 0x6d657469 800ca4c: 72703e2d .word 0x72703e2d 800ca50: 6d207665 .word 0x6d207665 800ca54: 20747375 .word 0x20747375 800ca58: 20746f6e .word 0x20746f6e 800ca5c: 4e206562 .word 0x4e206562 800ca60: 214c4c55 .word 0x214c4c55 800ca64: 65685400 .word 0x65685400 800ca68: 74692320 .word 0x74692320 800ca6c: 3e2d6d65 .word 0x3e2d6d65 800ca70: 7478656e .word 0x7478656e 800ca74: 73756d20 .word 0x73756d20 800ca78: 6f6e2074 .word 0x6f6e2074 800ca7c: 65622074 .word 0x65622074 800ca80: 4c554e20 .word 0x4c554e20 800ca84: 5400214c .word 0x5400214c 800ca88: 23206568 .word 0x23206568 800ca8c: 76657270 .word 0x76657270 800ca90: 656e3e2d .word 0x656e3e2d 800ca94: 6d207478 .word 0x6d207478 800ca98: 20747375 .word 0x20747375 800ca9c: 20746f6e .word 0x20746f6e 800caa0: 4e206562 .word 0x4e206562 800caa4: 214c4c55 .word 0x214c4c55 800caa8: 65685400 .word 0x65685400 800caac: 656e2320 .word 0x656e2320 800cab0: 3e2d7478 .word 0x3e2d7478 800cab4: 76657270 .word 0x76657270 800cab8: 73756d20 .word 0x73756d20 800cabc: 6f6e2074 .word 0x6f6e2074 800cac0: 65622074 .word 0x65622074 800cac4: 4c554e20 .word 0x4c554e20 800cac8: 5400214c .word 0x5400214c 800cacc: 23206568 .word 0x23206568 800cad0: 636f7270 .word 0x636f7270 800cad4: 73756d20 .word 0x73756d20 800cad8: 6f6e2074 .word 0x6f6e2074 800cadc: 65622074 .word 0x65622074 800cae0: 4c554e20 .word 0x4c554e20 800cae4: 6200214c .word 0x6200214c 800cae8: 2f747267 .word 0x2f747267 800caec: 6e72656b .word 0x6e72656b 800caf0: 732f6c65 .word 0x732f6c65 800caf4: 64656863 .word 0x64656863 800caf8: 6200632e .word 0x6200632e 800cafc: 2f747267 .word 0x2f747267 800cb00: 6e72656b .word 0x6e72656b 800cb04: 702f6c65 .word 0x702f6c65 800cb08: 2e636f72 .word 0x2e636f72 800cb0c: 68540063 .word 0x68540063 800cb10: 6f232065 .word 0x6f232065 800cb14: 72656e77 .word 0x72656e77 800cb18: 73756d20 .word 0x73756d20 800cb1c: 6f6e2074 .word 0x6f6e2074 800cb20: 65622074 .word 0x65622074 800cb24: 4c554e20 .word 0x4c554e20 800cb28: 6e00214c .word 0x6e00214c 800cb2c: 66697465 .word 0x66697465 800cb30: 77683e2d .word 0x77683e2d 800cb34: 72646461 .word 0x72646461 800cb38: 6e656c5f .word 0x6e656c5f 800cb3c: 73756d20 .word 0x73756d20 800cb40: 65622074 .word 0x65622074 800cb44: 66203620 .word 0x66203620 800cb48: 6520726f .word 0x6520726f 800cb4c: 72656874 .word 0x72656874 800cb50: 5f74656e .word 0x5f74656e 800cb54: 7074756f .word 0x7074756f 800cb58: 00217475 .word 0x00217475 800cb5c: 7069776c .word 0x7069776c 800cb60: 6372732f .word 0x6372732f 800cb64: 74656e2f .word 0x74656e2f 800cb68: 652f6669 .word 0x652f6669 800cb6c: 72656874 .word 0x72656874 800cb70: 2e74656e .word 0x2e74656e 800cb74: 656d0063 .word 0x656d0063 800cb78: 616d5f6d .word 0x616d5f6d 800cb7c: 636f6c6c .word 0x636f6c6c 800cb80: 203a2928 .word 0x203a2928 800cb84: 70206f6e .word 0x70206f6e 800cb88: 206c6f6f .word 0x206c6f6f 800cb8c: 74207369 .word 0x74207369 800cb90: 20746168 .word 0x20746168 800cb94: 21676962 .word 0x21676962 800cb98: 69776c00 .word 0x69776c00 800cb9c: 72732f70 .word 0x72732f70 800cba0: 6f632f63 .word 0x6f632f63 800cba4: 6d2f6572 .word 0x6d2f6572 800cba8: 632e6d65 .word 0x632e6d65 800cbac: 6f626d00 .word 0x6f626d00 800cbb0: 713e2d78 .word 0x713e2d78 800cbb4: 65756575 .word 0x65756575 800cbb8: 203d2120 .word 0x203d2120 800cbbc: 4c4c554e .word 0x4c4c554e 800cbc0: 2f6b6d00 .word 0x2f6b6d00 800cbc4: 7069776c .word 0x7069776c 800cbc8: 7267622f .word 0x7267622f 800cbcc: 79732f74 .word 0x79732f74 800cbd0: 72615f73 .word 0x72615f73 800cbd4: 632e6863 .word 0x632e6863 800cbd8: 20747300 .word 0x20747300 800cbdc: 42203d3d .word 0x42203d3d 800cbe0: 5f545247 .word 0x5f545247 800cbe4: 525f5453 .word 0x525f5453 800cbe8: 004c4c4f .word 0x004c4c4f 800cbec: 20656854 .word 0x20656854 800cbf0: 696c7823 .word 0x696c7823 800cbf4: 6d207473 .word 0x6d207473 800cbf8: 20747375 .word 0x20747375 800cbfc: 20746f6e .word 0x20746f6e 800cc00: 78206562 .word 0x78206562 800cc04: 7473696c .word 0x7473696c 800cc08: 68540021 .word 0x68540021 800cc0c: 68232065 .word 0x68232065 800cc10: 20646165 .word 0x20646165 800cc14: 7473756d .word 0x7473756d 800cc18: 746f6e20 .word 0x746f6e20 800cc1c: 20656220 .word 0x20656220 800cc20: 4c4c554e .word 0x4c4c554e 800cc24: 68540021 .word 0x68540021 800cc28: 68232065 .word 0x68232065 800cc2c: 2d646165 .word 0x2d646165 800cc30: 6572703e .word 0x6572703e 800cc34: 756d2076 .word 0x756d2076 800cc38: 6e207473 .word 0x6e207473 800cc3c: 6220746f .word 0x6220746f 800cc40: 554e2065 .word 0x554e2065 800cc44: 00214c4c .word 0x00214c4c 800cc48: 20656854 .word 0x20656854 800cc4c: 61656823 .word 0x61656823 800cc50: 6e3e2d64 .word 0x6e3e2d64 800cc54: 20747865 .word 0x20747865 800cc58: 7473756d .word 0x7473756d 800cc5c: 746f6e20 .word 0x746f6e20 800cc60: 20656220 .word 0x20656220 800cc64: 4c4c554e .word 0x4c4c554e 800cc68: 68540021 .word 0x68540021 800cc6c: 76232065 .word 0x76232065 800cc70: 756d2061 .word 0x756d2061 800cc74: 6e207473 .word 0x6e207473 800cc78: 6220746f .word 0x6220746f 800cc7c: 554e2065 .word 0x554e2065 800cc80: 00214c4c .word 0x00214c4c 800cc84: 74726762 .word 0x74726762 800cc88: 62696c2f .word 0x62696c2f 800cc8c: 616e2f73 .word 0x616e2f73 800cc90: 65766974 .word 0x65766974 800cc94: 6d65732f .word 0x6d65732f 800cc98: 5400632e .word 0x5400632e 800cc9c: 23206568 .word 0x23206568 800cca0: 206d6573 .word 0x206d6573 800cca4: 7473756d .word 0x7473756d 800cca8: 746f6e20 .word 0x746f6e20 800ccac: 20656220 .word 0x20656220 800ccb0: 4c4c554e .word 0x4c4c554e 800ccb4: 68540021 .word 0x68540021 800ccb8: 74232065 .word 0x74232065 800ccbc: 6863756f .word 0x6863756f 800ccc0: 73756d20 .word 0x73756d20 800ccc4: 6f6e2074 .word 0x6f6e2074 800ccc8: 65622074 .word 0x65622074 800cccc: 4c554e20 .word 0x4c554e20 800ccd0: 5400214c .word 0x5400214c 800ccd4: 23206568 .word 0x23206568 800ccd8: 74617473 .word 0x74617473 800ccdc: 756d2065 .word 0x756d2065 800cce0: 6e207473 .word 0x6e207473 800cce4: 6220746f .word 0x6220746f 800cce8: 554e2065 .word 0x554e2065 800ccec: 00214c4c .word 0x00214c4c 800ccf0: 5f706374 .word 0x5f706374 800ccf4: 7074756f .word 0x7074756f 800ccf8: 665f7475 .word 0x665f7475 800ccfc: 5f6c6c69 .word 0x5f6c6c69 800cd00: 6974706f .word 0x6974706f 800cd04: 3a736e6f .word 0x3a736e6f 800cd08: 766e6920 .word 0x766e6920 800cd0c: 64696c61 .word 0x64696c61 800cd10: 75627020 .word 0x75627020 800cd14: 756d0066 .word 0x756d0066 800cd18: 2d786574 .word 0x2d786574 800cd1c: 78746d3e .word 0x78746d3e 800cd20: 203d2120 .word 0x203d2120 800cd24: 4c4c554e .word 0x4c4c554e 800cd28: 70637400 .word 0x70637400 800cd2c: 745f7069 .word 0x745f7069 800cd30: 61657268 .word 0x61657268 800cd34: 69203a64 .word 0x69203a64 800cd38: 6c61766e .word 0x6c61766e 800cd3c: 6d206469 .word 0x6d206469 800cd40: 61737365 .word 0x61737365 800cd44: 63006567 .word 0x63006567 800cd48: 6b636568 .word 0x6b636568 800cd4c: 61687420 .word 0x61687420 800cd50: 69662074 .word 0x69662074 800cd54: 20747372 .word 0x20747372 800cd58: 66756270 .word 0x66756270 800cd5c: 6e616320 .word 0x6e616320 800cd60: 6c6f6820 .word 0x6c6f6820 800cd64: 74732064 .word 0x74732064 800cd68: 74637572 .word 0x74637572 800cd6c: 70637420 .word 0x70637420 800cd70: 7264685f .word 0x7264685f 800cd74: 70637400 .word 0x70637400 800cd78: 74756f5f .word 0x74756f5f 800cd7c: 5f747570 .word 0x5f747570 800cd80: 6f6c6c61 .word 0x6f6c6c61 800cd84: 65685f63 .word 0x65685f63 800cd88: 72656461 .word 0x72656461 800cd8c: 6e69203a .word 0x6e69203a 800cd90: 696c6176 .word 0x696c6176 800cd94: 63702064 .word 0x63702064 800cd98: 62700062 .word 0x62700062 800cd9c: 635f6675 .word 0x635f6675 800cda0: 2079706f .word 0x2079706f 800cda4: 6c696166 .word 0x6c696166 800cda8: 73006465 .word 0x73006465 800cdac: 6b636174 .word 0x6b636174 800cdb0: 203d2120 .word 0x203d2120 800cdb4: 4c4c554e .word 0x4c4c554e 800cdb8: 72687400 .word 0x72687400 800cdbc: 2e646165 .word 0x2e646165 800cdc0: 636f7270 .word 0x636f7270 800cdc4: 203d2120 .word 0x203d2120 800cdc8: 4c4c554e .word 0x4c4c554e 800cdcc: 30255b00 .word 0x30255b00 800cdd0: 5d786c38 .word 0x5d786c38 800cdd4: 72687420 .word 0x72687420 800cdd8: 5b646165 .word 0x5b646165 800cddc: 3d5d7325 .word 0x3d5d7325 800cde0: 66207025 .word 0x66207025 800cde4: 70253d6e .word 0x70253d6e 800cde8: 69727020 .word 0x69727020 800cdec: 64253d6f .word 0x64253d6f 800cdf0: 61747320 .word 0x61747320 800cdf4: 253d6b63 .word 0x253d6b63 800cdf8: 23000a64 .word 0x23000a64 800cdfc: 75657571 .word 0x75657571 800ce00: 756d2065 .word 0x756d2065 800ce04: 6e207473 .word 0x6e207473 800ce08: 6220746f .word 0x6220746f 800ce0c: 554e2065 .word 0x554e2065 800ce10: 62004c4c .word 0x62004c4c 800ce14: 2f747267 .word 0x2f747267 800ce18: 7362696c .word 0x7362696c 800ce1c: 74616e2f .word 0x74616e2f 800ce20: 2f657669 .word 0x2f657669 800ce24: 75657571 .word 0x75657571 800ce28: 00632e65 .word 0x00632e65 800ce2c: 65757123 .word 0x65757123 800ce30: 3e2d6575 .word 0x3e2d6575 800ce34: 20716564 .word 0x20716564 800ce38: 7473756d .word 0x7473756d 800ce3c: 746f6e20 .word 0x746f6e20 800ce40: 20656220 .word 0x20656220 800ce44: 4c4c554e .word 0x4c4c554e 800ce48: 75712300 .word 0x75712300 800ce4c: 2d657565 .word 0x2d657565 800ce50: 716e653e .word 0x716e653e 800ce54: 6d65732e .word 0x6d65732e 800ce58: 73756d20 .word 0x73756d20 800ce5c: 6f6e2074 .word 0x6f6e2074 800ce60: 65622074 .word 0x65622074 800ce64: 4c554e20 .word 0x4c554e20 800ce68: 7261004c .word 0x7261004c 800ce6c: 61745f70 .word 0x61745f70 800ce70: 5b656c62 .word 0x5b656c62 800ce74: 712e5d69 .word 0x712e5d69 800ce78: 203d3d20 .word 0x203d3d20 800ce7c: 4c4c554e .word 0x4c4c554e 800ce80: 70726100 .word 0x70726100 800ce84: 6261745f .word 0x6261745f 800ce88: 695b656c .word 0x695b656c 800ce8c: 74732e5d .word 0x74732e5d 800ce90: 20657461 .word 0x20657461 800ce94: 45203d3d .word 0x45203d3d 800ce98: 52414854 .word 0x52414854 800ce9c: 54535f50 .word 0x54535f50 800cea0: 5f455441 .word 0x5f455441 800cea4: 54504d45 .word 0x54504d45 800cea8: 255b0059 .word 0x255b0059 800ceac: 786c3830 .word 0x786c3830 800ceb0: 656e205d .word 0x656e205d 800ceb4: 20666974 .word 0x20666974 800ceb8: 4e203d21 .word 0x4e203d21 800cebc: 004c4c55 .word 0x004c4c55 800cec0: 3830255b .word 0x3830255b 800cec4: 205d786c .word 0x205d786c 800cec8: 6974656e .word 0x6974656e 800cecc: 73692066 .word 0x73692066 800ced0: 746f6e20 .word 0x746f6e20 800ced4: 2c707520 .word 0x2c707520 800ced8: 646c6f20 .word 0x646c6f20 800cedc: 79747320 .word 0x79747320 800cee0: 7020656c .word 0x7020656c 800cee4: 3f74726f .word 0x3f74726f 800cee8: 63686400 .word 0x63686400 800ceec: 6e695f70 .word 0x6e695f70 800cef0: 63705f63 .word 0x63705f63 800cef4: 65725f62 .word 0x65725f62 800cef8: 756f6366 .word 0x756f6366 800cefc: 2928746e .word 0x2928746e 800cf00: 656d203a .word 0x656d203a 800cf04: 79726f6d .word 0x79726f6d 800cf08: 61656c20 .word 0x61656c20 800cf0c: 255b006b .word 0x255b006b 800cf10: 786c3830 .word 0x786c3830 800cf14: 6475205d .word 0x6475205d 800cf18: 6f635f70 .word 0x6f635f70 800cf1c: 63656e6e .word 0x63656e6e 800cf20: 69203a74 .word 0x69203a74 800cf24: 6c61766e .word 0x6c61766e 800cf28: 70206469 .word 0x70206469 800cf2c: 5b006263 .word 0x5b006263 800cf30: 6c383025 .word 0x6c383025 800cf34: 75205d78 .word 0x75205d78 800cf38: 725f7064 .word 0x725f7064 800cf3c: 3a766365 .word 0x3a766365 800cf40: 766e6920 .word 0x766e6920 800cf44: 64696c61 .word 0x64696c61 800cf48: 62637020 .word 0x62637020 800cf4c: 62637000 .word 0x62637000 800cf50: 6e733e2d .word 0x6e733e2d 800cf54: 75715f64 .word 0x75715f64 800cf58: 6c657565 .word 0x6c657565 800cf5c: 3e206e65 .word 0x3e206e65 800cf60: 6270203d .word 0x6270203d 800cf64: 635f6675 .word 0x635f6675 800cf68: 286e656c .word 0x286e656c 800cf6c: 7478656e .word 0x7478656e 800cf70: 29703e2d .word 0x29703e2d 800cf74: 70637400 .word 0x70637400 800cf78: 6365725f .word 0x6365725f 800cf7c: 65766965 .word 0x65766965 800cf80: 6176203a .word 0x6176203a 800cf84: 2064696c .word 0x2064696c 800cf88: 75657571 .word 0x75657571 800cf8c: 656c2065 .word 0x656c2065 800cf90: 6874676e .word 0x6874676e 800cf94: 75627000 .word 0x75627000 800cf98: 72665f66 .word 0x72665f66 800cf9c: 203a6565 .word 0x203a6565 800cfa0: 723e2d70 .word 0x723e2d70 800cfa4: 3e206665 .word 0x3e206665 800cfa8: 70003020 .word 0x70003020 800cfac: 633e2d63 .word 0x633e2d63 800cfb0: 6f747375 .word 0x6f747375 800cfb4: 72665f6d .word 0x72665f6d 800cfb8: 665f6565 .word 0x665f6565 800cfbc: 74636e75 .word 0x74636e75 800cfc0: 206e6f69 .word 0x206e6f69 800cfc4: 4e203d21 .word 0x4e203d21 800cfc8: 004c4c55 .word 0x004c4c55 800cfcc: 6d656d72 .word 0x6d656d72 800cfd0: 203d3d20 .word 0x203d3d20 800cfd4: 5f4d454d .word 0x5f4d454d 800cfd8: 47494c41 .word 0x47494c41 800cfdc: 6d72284e .word 0x6d72284e 800cfe0: 00296d65 .word 0x00296d65 800cfe4: 6d656d68 .word 0x6d656d68 800cfe8: 203d3d20 .word 0x203d3d20 800cfec: 5f4d454d .word 0x5f4d454d 800cff0: 47494c41 .word 0x47494c41 800cff4: 6d68284e .word 0x6d68284e 800cff8: 00296d65 .word 0x00296d65 800cffc: 6d656d68 .word 0x6d656d68 800d000: 6f703e2d .word 0x6f703e2d 800d004: 726e6c6f .word 0x726e6c6f 800d008: 4d203c20 .word 0x4d203c20 800d00c: 5f504d45 .word 0x5f504d45 800d010: 0058414d .word 0x0058414d 800d014: 61766e69 .word 0x61766e69 800d018: 2064696c .word 0x2064696c 800d01c: 66756270 .word 0x66756270 800d020: 70797420 .word 0x70797420 800d024: 2d700065 .word 0x2d700065 800d028: 6665723e .word 0x6665723e 800d02c: 203d3d20 .word 0x203d3d20 800d030: 776c0031 .word 0x776c0031 800d034: 732f7069 .word 0x732f7069 800d038: 632f6372 .word 0x632f6372 800d03c: 2f65726f .word 0x2f65726f 800d040: 34767069 .word 0x34767069 800d044: 3470692f .word 0x3470692f 800d048: 6300632e .word 0x6300632e 800d04c: 6b636568 .word 0x6b636568 800d050: 61687420 .word 0x61687420 800d054: 69662074 .word 0x69662074 800d058: 20747372 .word 0x20747372 800d05c: 66756270 .word 0x66756270 800d060: 6e616320 .word 0x6e616320 800d064: 6c6f6820 .word 0x6c6f6820 800d068: 74732064 .word 0x74732064 800d06c: 74637572 .word 0x74637572 800d070: 5f706920 .word 0x5f706920 800d074: 00726468 .word 0x00726468 800d078: 3830255b .word 0x3830255b 800d07c: 205d786c .word 0x205d786c 800d080: 5f347069 .word 0x5f347069 800d084: 67617266 .word 0x67617266 800d088: 203a2928 .word 0x203a2928 800d08c: 66756270 .word 0x66756270 800d090: 6f6f7420 .word 0x6f6f7420 800d094: 6f687320 .word 0x6f687320 800d098: 74007472 .word 0x74007472 800d09c: 20736968 .word 0x20736968 800d0a0: 6465656e .word 0x6465656e 800d0a4: 20612073 .word 0x20612073 800d0a8: 66756270 .word 0x66756270 800d0ac: 206e6920 .word 0x206e6920 800d0b0: 20656e6f .word 0x20656e6f 800d0b4: 63656970 .word 0x63656970 800d0b8: 70002165 .word 0x70002165 800d0bc: 656c3e2d .word 0x656c3e2d 800d0c0: 3d3e206e .word 0x3d3e206e 800d0c4: 666f7020 .word 0x666f7020 800d0c8: 656e0066 .word 0x656e0066 800d0cc: 2d666974 .word 0x2d666974 800d0d0: 6177683e .word 0x6177683e 800d0d4: 5f726464 .word 0x5f726464 800d0d8: 206e656c .word 0x206e656c 800d0dc: 45203d3d .word 0x45203d3d 800d0e0: 485f4854 .word 0x485f4854 800d0e4: 44444157 .word 0x44444157 800d0e8: 454c5f52 .word 0x454c5f52 800d0ec: 255b004e .word 0x255b004e 800d0f0: 786c3830 .word 0x786c3830 800d0f4: 6475205d .word 0x6475205d 800d0f8: 65735f70 .word 0x65735f70 800d0fc: 6f74646e .word 0x6f74646e 800d100: 5f66695f .word 0x5f66695f 800d104: 3a637273 .word 0x3a637273 800d108: 766e6920 .word 0x766e6920 800d10c: 64696c61 .word 0x64696c61 800d110: 62637020 .word 0x62637020 800d114: 30255b00 .word 0x30255b00 800d118: 5d786c38 .word 0x5d786c38 800d11c: 70647520 .word 0x70647520 800d120: 6e65735f .word 0x6e65735f 800d124: 5f6f7464 .word 0x5f6f7464 800d128: 735f6669 .word 0x735f6669 800d12c: 203a6372 .word 0x203a6372 800d130: 61766e69 .word 0x61766e69 800d134: 2064696c .word 0x2064696c 800d138: 66756270 .word 0x66756270 800d13c: 30255b00 .word 0x30255b00 800d140: 5d786c38 .word 0x5d786c38 800d144: 70647520 .word 0x70647520 800d148: 6e65735f .word 0x6e65735f 800d14c: 5f6f7464 .word 0x5f6f7464 800d150: 735f6669 .word 0x735f6669 800d154: 203a6372 .word 0x203a6372 800d158: 61766e69 .word 0x61766e69 800d15c: 2064696c .word 0x2064696c 800d160: 6974656e .word 0x6974656e 800d164: 68630066 .word 0x68630066 800d168: 206b6365 .word 0x206b6365 800d16c: 74616874 .word 0x74616874 800d170: 72696620 .word 0x72696620 800d174: 70207473 .word 0x70207473 800d178: 20667562 .word 0x20667562 800d17c: 206e6163 .word 0x206e6163 800d180: 646c6f68 .word 0x646c6f68 800d184: 72747320 .word 0x72747320 800d188: 20746375 .word 0x20746375 800d18c: 5f706475 .word 0x5f706475 800d190: 00726468 .word 0x00726468 800d194: 3830255b .word 0x3830255b 800d198: 205d786c .word 0x205d786c 800d19c: 5f706475 .word 0x5f706475 800d1a0: 646e6573 .word 0x646e6573 800d1a4: 695f6f74 .word 0x695f6f74 800d1a8: 69203a66 .word 0x69203a66 800d1ac: 6c61766e .word 0x6c61766e 800d1b0: 70206469 .word 0x70206469 800d1b4: 5b006263 .word 0x5b006263 800d1b8: 6c383025 .word 0x6c383025 800d1bc: 75205d78 .word 0x75205d78 800d1c0: 735f7064 .word 0x735f7064 800d1c4: 74646e65 .word 0x74646e65 800d1c8: 66695f6f .word 0x66695f6f 800d1cc: 6e69203a .word 0x6e69203a 800d1d0: 696c6176 .word 0x696c6176 800d1d4: 62702064 .word 0x62702064 800d1d8: 5b006675 .word 0x5b006675 800d1dc: 6c383025 .word 0x6c383025 800d1e0: 75205d78 .word 0x75205d78 800d1e4: 735f7064 .word 0x735f7064 800d1e8: 74646e65 .word 0x74646e65 800d1ec: 66695f6f .word 0x66695f6f 800d1f0: 6e69203a .word 0x6e69203a 800d1f4: 696c6176 .word 0x696c6176 800d1f8: 656e2064 .word 0x656e2064 800d1fc: 00666974 .word 0x00666974 800d200: 3830255b .word 0x3830255b 800d204: 205d786c .word 0x205d786c 800d208: 70636864 .word 0x70636864 800d20c: 6c65735f .word 0x6c65735f 800d210: 3a746365 .word 0x3a746365 800d214: 74656e20 .word 0x74656e20 800d218: 21206669 .word 0x21206669 800d21c: 554e203d .word 0x554e203d 800d220: 5b004c4c .word 0x5b004c4c 800d224: 6c383025 .word 0x6c383025 800d228: 64205d78 .word 0x64205d78 800d22c: 5f706368 .word 0x5f706368 800d230: 656c6573 .word 0x656c6573 800d234: 203a7463 .word 0x203a7463 800d238: 70636864 .word 0x70636864 800d23c: 203d2120 .word 0x203d2120 800d240: 4c4c554e .word 0x4c4c554e 800d244: 6d634100 .word 0x6d634100 800d248: 6f432065 .word 0x6f432065 800d24c: 45007072 .word 0x45007072 800d250: 54494d43 .word 0x54494d43 800d254: 38413300 .word 0x38413300 800d258: 32413136 .word 0x32413136 800d25c: 37434132 .word 0x37434132 800d260: 00000044 .word 0x00000044 0800d264 <_aInitStr.0>: 800d264: 00000000 54540000 45522052 53454747 ......TTR REGGES 800d274: 00000000 .... 0800d278 : 800d278: 0800c8ff 200080f0 00040090 20007eac ....... .....~. 800d288: 20007ea8 .~. 0800d28c : 800d28c: 0800c8f5 20007e98 0008009c 200079b4 .....~. .....y. 800d29c: 200079b0 .y. 0800d2a0 : 800d2a0: 0800d494 0800d480 0800d46c 0800d458 ........l...X... 800d2b0: 0800d444 0800d430 0800d41c 0800d408 D...0........... 800d2c0: 0800d3f4 0800d3e0 0800d3cc 0800d3b8 ................ 800d2d0: 0800d3a4 0800d390 0800d37c 0800d368 ........|...h... 0800d2e0 : 800d2e0: 0800c8eb 200079a0 000400c8 2000767c .....y. ....|v. 800d2f0: 20007678 xv. 0800d2f4 : 800d2f4: 000000fa 080040ad 000003e8 08005fc9 .....@......._.. 800d304: 000003e8 080059e1 0000ea60 08005495 .....Y..`....T.. 800d314: 000001f4 080056c1 00000064 080058c9 .....V..d....X.. 0800d324 <__func__.0>: 800d324: 656c6469 00000000 idle.... 0800d32c : 800d32c: 00000000 .... 0800d330 : 800d330: 2000125c 20001254 20001214 20001218 \.. T.. ... ... 0800d340 : 800d340: 03 06 0c 18 30 60 78 ....0`x 0800d347 : 800d347: 04030201 07070605 07070707 ............. 0800d354 : 800d354: ffffffff .... 0800d358 : 800d358: 01 03 1c ... 0800d35b : 800d35b: 00 00 00 00 00 00 ...... 0800d361 : 800d361: ffffffff ....... 0800d368 : 800d368: 0800c843 20001fb4 00020604 200013a8 C...... ....... 800d378: 200013a4 ... 0800d37c : 800d37c: 0800c84f 200027d4 00020404 20001fc8 O....'. ....... 800d38c: 20001fc4 ... 0800d390 : 800d390: 0800c85b 20002ffc 00040204 200027e8 [..../. .....'. 800d3a0: 200027e4 .'. 0800d3a4 : 800d3a4: 0800c866 20004514 00400054 20003010 f....E. T.@..0. 800d3b4: 2000300c .0. 0800d3b8 : 800d3b8: 0800c870 20006b2c 00100260 20004528 p...,k. `...(E. 800d3c8: 20004524 $E. 0800d3cc : 800d3cc: 0800c87a 20006c44 00100010 20006b40 z...Dl. ....@k. 800d3dc: 20006b3c : 800d3e0: 0800c887 20006cbc 00060010 20006c58 .....l. ....Xl. 800d3f0: 20006c54 Tl. 0800d3f4 : 800d3f4: 0800c893 20006d34 0008000c 20006cd0 ....4m. .....l. 800d404: 20006ccc .l. 0800d408 : 800d408: 0800c8a1 20006dec 00040028 20006d48 .....m. (...Hm. 800d418: 20006d44 Dm. 0800d41c : 800d41c: 0800c8a9 20006e24 00020010 20006e00 ....$n. .....n. 800d42c: 20006dfc .m. 0800d430 : 800d430: 0800c8b0 20006fa4 000f0018 20006e38 .....o. ....8n. 800d440: 20006e34 4n. 0800d444 : 800d444: 0800c8ba 2000705c 00050020 20006fb8 ....\p. ....o. 800d454: 20006fb4 .o. 0800d458 : 800d458: 0800c8c4 200071b4 00100014 20007070 .....q. ....pp. 800d468: 2000706c lp. 0800d46c : 800d46c: 0800c8cc 200072ac 0008001c 200071c8 .....r. .....q. 800d47c: 200071c4 .q. 0800d480 : 800d480: 0800c8db 200075d0 0005009c 200072c0 .....u. .....r. 800d490: 200072bc .r. 0800d494 : 800d494: 0800c8e3 20007668 00040020 200075e4 ....hv. ....u. 800d4a4: 200075e0 .u. 0800d4a8 : 800d4a8: 08000605 080006d1 080006e9 08000823 ............#... 800d4b8: 0800086f 08000915 080008f1 0800093d o...........=... 800d4c8: 08000ee1 080009bb 08000bc5 50000000 ...............P 800d4d8: 00c00001 .... 0800d4dc : 800d4dc: 02000112 40000000 27026666 02010200 .......@ff.'.... 800d4ec: 00000100 .... 0800d4f0 : 800d4f0: 0800d245 0800d24f 0800d255 E...O...U... 0800d4fc : 800d4fc: 08008535 08008553 08007ec7 08007ef1 5...S....~...~.. 800d50c: 08007f09 080077c9 08007ebd 080077d3 .....w...~...w.. 800d51c: 08008b51 080077dd 08007801 080089c1 Q....w...x...... 800d52c: 08008ca5 08007975 08008cf1 080087e1 ....uy.......... 800d53c: 08008f8d 08008935 08007f79 08008b7d ....5...y...}... 800d54c: 08007c29 08007811 )|...x.. 0800d554 : 800d554: 00500209 80000102 00040932 06020100 ..P.....2....... 800d564: 24050000 05012000 01000624 030f240d ...$. ..$....$.. 800d574: 00000000 000005ea 83050700 ff004003 .............@.. 800d584: 00010409 00000a00 01040900 000a0201 ................ 800d594: 05070000 00400282 02050701 01004002 ......@......@..