Mercurial > ecos
changeset 2013:8bf90d16b837
* include/objelf.h: Include hal_tables.h otherwise we get strange
linker errors.
* cdl/objloader.cdl: Rearranged the building of the test case.
* include/relocate_i386.h (New):
* src/relocate_i386.c (New): Added a relocator for i386.
* src/objelf.c: Fixed various Elf_Rel vs Elf_Rela issues.
* test/load_mods.c:
* test/library/hello.c: Modified to make use of the eCos test
infrastructure. Uses a romfs to hold the object file to be loaded.
| author | asl |
|---|---|
| date | Fri, 08 Jul 2005 20:14:13 +0000 |
| parents | fa05b44883a4 |
| children | 65e45a7231c2 |
| files | packages/services/objloader/current/ChangeLog packages/services/objloader/current/cdl/objloader.cdl packages/services/objloader/current/include/objelf.h packages/services/objloader/current/include/relocate_i386.h packages/services/objloader/current/src/objelf.c packages/services/objloader/current/src/objloader.c packages/services/objloader/current/src/relocate_i386.c packages/services/objloader/current/tests/library/hello.c packages/services/objloader/current/tests/test_mods.c |
| diffstat | 9 files changed, 355 insertions(+), 134 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/services/objloader/current/ChangeLog +++ b/packages/services/objloader/current/ChangeLog @@ -1,3 +1,15 @@ +2005-07-08 Andrew Lunn <andrew.lunn@ascom.ch> + + * include/objelf.h: Include hal_tables.h otherwise we get strange + linker errors. + * cdl/objloader.cdl: Rearranged the building of the test case. + * include/relocate_i386.h (New): + * src/relocate_i386.c (New): Added a relocator for i386. + * src/objelf.c: Fixed various Elf_Rel vs Elf_Rela issues. + * test/load_mods.c: + * test/library/hello.c: Modified to make use of the eCos test + infrastructure. Uses a romfs to hold the object file to be loaded. + 2005-05-10 Anthony Tonizzo <atonizzo@lycos.com> * include/elf.h:
--- a/packages/services/objloader/current/cdl/objloader.cdl +++ b/packages/services/objloader/current/cdl/objloader.cdl @@ -9,6 +9,7 @@ ## ------------------------------------------- ## This file is part of eCos, the Embedded Configurable Operating System. ## Copyright (C) 2005 eCosCentric Ltd. +## Copyright (C) 2005 Andrew Lunn ## ## eCos is free software; you can redistribute it and/or modify it under ## the terms of the GNU General Public License as published by the Free @@ -39,7 +40,7 @@ ######DESCRIPTIONBEGIN#### # # Author(s): atonizzo (atonizzo@lycos.com) -# Contributors: +# Contributors: Andrew Lunn # Date: 2005-05-13 # #####DESCRIPTIONEND#### @@ -51,7 +52,7 @@ cdl_package CYGPKG_OBJLOADER { description "This package provides support for loading and relocating object files within eCos." include_dir cyg/objloader - include_files elf.h objelf.h loader_fs.h relocate_ppc.h + include_files elf.h objelf.h loader_fs.h relocate_ppc.h relocate_i386.h compile objloader.c objelf.c loader_fs.c requires CYGPKG_MEMALLOC requires CYGPKG_IO_FILEIO @@ -61,18 +62,39 @@ cdl_package CYGPKG_OBJLOADER { display "Architecture dependent settings" flavor none no_define + requires CYGINT_SERVICES_OBJLOADER_RELOCATOR == 1 + description "Each of the options here enables the correct relocation support for the architectures supported." + cdl_interface CYGINT_SERVICES_OBJLOADER_RELOCATOR { + display "Suitable function to perform a symbol relocation" + description " + For each architecture we need a function which relocate + a symbol. If we don't have a relocator the loader + cannot work." + } + cdl_option CYGBLD_OBJLOADER_ARCHITECTURE_POWERPC { display "Support loading on PowerPC processors" calculated CYGPKG_HAL_POWERPC + implements CYGINT_SERVICES_OBJLOADER_RELOCATOR define_proc { puts $::cdl_header "#include <cyg/objloader/relocate_ppc.h>" } compile relocate_ppc.c } + cdl_option CYGBLD_OBJLOADER_ARCHITECTURE_I386 { + display "Support loading on I386 processors" + calculated CYGPKG_HAL_I386 || CYGPKG_HAL_SYNTH_I386 + implements CYGINT_SERVICES_OBJLOADER_RELOCATOR + define_proc { + puts $::cdl_header "#include <cyg/objloader/relocate_i386.h>" + } + compile relocate_i386.c + } + # cdl_option CYGBLD_OBJLOADER_ARCHITECTURE_ARM { # display "Support loading on ARM processors" # calculated CYGPKG_HAL_ARM @@ -129,36 +151,49 @@ cdl_package CYGPKG_OBJLOADER { } } - cdl_option CYGBLD_SERVICES_OBJLOADER_BUILD_TESTS { - display "Build test library" + cdl_component CYGTST_SERVICES_OBJLOADER_BUILD_TESTS { + display "Build test library" default_value 0 + active_if CYGPKG_FS_ROM + active_if CYGINT_SERVICES_OBJLOADER_RELOCATOR + requires CYGBLD_FS_ROMFS_MK_ROMFS no_define - description " + description " This option enables the building of a library and an - application for testing the loader. These - are not built by default since they do not use the dedicated - testing infrastructure." - + application for testing the loader." + make -priority 320 { - <PREFIX>/bin/test_mods : <PACKAGE>/tests/test_mods.c - @sh -c "mkdir -p tests $(dir $@)" - $(CC) -c $(INCLUDE_PATH) -Wp,-MD,deps.tmp -I$(dir $<) $(CFLAGS) -o tests/test_mods.o $< - @echo $@ ": \\" > $(notdir $@).deps - @echo $(wildcard $(PREFIX)/lib/*) " \\" >> $(notdir $@).deps - @tail -n +2 deps.tmp >> $(notdir $@).deps - @echo >> $(notdir $@).deps - @rm deps.tmp - $(CC) $(LDFLAGS) -L$(PREFIX)/lib -Ttarget.ld -o $@ tests/test_mods.o + tests/testromfs/hello.o : <PACKAGE>/tests/library/hello.c + @sh -c "mkdir -p tests tests/testromfs" + $(CC) -c $(INCLUDE_PATH) -I$(dir $<) $(CFLAGS) -o $@ $< } - make -priority 320 { - <PREFIX>/bin/hello.o : <PACKAGE>/tests/library/hello.c - @sh -c "mkdir -p tests $(dir $@)" - $(CC) -c $(INCLUDE_PATH) -I$(dir $<) $(CFLAGS) -o $@ $< + make -priority 322 { + <PREFIX>/include/cyg/objloader/testromfs_be.h : tests/testromfs/hello.o + $(PREFIX)/bin/mk_romfs -b tests/testromfs testromfs_be.bin + @mkdir -p "$(dir $@)" + @sh $(PREFIX)/bin/file2c.tcl testromfs_be.bin testromfs_be.h + @cp testromfs_be.h $@ } + + make -priority 322 { + <PREFIX>/include/cyg/objloader/testromfs_le.h : tests/testromfs/hello.o + $(PREFIX)/bin/mk_romfs tests/testromfs testromfs_le.bin + @mkdir -p "$(dir $@)" + @sh $(PREFIX)/bin/file2c.tcl testromfs_le.bin testromfs_le.h + @cp testromfs_le.h $@ + } + + cdl_option CYGPKG_OBJLOADER_TESTS { + display "Objloader tests" + flavor data + no_define + calculated { "tests/test_mods" } + description " + This option specifies the set of tests for the object + loader package" + } } - - } # ====================================================================
--- a/packages/services/objloader/current/include/objelf.h +++ b/packages/services/objloader/current/include/objelf.h @@ -58,6 +58,7 @@ #include <pkgconf/system.h> #include <pkgconf/objloader.h> +#include <cyg/hal/hal_tables.h> //============================================================================== @@ -302,11 +303,11 @@ CYG_LDR_TABLE_ENTRY( cyg_mbox_tryput_ent CYG_LDR_TABLE_ENTRY( cyg_mbox_peek_entry, \ "cyg_mbox_peek", cyg_mbox_peek ); \ CYG_LDR_TABLE_ENTRY( cyg_mbox_waiting_to_get_entry, \ - "cyg_mbox_waiting_to_get_item", \ - cyg_mbox_waiting_to_get_item ); \ + "cyg_mbox_waiting_to_get", \ + cyg_mbox_waiting_to_get ); \ CYG_LDR_TABLE_ENTRY( cyg_mbox_waiting_to_put_entry, \ - "cyg_mbox_waiting_to_put_item", \ - cyg_mbox_waiting_to_put_item ); + "cyg_mbox_waiting_to_put", \ + cyg_mbox_waiting_to_put ); #define CYG_LDR_TABLE_KAPI_MEMPOOL_FIX() \ CYG_LDR_TABLE_ENTRY( cyg_mempool_fix_create_entry, \ @@ -386,7 +387,7 @@ CYG_LDR_TABLE_ENTRY( cyg_semaphore_wait_ CYG_LDR_TABLE_ENTRY( cyg_semaphore_timed_wait_entry, \ "cyg_semaphore_timed_wait", cyg_semaphore_timed_wait ); \ CYG_LDR_TABLE_ENTRY( cyg_semaphore_try_wait_entry, \ - "cyg_semaphore_try_wait", cyg_semaphore_try_wait ); \ + "cyg_semaphore_trywait", cyg_semaphore_trywait ); \ CYG_LDR_TABLE_ENTRY( cyg_semaphore_post_entry, \ "cyg_semaphore_post", cyg_semaphore_post ); \ CYG_LDR_TABLE_ENTRY( cyg_semaphore_peek_entry, \ @@ -426,12 +427,6 @@ CYG_LDR_TABLE_ENTRY( cyg_thread_get_stac "cyg_thread_get_stack_base", cyg_thread_get_stack_base ); \ CYG_LDR_TABLE_ENTRY( cyg_thread_get_stack_size_entry, \ "cyg_thread_get_stack_size", cyg_thread_get_stack_size ); \ -CYG_LDR_TABLE_ENTRY( cyg_thread_get_stack_usage_entry, \ - "cyg_thread_get_stack_usage", \ - cyg_thread_get_stack_usage ); \ -CYG_LDR_TABLE_ENTRY( cyg_thread_measure_stack_usage_entry, \ - "cyg_thread_measure_stack_usage", \ - cyg_thread_measure_stack_usage ); \ CYG_LDR_TABLE_ENTRY( cyg_thread_new_data_index_entry, \ "cyg_thread_new_data_index", cyg_thread_new_data_index ); \ CYG_LDR_TABLE_ENTRY( cyg_thread_free_data_index_entry, \ @@ -442,11 +437,7 @@ CYG_LDR_TABLE_ENTRY( cyg_thread_get_data CYG_LDR_TABLE_ENTRY( cyg_thread_get_data_ptr_entry, \ "cyg_thread_get_data_ptr", cyg_thread_get_data_ptr ); \ CYG_LDR_TABLE_ENTRY( cyg_thread_set_data_entry, \ - "cyg_thread_set_data", cyg_thread_set_data ); \ -CYG_LDR_TABLE_ENTRY( cyg_thread_add_destructor_entry, \ - "cyg_thread_add_destructor", cyg_thread_add_destructor ); \ -CYG_LDR_TABLE_ENTRY( cyg_thread_rem_destructor_entry, \ - "cyg_thread_rem_destructor", cyg_thread_rem_destructor ); + "cyg_thread_set_data", cyg_thread_set_data ); #define CYG_LDR_TABLE_STRING() \ CYG_LDR_TABLE_ENTRY( memchr_entry, "memchr", memchr ); \ @@ -484,7 +475,6 @@ CYG_LDR_TABLE_ENTRY( fgets_entry, "fge CYG_LDR_TABLE_ENTRY( fopen_entry, "fopen", fopen ); \ CYG_LDR_TABLE_ENTRY( fprintf_entry, "fprintf", fprintf ); \ CYG_LDR_TABLE_ENTRY( fputc_entry, "fputc", fputc ); \ -CYG_LDR_TABLE_ENTRY( fputchar_entry, "fputchar", fputchar ); \ CYG_LDR_TABLE_ENTRY( fputs_entry, "fputs", fputs ); \ CYG_LDR_TABLE_ENTRY( fread_entry, "fread", fread ); \ CYG_LDR_TABLE_ENTRY( freopen_entry, "freopen", freopen ); \ @@ -493,16 +483,11 @@ CYG_LDR_TABLE_ENTRY( fseek_entry, "fse CYG_LDR_TABLE_ENTRY( fsetpos_entry, "fsetpos", fsetpos ); \ CYG_LDR_TABLE_ENTRY( ftell_entry, "ftell", ftell ); \ CYG_LDR_TABLE_ENTRY( fwrite_entry, "fwrite", fwrite ); \ -CYG_LDR_TABLE_ENTRY( fgetc_entry, "fgetc", fgetc ); \ -CYG_LDR_TABLE_ENTRY( fgetchar_entry, "fgetchar", fgetchar ); \ -CYG_LDR_TABLE_ENTRY( fgets_entry, "fgets", fgets ); \ -CYG_LDR_TABLE_ENTRY( fgetw_entry, "fgetw", fgetw ); \ CYG_LDR_TABLE_ENTRY( perror_entry, "perror", perror ); \ CYG_LDR_TABLE_ENTRY( printf_entry, "printf", printf ); \ CYG_LDR_TABLE_ENTRY( putc_entry, "putc", putc ); \ CYG_LDR_TABLE_ENTRY( putchar_entry, "putchar", putchar ); \ CYG_LDR_TABLE_ENTRY( puts_entry, "puts", puts ); \ -CYG_LDR_TABLE_ENTRY( putw_entry, "putw", putw ); \ CYG_LDR_TABLE_ENTRY( remove_entry, "remove", remove ); \ CYG_LDR_TABLE_ENTRY( rename_entry, "rename", rename ); \ CYG_LDR_TABLE_ENTRY( rewind_entry, "rewind", rewind ); \ @@ -531,8 +516,6 @@ CYG_LDR_TABLE_ENTRY( diag_dump_buf_32bit "diag_dump_buf_32bit", diag_dump_buf_32bit ); \ CYG_LDR_TABLE_ENTRY( diag_dump_buf_16bit_entry, \ "diag_dump_buf_16bit", diag_dump_buf_16bit ); \ -CYG_LDR_TABLE_ENTRY( __printf_fun_entry, \ - "__printf_fun", __printf_fun ); \ CYG_LDR_TABLE_ENTRY( diag_vdump_buf_with_offset_entry, \ "diag_vdump_buf_with_offset", \ diag_vdump_buf_with_offset ); \ @@ -554,4 +537,3 @@ CYG_LDR_TABLE_ENTRY( diag_vprintf_entry, //============================================================================== #endif -
new file mode 100644 --- /dev/null +++ b/packages/services/objloader/current/include/relocate_i386.h @@ -0,0 +1,71 @@ +#ifndef __RELOCATE_I386_H__ +#define __RELOCATE_I386_H__ + +/* ================================================================= + * + * relocate_i386.h + * + * Architecture dependent relocation routines for the i386 + * + * ================================================================= + * ####ECOSGPLCOPYRIGHTBEGIN#### + * ------------------------------------------- + * This file is part of eCos, the Embedded Configurable Operating + * System. + * Copyright (C) 2005 Andrew Lunn <andrew.lunn@ascom.ch> + * + * eCos is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 or (at your option) + * any later version. + * + * eCos is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with eCos; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + * + * As a special exception, if other files instantiate templates or + * use macros or inline functions from this file, or you compile this + * file and link it with other works to produce a work based on this + * file, this file does not by itself cause the resulting work to be + * covered by the GNU General Public License. However the source code + * for this file must still be made available in accordance with + * section (3) of the GNU General Public License. + * + * This exception does not invalidate any other reasons why a work + * based on this file might be covered by the GNU General Public + * License. + * + * ------------------------------------------- + * ####ECOSGPLCOPYRIGHTEND#### + * ================================================================= + * #####DESCRIPTIONBEGIN#### + * + * Author(s): andrew.lunn@ascom.ch + * Date: 2005-07-07 + * Purpose: + * Description: + * + * ####DESCRIPTIONEND#### + * + * ================================================================= + */ + +#define Elf_Rel 0 +#define Elf_Rela 1 + +#define ELF_ARCH_MACHINE_TYPE 3 // i386 +#define ELF_ARCH_ENDIANNESS ELFDATA2LSB +#define ELF_ARCH_RELTYPE Elf_Rel + +#define R_386_32 1 +#define R_386_PC32 2 + +void cyg_ldr_flush_cache( void ); +cyg_int32 cyg_ldr_relocate( cyg_int32, cyg_uint32, cyg_int32 ); + +#endif //__RELOCATE_I386_H__
--- a/packages/services/objloader/current/src/objelf.c +++ b/packages/services/objloader/current/src/objelf.c @@ -171,12 +171,22 @@ cyg_ldr_print_rel_names( PELF_OBJECT p ) { sprintf( strname, "%08X %08X ", +#if ELF_ARCH_RELTYPE == Elf_Rela p_rela[j].r_offset, - p_rela[j].r_info ); + p_rela[j].r_info +#else + p_rel[j].r_offset, + p_rel[j].r_info +#endif + ); diag_printf( strname ); - + +#if ELF_ARCH_RELTYPE == Elf_Rela cyg_uint8 sym_type = ELF32_R_SYM( p_rela[j].r_info ); +#else + cyg_uint8 sym_type = ELF32_R_SYM( p_rel[j].r_info ); +#endif if ( strlen ( p_strtab + p_symtab[sym_type].st_name ) > 0 ) diag_printf( p_strtab + p_symtab[sym_type].st_name ); else @@ -220,7 +230,7 @@ static void return (void*)( addr + p_symtab[sym_index].st_value); } -static void +void *cyg_ldr_external_address( PELF_OBJECT p, cyg_uint32 sym_index ) { cyg_uint8* tmp2;
--- a/packages/services/objloader/current/src/objloader.c +++ b/packages/services/objloader/current/src/objloader.c @@ -55,11 +55,11 @@ #include <cyg/infra/diag.h> // For diagnostic printing. #include <cyg/infra/cyg_ass.h> -#include <stdio.h> #include <stdlib.h> #include <string.h> #include <pkgconf/objloader.h> + #include <cyg/objloader/elf.h> #include <cyg/objloader/objelf.h> #include <cyg/objloader/loader_fs.h>
new file mode 100644 --- /dev/null +++ b/packages/services/objloader/current/src/relocate_i386.c @@ -0,0 +1,100 @@ +/* ================================================================= + * + * relocate_i386.c + * + * Relocation types for the i386 processor. + * + * ================================================================= + * ####ECOSGPLCOPYRIGHTBEGIN#### + * ------------------------------------------- + * This file is part of eCos, the Embedded Configurable Operating + * System. + * Copyright (C) 2005 eCosCentric LTD. + * Copyright (C) 2005 Andrew Lunn <andrew.lunn@ascom.ch>. + * + * eCos is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 or (at your option) + * any later version. + * + * eCos is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with eCos; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + * + * As a special exception, if other files instantiate templates or + * use macros or inline functions from this file, or you compile this + * file and link it with other works to produce a work based on this + * file, this file does not by itself cause the resulting work to be + * covered by the GNU General Public License. However the source code + * for this file must still be made available in accordance with + * section (3) of the GNU General Public License. + * + * This exception does not invalidate any other reasons why a work + * based on this file might be covered by the GNU General Public + * License. + * + * ------------------------------------------- + * ####ECOSGPLCOPYRIGHTEND#### + * ================================================================= + * #####DESCRIPTIONBEGIN#### + * + * Author(s): atonizzo@lycos.com, andrew.lunn@ascom.ch + * Date: 2005-07-07 + * Purpose: + * Description: + * + * ####DESCRIPTIONEND#### + * + * ================================================================= + */ + +#include <cyg/infra/diag.h> // For diagnostic printing. +#include <cyg/hal/hal_cache.h> +#include <cyg/hal/hal_io.h> + +#include <pkgconf/objloader.h> +#include <cyg/objloader/elf.h> +#include <cyg/objloader/objelf.h> + +#if defined(CYGPKG_HAL_I386) || defined(CYGPKG_HAL_SYNTH_I386) +void +cyg_ldr_flush_cache( void ) +{ + HAL_DCACHE_SYNC(); + HAL_ICACHE_SYNC(); +} + +// in: +// +// sym_type Type of relocation to apply, +// mem Address in memory to modify (relocate). +// sym_value +cyg_int32 +cyg_ldr_relocate( cyg_int32 sym_type, cyg_uint32 mem, cyg_int32 sym_value ) +{ + cyg_int32 i; + + // PPC uses rela, so we have to add the addend. + switch( sym_type ) + { + case R_386_32: + HAL_READ_UINT32( mem , i ); + HAL_WRITE_UINT32( mem, i + sym_value ); + return 0; + case R_386_PC32: + HAL_READ_UINT32( mem , i ); + HAL_WRITE_UINT32( mem, i + sym_value - mem ); + return 0; + default: + ELFDEBUG( "FIXME: Unknown relocation value!!!\n" ); + return -1; + } +} +#endif // CYGPKG_HAL_I386 || CYGPKG_HAL_SYNTH_I386 + +
--- a/packages/services/objloader/current/tests/library/hello.c +++ b/packages/services/objloader/current/tests/library/hello.c @@ -54,15 +54,19 @@ #include <cyg/kernel/kapi.h> // Kernel API. #include <cyg/infra/diag.h> // For diagnostic printing. +#include <cyg/infra/testcase.h> cyg_sem_t sem_signal_thread; int thread_a_count; +extern int weak_fn_called; + void weak_function( void ) CYGBLD_ATTRIB_WEAK; void weak_function( void ) { // Store the data value passed in for this thread. - diag_printf( "This is the library function\n" ); + diag_printf( "INFO:< This is the library weak function>" ); + CYG_TEST_FAIL ( "Libraries weak function called when apps should be called" ); } void library_open( void ) @@ -70,20 +74,20 @@ void library_open( void ) // Initialize the count for thread a. thread_a_count = 0; - // Initialize the semaphore with a count of zero, - // prior to creating the threads. - cyg_semaphore_init( &sem_signal_thread, 0 ); - diag_printf( "Library initialized...\n" ); + // Initialize the semaphore with a count of zero, + // prior to creating the threads. + cyg_semaphore_init( &sem_signal_thread, 0 ); + CYG_TEST_INFO( "Library initialized" ); } void library_close( void ) { - diag_printf( "Ciao...\n" ); + CYG_TEST_INFO( "Library closed" ); } void print_message( void ) { - diag_printf( "Printing a silly message...\n" ); + diag_printf( "INFO:<Printing a silly message...>\n" ); } // Thread A - signals thread B via semaphore. @@ -92,14 +96,16 @@ void thread_a( cyg_addrword_t data ) // Store the data value passed in for this thread. int msg = (int)data; - while( 1 ) + weak_function (); + + while( thread_a_count < 5 ) { // Increment the thread a count. thread_a_count++; // Send out a message to the diagnostic port. - diag_printf( "Thread A, count: %d message: %d\n", thread_a_count, msg ); + diag_printf( "INFO:<Thread A, count: %d message: %d>\n", thread_a_count, msg ); // Delay for 1 second. cyg_thread_delay( 100 ); @@ -107,6 +113,9 @@ void thread_a( cyg_addrword_t data ) // Signal thread B using the semaphore. cyg_semaphore_post( &sem_signal_thread ); } + + CYG_TEST_CHECK( weak_fn_called == 2 , "Application week function not called" ); + CYG_TEST_FINISH( "Object loader test finished" ); } // Thread B - waits for semaphore signal from thread A. @@ -122,7 +131,6 @@ void thread_b( cyg_addrword_t data ) cyg_semaphore_wait( &sem_signal_thread ); // Send out a message to the diagnostic port. - diag_printf( "Thread B, message: %d\n", msg ); + diag_printf( "INFO:< Thread B, message: %d>\n", msg ); } } -
--- a/packages/services/objloader/current/tests/test_mods.c +++ b/packages/services/objloader/current/tests/test_mods.c @@ -52,9 +52,10 @@ * ================================================================= */ +#include <pkgconf/system.h> #include <cyg/kernel/kapi.h> // Kernel API. #include <cyg/infra/diag.h> // For diagnostic printing. -#include <pkgconf/io_fileio.h> +#include <cyg/infra/testcase.h> #include <unistd.h> #include <stdlib.h> @@ -64,10 +65,32 @@ #include <dirent.h> #include <stdio.h> -#include <cyg/fileio/fileio.h> #include <cyg/objloader/elf.h> #include <cyg/objloader/objelf.h> +#ifdef CYGPKG_IO_FILEIO +#include <cyg/fileio/fileio.h> +#endif + +// Test ROMFS data. Two example data files are generated so that +// the test will work on both big-endian and little-endian targets. +#if (CYG_BYTEORDER == CYG_LSBFIRST) +# include <cyg/objloader/testromfs_le.h> +#else +# include <cyg/objloader/testromfs_be.h> +#endif + +//========================================================================== + +MTAB_ENTRY( romfs_mte1, + "/", + "romfs", + "", + (CYG_ADDRWORD) &filedata[0] ); + + +//========================================================================== + #define THREAD_STACK_SIZE 8192 #define THREAD_PRIORITY 12 @@ -82,10 +105,12 @@ cyg_handle_t thread_b_hdl; #define SHOW_RESULT( _fn, _res ) \ diag_printf("<FAIL>: " #_fn "() returned %d %s\n", _res, _res<0?strerror(errno):""); +int weak_fn_called = 0; + void weak_function( void ) { - // Store the data value passed in for this thread. - diag_printf( "This is the application function\n" ); + CYG_TEST_PASS( "Applications weak function called" ); + weak_fn_called++; } void (*thread_a)( cyg_addrword_t ); @@ -98,30 +123,36 @@ void cyg_user_start( void ) void* lib_handle; void (*fn)( void ); - // It wouldn't be much of a basic example if some - // kind of hello message wasn't output. - diag_printf( "Hello eCos World!!!\n\n" ); + CYG_TEST_INIT(); - err = mount( "/dev/disk0/1", "/", "fatfs" ); - if( err < 0 ) - SHOW_RESULT( mount, err ); + CYG_TEST_INFO( "Object loader module test started" ); err = chdir( "/" ); + if( err < 0 ) SHOW_RESULT( chdir, err ); lib_handle = cyg_ldr_open_library( (CYG_ADDRWORD)"/hello.o", 0 ); -// cyg_ldr_print_symbol_names( lib_handle ); -// cyg_ldr_print_rel_names( lib_handle ); + CYG_TEST_CHECK( lib_handle , "Unable to load object file to load" ); + fn = cyg_ldr_find_symbol( lib_handle, "print_message" ); - fn(); - fn = cyg_ldr_find_symbol( lib_handle, "weak_function" ); + CYG_TEST_CHECK( fn , "Unable to find print_message function" ); + fn(); + fn = cyg_ldr_find_symbol( lib_handle, "weak_function" ); + CYG_TEST_CHECK( fn , "Unable to find weak_function" ); + + fn(); + + fn = cyg_ldr_find_symbol ( lib_handle, "unresolvable_symbol" ); + CYG_TEST_CHECK( !fn , "Found none existing symbol!" ); + thread_a = cyg_ldr_find_symbol( lib_handle, "thread_a" ); thread_b = cyg_ldr_find_symbol( lib_handle, "thread_b" ); - - // Create our two threads. + CYG_TEST_CHECK( thread_a && thread_b , "Unable to find thread functions" ); + + // Create our two threads. cyg_thread_create( THREAD_PRIORITY, thread_a, (cyg_addrword_t) 75, @@ -143,65 +174,37 @@ void cyg_user_start( void ) // Resume the threads so they start when the scheduler begins. cyg_thread_resume( thread_a_hdl ); cyg_thread_resume( thread_b_hdl ); + + cyg_scheduler_start(); } // ----------------------------------------------------------------------------- // External symbols. // ----------------------------------------------------------------------------- - -// eCos semaphores -CYG_LDR_TABLE_ENTRY( cyg_thread_delay_entry, - "cyg_thread_delay", - cyg_thread_delay ); -CYG_LDR_TABLE_ENTRY( cyg_semaphore_wait_entry, - "cyg_semaphore_wait", - cyg_semaphore_wait ); -CYG_LDR_TABLE_ENTRY( cyg_semaphore_init_entry, - "cyg_semaphore_init", - cyg_semaphore_init ); -CYG_LDR_TABLE_ENTRY( cyg_semaphore_post_entry, - "cyg_semaphore_post", - cyg_semaphore_post ); - -// eCos mailboxes -CYG_LDR_TABLE_ENTRY( cyg_mbox_put_entry, "cyg_mbox_put", cyg_mbox_put ); - -// eCos Flags -CYG_LDR_TABLE_ENTRY( cyg_flag_poll_entry, "cyg_flag_poll", cyg_flag_poll ); -CYG_LDR_TABLE_ENTRY( cyg_flag_setbits_entry, - "cyg_flag_setbits", - cyg_flag_setbits ); +CYG_LDR_TABLE_KAPI_ALARM() +CYG_LDR_TABLE_KAPI_CLOCK() +CYG_LDR_TABLE_KAPI_COND() +CYG_LDR_TABLE_KAPI_COUNTER() +CYG_LDR_TABLE_KAPI_EXCEPTIONS() +CYG_LDR_TABLE_KAPI_FLAG() +CYG_LDR_TABLE_KAPI_INTERRUPTS() +CYG_LDR_TABLE_KAPI_MBOX() +CYG_LDR_TABLE_KAPI_MEMPOOL_FIX() +CYG_LDR_TABLE_KAPI_MEMPOOL_VAR() +CYG_LDR_TABLE_KAPI_MUTEX() +CYG_LDR_TABLE_KAPI_SCHEDULER() +CYG_LDR_TABLE_KAPI_SEMAPHORE() +CYG_LDR_TABLE_KAPI_THREAD() +CYG_LDR_TABLE_STRING() +CYG_LDR_TABLE_STDIO() +CYG_LDR_TABLE_INFRA_DIAG() -// eCos misc -CYG_LDR_TABLE_ENTRY( hal_delay_us_entry, "hal_delay_us", hal_delay_us ); -CYG_LDR_TABLE_ENTRY( cyg_assert_msg_entry, "cyg_assert_msg", cyg_assert_msg ); -CYG_LDR_TABLE_ENTRY( cyg_assert_fail_entry, - "cyg_assert_fail", - cyg_assert_fail ); - -// memory -CYG_LDR_TABLE_ENTRY( memcpy_entry, "memcpy", memcpy ); -CYG_LDR_TABLE_ENTRY( memset_entry, "memset", memset ); -CYG_LDR_TABLE_ENTRY( memcmp_entry, "memcmp", memcmp ); -CYG_LDR_TABLE_ENTRY( malloc_entry, "malloc", malloc ); -CYG_LDR_TABLE_ENTRY( free_entry, "free", free ); +// Test case infrastructure function +CYG_LDR_TABLE_ENTRY( cyg_test_output_entry, "cyg_test_output", cyg_test_output ); +CYG_LDR_TABLE_ENTRY( cyg_test_exit_entry, "cyg_test_exit", cyg_test_exit ); -// Strings -CYG_LDR_TABLE_ENTRY( strcpy_entry, "strcpy", strcpy ); -CYG_LDR_TABLE_ENTRY( strcat_entry, "strcat", strcat ); -CYG_LDR_TABLE_ENTRY( sprintf_entry, "sprintf", sprintf ); -CYG_LDR_TABLE_ENTRY( strlen_entry, "strlen", strlen ); -CYG_LDR_TABLE_ENTRY( strcmp_entry, "strcmp", strcmp ); -CYG_LDR_TABLE_ENTRY( strncmp_entry, "strncmp", strncmp ); +// Test function +CYG_LDR_TABLE_ENTRY( weak_function_entry, "weak_function", weak_function ); -// files -CYG_LDR_TABLE_ENTRY( fopen_entry, "fopen", fopen ); -CYG_LDR_TABLE_ENTRY( fread_entry, "fread", fread ); -CYG_LDR_TABLE_ENTRY( fclose_entry, "fclose", fclose ); -CYG_LDR_TABLE_ENTRY( fseek_entry, "fseek", fseek ); -CYG_LDR_TABLE_ENTRY( stat_entry, "stat", stat ); - -// Diagnostic printout -CYG_LDR_TABLE_ENTRY( diag_printf_entry, "diag_printf", diag_printf ); - -CYG_LDR_TABLE_ENTRY( weak_function_entry, "weak_function", weak_function ); +// Test Variable +CYG_LDR_TABLE_ENTRY( weak_fn_called_entry, "weak_fn_called", &weak_fn_called );
