Changeset 443
- Timestamp:
- Jul 14, 2020, 7:49:28 PM (3 years ago)
- Location:
- EcnlProtoTool/trunk
- Files:
-
- 1 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/ntshell/src/main.c
r442 r443 75 75 #include "netcmd.h" 76 76 #endif 77 #include "../musl-1.1.18/include/elf.h" 77 78 78 79 ID ws_api_mailboxid = MAIN_DATAQUEUE; … … 122 123 static void main_timeout(struct main_obj_t *obj, bool_t wakeup); 123 124 static int execute_command(struct main_obj_t *obj, int wait); 125 static const Elf32_Ehdr *load_elf(const uint8_t *file); 126 static void execute_elf(const Elf32_Ehdr *, long *args); 124 127 static int usrcmd_ntopt_callback(long *args, void *extobj); 125 128 #ifndef NTSHELL_NO_SOCKET … … 134 137 int shellcmd_exit_code; 135 138 volatile int shellcmd_state; 136 typedef void (* PowerOn_Reset_t)(long *args);139 typedef void (*elf_entry_t)(long *args); 137 140 jmp_buf shellcmd_exit; 138 141 … … 549 552 550 553 if ((found == 0) && setjmp(shellcmd_exit) == 0) { 551 found = 1; 552 (*((PowerOn_Reset_t *)0x18200000))(args); 554 const Elf32_Ehdr *elf = load_elf((const uint8_t *)0x18200000); 555 if (elf != NULL) { 556 found = 1; 557 execute_elf(elf, args); 558 } 553 559 } 554 560 … … 643 649 } 644 650 651 const Elf32_Ehdr *load_elf(const uint8_t *file) 652 { 653 Elf32_Ehdr Ehdr; 654 655 memcpy(&Ehdr, &file[0], sizeof(Elf32_Ehdr)); 656 657 // Magic 658 if ((Ehdr.e_ident[EI_MAG0] != ELFMAG0) 659 || (Ehdr.e_ident[EI_MAG1] != ELFMAG1) 660 || (Ehdr.e_ident[EI_MAG2] != ELFMAG2) 661 || (Ehdr.e_ident[EI_MAG3] != ELFMAG3)) 662 return NULL; 663 664 // Class 665 if (Ehdr.e_ident[EI_CLASS] != ELFCLASS32) 666 return NULL; 667 668 // Byte order 669 if (Ehdr.e_ident[EI_DATA] != ELFDATA2LSB) 670 return NULL; 671 672 // ELF Version 673 if (Ehdr.e_ident[EI_VERSION] != EV_CURRENT) 674 return NULL; 675 676 // type 677 if (Ehdr.e_type != ET_EXEC) 678 return NULL; 679 680 // Machine 681 if (Ehdr.e_machine != EM_ARM) 682 return NULL; 683 684 if (Ehdr.e_version != EV_CURRENT) 685 return NULL; 686 687 return (const Elf32_Ehdr *)file; 688 } 689 690 void execute_elf(const Elf32_Ehdr *Ehdr, long *args) 691 { 692 const uint8_t *file = (const uint8_t *)Ehdr; 693 Elf32_Shdr StringShdr; 694 memcpy(&StringShdr, &file[Ehdr->e_shoff + (Ehdr->e_shstrndx * Ehdr->e_shentsize)], sizeof(StringShdr)); 695 696 if (Ehdr->e_shoff > 0) { 697 Elf32_Shdr Shdr; 698 for (int i = 0; i < Ehdr->e_shnum; i++) { 699 memcpy(&Shdr, (Elf32_Shdr *)&file[Ehdr->e_shoff + (i * Ehdr->e_shentsize)], sizeof(Elf32_Shdr)); 700 Shdr.sh_size -= Shdr.sh_addr; 701 702 char *name; 703 if (Shdr.sh_name > 0) { 704 name = (char *)&file[StringShdr.sh_offset + Shdr.sh_name]; 705 } 706 else { 707 name = NULL; 708 } 709 710 if ((Shdr.sh_flags & SHF_ALLOC) == 0) { 711 // skip 712 } 713 else if (Shdr.sh_type == SHT_PROGBITS) { 714 if ((Shdr.sh_flags & SHF_WRITE) == 0) { 715 // inplace 716 } 717 else { 718 memcpy(Shdr.sh_addr, Shdr.sh_offset, Shdr.sh_size); 719 } 720 } 721 else if (Shdr.sh_type == SHT_NOBITS) { 722 memset(Shdr.sh_addr, 0, Shdr.sh_size); 723 } 724 else { 725 // skip 726 } 727 } 728 } 729 730 ((elf_entry_t)Ehdr->e_entry)(args); 731 } -
EcnlProtoTool/trunk/ntshell/src/main.cfg
r441 r443 80 80 CRE_DTQ(MAIN_DATAQUEUE, { TA_TFIFO, NUM_MAIN_DATAQUEUE, NULL }); 81 81 82 CRE_TSK(SHELLCMD_TASK, { TA_FPU, 0, shellcmd_task, SHELLCMD_PRIORITY, SHELLCMD_STACK_SIZE, (void *)0x20100000});82 CRE_TSK(SHELLCMD_TASK, { TA_FPU, 0, shellcmd_task, SHELLCMD_PRIORITY, SHELLCMD_STACK_SIZE, SHELLCMD_STACK_ADDR }); 83 83 CRE_FLG(FLG_SELECT_WAIT, { TA_WMUL, 0x00 }); 84 84 CRE_SEM(SEM_FILEDESC, { TA_TPRI, 1, 1 }); -
EcnlProtoTool/trunk/ntshell/src/main.h
r441 r443 60 60 #define MAIN_STACK_SIZE 2048 /* メインタスクのスタック領域のサイズ */ 61 61 #define SHELLCMD_STACK_SIZE 0x00800000 /* shellcmdタスクのスタック領域のサイズ */ 62 #define SHELLCMD_STACK_ADDR ((void *)&__CmdBase) 62 63 63 64 #define NUM_MAIN_DATAQUEUE 1 /* メインタスクで待ち受けているデータキューのサイズ */ … … 68 69 */ 69 70 #ifndef TOPPERS_MACRO_ONLY 71 72 extern uint8_t __CmdBase; 73 extern uint8_t __CmdLimit; 70 74 71 75 typedef struct task_base_t { -
EcnlProtoTool/trunk/prototool/src/linker_scriptDebug.ld
r441 r443 22 22 } > BOOT_LOADER 23 23 24 .proginf : { 25 KEEP(*(.proginf)) 26 } > ROM 27 24 28 .text : { 25 29 __start_text = .; 26 KEEP(*(.vector))27 30 *(.text*) 28 31 *(.glue_7t) … … 30 33 KEEP(*(.init)) 31 34 KEEP(*(.fini)) 32 __end_ kernel= .;35 __end_text = .; 33 36 } > ROM 34 37 _etext = .; … … 40 43 __end_rodata = .; 41 44 } > ROM 45 42 46 .preinit_array ALIGN(4) : { 43 47 PROVIDE_HIDDEN (__preinit_array_start = .); -
EcnlProtoTool/trunk/prototool/src/main.c
r439 r443 521 521 return (&__start_rodata <= p && p < &__end_rodata); 522 522 } 523 524 void _start_c(long *p);525 extern int __start_idata, __start_data, __end_data;526 extern int __start_bss, __end_bss;527 528 void _PowerON_Reset(long *args)529 {530 memcpy(&__start_data, &__start_idata, (size_t)&__end_data - (size_t)&__start_data);531 memset(&__start_bss, 0, (size_t)&__end_bss - (size_t)&__start_bss);532 533 _start_c(args);534 }535 536 #define FVECT_SECT __attribute__ ((section (".vector")))537 const void *HardwareVectors[] FVECT_SECT = {538 _PowerON_Reset,539 mrdb_break,540 };
Note:
See TracChangeset
for help on using the changeset viewer.