@@ -335,16 +335,32 @@ static void elf_emit_note(FAR struct elf_dumpinfo_s *cinfo)
335
335
static void elf_emit_tcb_stack (FAR struct elf_dumpinfo_s * cinfo ,
336
336
FAR struct tcb_s * tcb )
337
337
{
338
- FAR void * buf ;
338
+ FAR void * buf = NULL ;
339
+ uintptr_t sp ;
339
340
size_t len ;
340
341
341
342
if (running_task () != tcb )
342
343
{
343
- len = ((uintptr_t )tcb -> stack_base_ptr + tcb -> adj_stack_size ) -
344
- up_getusrsp (tcb -> xcp .regs );
345
- buf = (FAR void * )up_getusrsp (tcb -> xcp .regs );
344
+ sp = up_getusrsp (tcb -> xcp .regs );
345
+
346
+ if (sp > (uintptr_t )tcb -> stack_base_ptr &&
347
+ sp < (uintptr_t )tcb -> stack_base_ptr + tcb -> adj_stack_size )
348
+ {
349
+ len = ((uintptr_t )tcb -> stack_base_ptr +
350
+ tcb -> adj_stack_size ) - sp ;
351
+ buf = (FAR void * )sp ;
352
+ }
353
+ #ifdef CONFIG_STACK_COLORATION
354
+ else
355
+ {
356
+ len = up_check_tcbstack (tcb );
357
+ buf = (FAR void * )((uintptr_t )tcb -> stack_base_ptr +
358
+ (tcb -> adj_stack_size - len ));
359
+ }
360
+ #endif
346
361
}
347
- else
362
+
363
+ if (buf == NULL )
348
364
{
349
365
buf = (FAR void * )tcb -> stack_alloc_ptr ;
350
366
len = tcb -> adj_stack_size +
@@ -422,13 +438,32 @@ static void elf_emit_tcb_phdr(FAR struct elf_dumpinfo_s *cinfo,
422
438
FAR struct tcb_s * tcb ,
423
439
FAR Elf_Phdr * phdr , off_t * offset )
424
440
{
441
+ uintptr_t sp ;
442
+
443
+ phdr -> p_vaddr = 0 ;
444
+
425
445
if (running_task () != tcb )
426
446
{
427
- phdr -> p_filesz = (uintptr_t )(tcb -> stack_base_ptr +
428
- tcb -> adj_stack_size ) - up_getusrsp (tcb -> xcp .regs );
429
- phdr -> p_vaddr = up_getusrsp (tcb -> xcp .regs );
447
+ sp = up_getusrsp (tcb -> xcp .regs );
448
+
449
+ if (sp > (uintptr_t )tcb -> stack_base_ptr &&
450
+ sp < (uintptr_t )tcb -> stack_base_ptr + tcb -> adj_stack_size )
451
+ {
452
+ phdr -> p_filesz = ((uintptr_t )tcb -> stack_base_ptr +
453
+ tcb -> adj_stack_size ) - sp ;
454
+ phdr -> p_vaddr = sp ;
455
+ }
456
+ #ifdef CONFIG_STACK_COLORATION
457
+ else
458
+ {
459
+ phdr -> p_filesz = up_check_tcbstack (tcb );
460
+ phdr -> p_vaddr = (uintptr_t )tcb -> stack_base_ptr +
461
+ (tcb -> adj_stack_size - phdr -> p_filesz );
462
+ }
463
+ #endif
430
464
}
431
- else
465
+
466
+ if (phdr -> p_vaddr == 0 )
432
467
{
433
468
phdr -> p_vaddr = (uintptr_t )tcb -> stack_alloc_ptr ;
434
469
phdr -> p_filesz = tcb -> adj_stack_size +
0 commit comments