changeset 141:450e4e1f1e80 ecos-sw-2000-11-27

Merge from eCos master repository on 2000-11-27-23:09:27-GMT
author jlarmour
date Tue, 28 Nov 2000 00:03:34 +0000
parents b9721305fd46
children 12eccf9656f3
files packages/ChangeLog packages/cygmon/current/ChangeLog packages/cygmon/current/cdl/cygmon.cdl packages/hal/arm/sa11x0/brutus/current/ChangeLog packages/hal/arm/sa11x0/brutus/current/misc/redboot_RAM.cfg packages/hal/arm/sa11x0/brutus/current/misc/redboot_ROM.cfg packages/hal/arm/sa11x0/sa1100mm/current/ChangeLog packages/hal/arm/sa11x0/sa1100mm/current/cdl/hal_arm_sa11x0_sa1100mm.cdl packages/hal/arm/sa11x0/sa1100mm/current/src/sa1100mm_misc.c packages/io/flash/current/ChangeLog packages/io/flash/current/include/flash.h packages/io/flash/current/src/flash.c packages/language/c/libc/time/current/ChangeLog packages/language/c/libc/time/current/tests/clock.c packages/pkgconf/rules.mak packages/redboot/current/ChangeLog packages/redboot/current/src/main.c packages/services/memalloc/common/current/ChangeLog packages/services/memalloc/common/current/cdl/memalloc.cdl
diffstat 19 files changed, 312 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/packages/ChangeLog
+++ b/packages/ChangeLog
@@ -1,3 +1,8 @@
+2000-11-25  Jonathan Larmour  <jlarmour@redhat.com>
+
+	* pkgconf/rules.mak (mlt_headers): Rewrite to work under Solaris,
+	and without excessive rebuilds.
+
 2000-11-16  Jesper Skov  <jskov@redhat.com>
 
 	* ecos.db: Added intel flash driver. Going to use it as a test to
--- a/packages/cygmon/current/ChangeLog
+++ b/packages/cygmon/current/ChangeLog
@@ -1,3 +1,7 @@
+2000-11-20  Drew Moseley  <dmoseley@redhat.com>
+
+	* cdl/cygmon.cdl: Make sure we don't specify vectors.o and target.ld twice.
+
 2000-11-03  Jonathan Larmour  <jlarmour@redhat.com>
 
 	* cdl/cygmon.cdl: Improve cygmon.elf make dependencies
--- a/packages/cygmon/current/cdl/cygmon.cdl
+++ b/packages/cygmon/current/cdl/cygmon.cdl
@@ -125,7 +125,7 @@ cdl_package CYGPKG_CYGMON {
             $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/bsp_cache.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/bsp_cache.c
             $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/gdb-cpu.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/gdb-cpu.c
             $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/hex-utils.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/hex-utils.c
-            $(CC) $(LDFLAGS) -L$(PREFIX)/lib -Ttarget.ld -o $@ $(patsubst $(REPOSITORY)/$(PACKAGE)/%.c,%.o,$^)
+            $(CC) $(LDFLAGS) -L$(PREFIX)/lib -Ttarget.ld -o $@ $(filter-out %.ld %vectors.o, $(patsubst $(REPOSITORY)/$(PACKAGE)/%.c,%.o,$^))
         }
     }
 }
--- a/packages/hal/arm/sa11x0/brutus/current/ChangeLog
+++ b/packages/hal/arm/sa11x0/brutus/current/ChangeLog
@@ -1,3 +1,8 @@
+2000-11-25  Jonathan Larmour  <jlarmour@redhat.com>
+
+	* misc/redboot_RAM.cfg: Added new import file for redboot
+	* misc/redboot_ROM.cfg: Ditto
+
 2000-11-10  Gary Thomas  <gthomas@redhat.com>
 
 	* cdl/hal_arm_sa11x0_brutus.cdl: Add RedBoot configuration.
new file mode 100644
--- /dev/null
+++ b/packages/hal/arm/sa11x0/brutus/current/misc/redboot_RAM.cfg
@@ -0,0 +1,57 @@
+cdl_savefile_version 1;
+cdl_savefile_command cdl_savefile_version {};
+cdl_savefile_command cdl_savefile_command {};
+cdl_savefile_command cdl_configuration { description hardware template package };
+cdl_savefile_command cdl_package { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_component { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_option { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_interface { value_source user_value wizard_value inferred_value };
+
+cdl_configuration eCos {
+    description "" ;
+    hardware    brutus ;
+    template    redboot ;
+    package -hardware CYGPKG_HAL_ARM current ;
+    package -hardware CYGPKG_HAL_ARM_SA11X0 current ;
+    package -hardware CYGPKG_HAL_ARM_SA11X0_BRUTUS current ;
+    package -hardware CYGPKG_IO_SERIAL_ARM_SA11X0 current ;
+    package -template CYGPKG_HAL current ;
+    package -template CYGPKG_INFRA current ;
+    package -template CYGPKG_REDBOOT current ;
+};
+
+cdl_option CYGBLD_BUILD_GDB_STUBS {
+    user_value 0
+};
+
+cdl_option CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT {
+    user_value 0
+};
+
+cdl_option CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM {
+    inferred_value 0
+};
+
+cdl_option CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS {
+    inferred_value 1
+};
+
+cdl_option CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT {
+    inferred_value 1
+};
+
+cdl_option CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT {
+    inferred_value 0
+};
+
+cdl_option CYGSEM_HAL_USE_ROM_MONITOR {
+    inferred_value 0 0
+};
+
+cdl_component CYG_HAL_STARTUP {
+    user_value RAM
+};
+
+cdl_option CYGBLD_BUILD_REDBOOT {
+    user_value 1
+};
new file mode 100644
--- /dev/null
+++ b/packages/hal/arm/sa11x0/brutus/current/misc/redboot_ROM.cfg
@@ -0,0 +1,61 @@
+cdl_savefile_version 1;
+cdl_savefile_command cdl_savefile_version {};
+cdl_savefile_command cdl_savefile_command {};
+cdl_savefile_command cdl_configuration { description hardware template package };
+cdl_savefile_command cdl_package { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_component { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_option { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_interface { value_source user_value wizard_value inferred_value };
+
+cdl_configuration eCos {
+    description "" ;
+    hardware    brutus ;
+    template    redboot ;
+    package -hardware CYGPKG_HAL_ARM current ;
+    package -hardware CYGPKG_HAL_ARM_SA11X0 current ;
+    package -hardware CYGPKG_HAL_ARM_SA11X0_BRUTUS current ;
+    package -hardware CYGPKG_IO_SERIAL_ARM_SA11X0 current ;
+    package -template CYGPKG_HAL current ;
+    package -template CYGPKG_INFRA current ;
+    package -template CYGPKG_REDBOOT current ;
+};
+
+cdl_option CYGBLD_BUILD_GDB_STUBS {
+    user_value 0
+};
+
+cdl_option CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT {
+    user_value 0
+};
+
+cdl_option CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM {
+    inferred_value 0
+};
+
+cdl_option CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS {
+    inferred_value 1
+};
+
+cdl_option CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT {
+    inferred_value 1
+};
+
+cdl_option CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT {
+    inferred_value 0
+};
+
+cdl_option CYGSEM_HAL_ROM_MONITOR {
+    user_value 1
+};
+
+cdl_option CYGSEM_HAL_USE_ROM_MONITOR {
+    inferred_value 0 0
+};
+
+cdl_component CYG_HAL_STARTUP {
+    user_value ROM
+};
+
+cdl_option CYGBLD_BUILD_REDBOOT {
+    user_value 1
+};
--- a/packages/hal/arm/sa11x0/sa1100mm/current/ChangeLog
+++ b/packages/hal/arm/sa11x0/sa1100mm/current/ChangeLog
@@ -1,3 +1,11 @@
+2000-11-27  Drew Moseley  <dmoseley@redhat.com>
+
+	* src/sa1100mm_misc.c (sa1100mm_program_new_stack): New function
+	for switching to an application stack when running a program under
+	a ROM monitor.
+
+	* cdl/hal_arm_sa11x0_sa1100mm. Define HAL_ARCH_PROGRAM_NEW_STACK.
+
 2000-11-13  Drew Moseley  <dmoseley@st-kitts.caribbean>
 
 	* misc/redboot_ROM.cfg: Turn on REDBOOT_BSP_SYSCALLS.
--- a/packages/hal/arm/sa11x0/sa1100mm/current/cdl/hal_arm_sa11x0_sa1100mm.cdl
+++ b/packages/hal/arm/sa11x0/sa1100mm/current/cdl/hal_arm_sa11x0_sa1100mm.cdl
@@ -64,6 +64,7 @@ cdl_package CYGPKG_HAL_ARM_SA11X0_SA1100
 	puts $::cdl_header "#define HAL_PLATFORM_CPU    \"StrongARM 1100\""
         puts $::cdl_header "#define HAL_PLATFORM_BOARD  \"Multimedia development system\""
         puts $::cdl_header "#define HAL_PLATFORM_EXTRA  \"\""
+        puts $::cdl_header "#define HAL_ARCH_PROGRAM_NEW_STACK sa1100mm_program_new_stack"
     }
 
     cdl_component CYG_HAL_STARTUP {
--- a/packages/hal/arm/sa11x0/sa1100mm/current/src/sa1100mm_misc.c
+++ b/packages/hal/arm/sa11x0/sa1100mm/current/src/sa1100mm_misc.c
@@ -225,3 +225,18 @@ void
 plf_hardware_init(void)
 {
 }
+
+#include CYGHWR_MEMORY_LAYOUT_H
+typedef void code_fun(void);
+void sa1100mm_program_new_stack(void *func)
+{
+    register CYG_ADDRESS stack_ptr asm("sp");
+    register CYG_ADDRESS old_stack asm("r4");
+    register code_fun *new_func asm("r0");
+    old_stack = stack_ptr;
+    stack_ptr = CYGMEM_REGION_ram + CYGMEM_REGION_ram_SIZE - sizeof(CYG_ADDRESS);
+    new_func = (code_fun*)func;
+    new_func();
+    stack_ptr = old_stack;
+    return;
+}
--- a/packages/io/flash/current/ChangeLog
+++ b/packages/io/flash/current/ChangeLog
@@ -1,3 +1,9 @@
+2000-11-27  Jesper Skov  <jskov@redhat.com>
+
+	* src/flash.c: Do all flash access inside properly
+	cache-controlled region.
+	* include/flash.h: Cache definitions.
+
 2000-11-17  Jesper Skov  <jskov@redhat.com>
 
 	* src/flash.c: Added debug mode, allowing device driver to use printf.
--- a/packages/io/flash/current/include/flash.h
+++ b/packages/io/flash/current/include/flash.h
@@ -45,21 +45,24 @@
 #define _IO_FLASH_H_
 
 #include <pkgconf/io_flash.h>
+#include <cyg/hal/hal_cache.h>
 
 #define FLASH_MIN_WORKSPACE 0x10000  // Space used by FLASH code
 
-extern int flash_init(void *work_space, int work_space_length);
-extern int flash_erase(void *base, int len, void **err_address);
-extern int flash_program(void *flash_base, void *ram_base, int len, void **err_address);
+externC int flash_init(void *work_space, int work_space_length);
+externC int flash_erase(void *base, int len, void **err_address);
+externC int flash_program(void *flash_base, void *ram_base, int len, void **err_address);
 #if 0 < CYGHWR_IO_FLASH_BLOCK_LOCKING // This is an *interface*
-extern int flash_lock(void *base, int len, void **err_address);
-extern int flash_unlock(void *base, int len, void **err_address);
+externC int flash_lock(void *base, int len, void **err_address);
+externC int flash_unlock(void *base, int len, void **err_address);
 #endif
-extern int flash_verify_addr(void *base);
-extern int flash_get_limits(void *base, void **start, void **end);
-extern int flash_get_block_info(int *block_size, int *blocks);
-extern bool flash_code_overlaps(void *start, void *end);
-extern char *flash_errmsg(int err);
+externC int flash_verify_addr(void *base);
+externC int flash_get_limits(void *base, void **start, void **end);
+externC int flash_get_block_info(int *block_size, int *blocks);
+externC bool flash_code_overlaps(void *start, void *end);
+externC char *flash_errmsg(int err);
+
+externC int printf(char* fmt, ...);
 
 #define FLASH_ERR_OK              0x00  // No error - operation complete
 #define FLASH_ERR_INVALID         0x01  // Invalid FLASH address
@@ -89,6 +92,93 @@ extern struct flash_info flash_info;
 extern int  flash_hwr_init(void);
 extern int  flash_hwr_map_error(int err);
 
-#endif
+
+//---------------------------------------------------------------------------
+//Execution of relocated code must be done inside a
+//HAL_FLASH_CACHES_OFF/HAL_FLASH_CACHES_ON region - disabling the
+//cache on unified cache systems is necessary to prevent burst access
+//to the flash area being programmed. With Harvard style caches, only
+//the data cache needs to be disabled, but the instruction cache must
+//still be invalidated to ensure the relocated code is properly
+//fetched from memory.
+
+// Targets may provide alternative implementations for these macros in
+// the hal_cache.h (or var/plf) files.
+
+// The first part below is the optimal implementation, but it does not
+// always work. The second part is a more safe implementation that has
+// been tested to work on some targets - it may not be suitable for
+// targets that would do burst access to the flash (data cache needs
+// disabling as well).
+
+// NOTE: Do _not_ change any of the below macros without checking that
+//       the changed code still works on _all_ platforms that rely on these
+//       macros. There is no such thing as logical and correct when dealing
+//       with different cache and IO models, so _do not_ mess with this code
+//       unless you test it properly afterwards.
+
+#ifndef HAL_FLASH_CACHES_OFF
+
+#ifdef HAL_FLASH_CACHES_WANT_OPTIMAL // Optimal implementation
+
+#ifdef HAL_CACHE_UNIFIED
+
+// Note: the ucache code has not been tested yet on any target.
+#define HAL_FLASH_CACHES_OFF(_d_, _i_)          \
+    CYG_MACRO_START                             \
+    _i_ = 0; /* avoids warning */               \
+    HAL_UCACHE_IS_ENABLED(_d_);                 \
+    HAL_UCACHE_SYNC();                          \
+    HAL_UCACHE_INVALIDATE_ALL();                \
+    HAL_UCACHE_DISABLE();                       \
+    CYG_MACRO_END
+
+#define HAL_FLASH_CACHES_ON(_d_, _i_)           \
+    CYG_MACRO_START                             \
+    if (_d_) HAL_UCACHE_ENABLE();               \
+    CYG_MACRO_END
+
+#else  // HAL_CACHE_UNIFIED
+
+#define HAL_FLASH_CACHES_OFF(_d_, _i_)          \
+    CYG_MACRO_START                             \
+    _i_ = 0; /* avoids warning */               \
+    HAL_DCACHE_IS_ENABLED(_d_);                 \
+    HAL_DCACHE_SYNC();                          \
+    HAL_DCACHE_INVALIDATE_ALL();                \
+    HAL_DCACHE_DISABLE();                       \
+    HAL_ICACHE_INVALIDATE_ALL();                \
+    CYG_MACRO_END
+
+#define HAL_FLASH_CACHES_ON(_d_, _i_)           \
+    CYG_MACRO_START                             \
+    if (_d_) HAL_DCACHE_ENABLE();               \
+    CYG_MACRO_END
+
+#endif // HAL_CACHE_UNIFIED
+
+#else  // HAL_FLASH_CACHES_WANT_OPTIMAL
+
+// Note: This implementation is broken as it will always enable the i-cache
+//       even if it was not enabled before. It also doesn't work if the
+//       target uses burst access to flash since the d-cache is left enabled.
+//       However, this does not mean you can change this code! Leave it as
+//       is - if you want a different implementation, provide it in the
+//       arch/var/platform cache header file.
+
+#define HAL_FLASH_CACHES_OFF(_d_, _i_)          \
+    _d_ = 0; /* avoids warning */               \
+    _i_ = 0; /* avoids warning */               \
+    HAL_DCACHE_SYNC();                          \
+    HAL_ICACHE_DISABLE();
+
+#define HAL_FLASH_CACHES_ON(_d_, _i_)           \
+    HAL_ICACHE_ENABLE();
+
+#endif  // HAL_FLASH_CACHES_WANT_OPTIMAL
+
+#endif  // HAL_FLASH_CACHES_OFF
+
+#endif  // _FLASH_PRIVATE_
 
 #endif  // _IO_FLASH_H_
--- a/packages/io/flash/current/src/flash.c
+++ b/packages/io/flash/current/src/flash.c
@@ -51,6 +51,7 @@
 #define  _FLASH_PRIVATE_
 #include <cyg/io/flash.h>
 
+
 // When this flag is set, 
 #undef RAM_FLASH_DEV_DEBUG
 #if !defined(CYG_HAL_STARTUP_RAM) && defined(RAM_FLASH_DEV_DEBUG)
@@ -111,7 +112,6 @@ flash_get_block_info(int *block_size, in
     *blocks = flash_info.blocks;
     return FLASH_ERR_OK;
 }
-
 int
 flash_erase(void *addr, int len, void **err_addr)
 {
@@ -121,6 +121,7 @@ flash_erase(void *addr, int len, void **
     int code_len;
     typedef int code_fun(unsigned short *);
     code_fun *_flash_erase_block;
+    int d_cache, i_cache;
 
     if (!flash_info.init) {
         return FLASH_ERR_NOT_INIT;
@@ -130,9 +131,8 @@ flash_erase(void *addr, int len, void **
     code_len = (unsigned long)&flash_erase_block_end - (unsigned long)&flash_erase_block;
     _flash_erase_block = (code_fun *)flash_info.work_space;
     memcpy(_flash_erase_block, &flash_erase_block, code_len);
-    HAL_DCACHE_SYNC();  // Should guarantee this code will run
-    HAL_ICACHE_DISABLE(); // is also required to avoid old contents
 
+    HAL_FLASH_CACHES_OFF(d_cache, i_cache);
     block = (unsigned short *)((unsigned long)addr & flash_info.block_mask);
     end_addr = (unsigned short *)((unsigned long)addr+len);
 
@@ -151,7 +151,7 @@ flash_erase(void *addr, int len, void **
         block += flash_info.block_size / sizeof(*block);
         printf(".");
     }
-    HAL_ICACHE_ENABLE();
+    HAL_FLASH_CACHES_ON(d_cache, i_cache);
     printf("\n");
     return (stat);
 }
@@ -166,6 +166,7 @@ flash_program(void *_addr, void *_data, 
     code_fun *_flash_program_buf;
     unsigned short *addr = (unsigned short *)_addr;
     unsigned short *data = (unsigned short *)_data;
+    int d_cache, i_cache;
 
     if (!flash_info.init) {
         return FLASH_ERR_NOT_INIT;
@@ -175,10 +176,9 @@ flash_program(void *_addr, void *_data, 
     code_len = (unsigned long)&flash_program_buf_end - (unsigned long)&flash_program_buf;
     _flash_program_buf = (code_fun *)flash_info.work_space;
     memcpy(_flash_program_buf, &flash_program_buf, code_len);
-    HAL_DCACHE_SYNC();  // Should guarantee this code will run
-    HAL_ICACHE_DISABLE(); // is also required to avoid old contents
+    HAL_FLASH_CACHES_OFF(d_cache, i_cache);
 
-    printf("... Program from %p-%p at %p: ", data, ((unsigned long)data)+len, addr);
+    printf("... Program from %p-%p at %p: ", data, (void*)(((unsigned long)data)+len), addr);
 
     while (len > 0) {
         size = len;
@@ -197,7 +197,7 @@ flash_program(void *_addr, void *_data, 
         addr += size/sizeof(*addr);
         data += size/sizeof(*data);
     }
-    HAL_ICACHE_ENABLE();
+    HAL_FLASH_CACHES_ON(d_cache, i_cache);
     printf("\n");
     return (stat);
 }
@@ -213,6 +213,7 @@ flash_lock(void *addr, int len, void **e
     int code_len;
     typedef int code_fun(unsigned short *);
     code_fun *_flash_lock_block;
+    int d_cache, i_cache;
 
     if (!flash_info.init) {
         return FLASH_ERR_NOT_INIT;
@@ -222,8 +223,7 @@ flash_lock(void *addr, int len, void **e
     code_len = (unsigned long)&flash_lock_block_end - (unsigned long)&flash_lock_block;
     _flash_lock_block = (code_fun *)flash_info.work_space;
     memcpy(_flash_lock_block, &flash_lock_block, code_len);
-    HAL_DCACHE_SYNC();  // Should guarantee this code will run
-    HAL_ICACHE_DISABLE(); // is also required to avoid old contents
+    HAL_FLASH_CACHES_OFF(d_cache, i_cache);
 
     block = (unsigned short *)((unsigned long)addr & flash_info.block_mask);
     end_addr = (unsigned short *)((unsigned long)addr+len);
@@ -243,7 +243,7 @@ flash_lock(void *addr, int len, void **e
         block += flash_info.block_size / sizeof(*block);
         printf(".");
     }
-    HAL_ICACHE_ENABLE();
+    HAL_FLASH_CACHES_ON(d_cache, i_cache);
     printf("\n");
     return (stat);
 }
@@ -257,6 +257,7 @@ flash_unlock(void *addr, int len, void *
     int code_len;
     typedef int code_fun(unsigned short *, int, int);
     code_fun *_flash_unlock_block;
+    int d_cache, i_cache;
 
     if (!flash_info.init) {
         return FLASH_ERR_NOT_INIT;
@@ -266,8 +267,7 @@ flash_unlock(void *addr, int len, void *
     code_len = (unsigned long)&flash_unlock_block_end - (unsigned long)&flash_unlock_block;
     _flash_unlock_block = (code_fun *)flash_info.work_space;
     memcpy(_flash_unlock_block, &flash_unlock_block, code_len);
-    HAL_DCACHE_SYNC();  // Should guarantee this code will run
-    HAL_ICACHE_DISABLE(); // is also required to avoid old contents
+    HAL_FLASH_CACHES_OFF(d_cache, i_cache);
 
     block = (unsigned short *)((unsigned long)addr & flash_info.block_mask);
     end_addr = (unsigned short *)((unsigned long)addr+len);
@@ -287,7 +287,7 @@ flash_unlock(void *addr, int len, void *
         block += flash_info.block_size / sizeof(*block);
         printf(".");
     }
-    HAL_ICACHE_ENABLE();
+    HAL_FLASH_CACHES_ON(d_cache, i_cache);
     printf("\n");
     return (stat);
 }
--- a/packages/language/c/libc/time/current/ChangeLog
+++ b/packages/language/c/libc/time/current/ChangeLog
@@ -1,3 +1,7 @@
+2000-11-27  Jesper Skov  <jskov@redhat.com>
+
+	* tests/clock.c: Skip fourth sample too.
+
 2000-11-14  Jesper Skov  <jskov@redhat.com>
 
 	* tests/clock.c: Skip first three samples.
--- a/packages/language/c/libc/time/current/tests/clock.c
+++ b/packages/language/c/libc/time/current/tests/clock.c
@@ -95,7 +95,8 @@ cyg_start(void)
 // We ignore ctrs[2] because it always seems to be substantially faster
 // that the other samples. Probably due to cache/timing effect after the
 // previous loop.
-#define SKIPPED_SAMPLES 3
+// Finally, ctrs[3] is skipped because it's also very fast on ARM targets.
+#define SKIPPED_SAMPLES 4
 
 
 // FUNCTIONS
--- a/packages/pkgconf/rules.mak
+++ b/packages/pkgconf/rules.mak
@@ -129,10 +129,10 @@ clean:
 	@find . -type f -print | grep -v makefile | xargs rm -f
 
 # rule to copy MLT files
-mlt_headers:
-ifneq ($(strip $(MLT)),)
-	@install -c $(MLT) $(PREFIX)/include/pkgconf
-	@chmod u+w $(PREFIX)/include/pkgconf/mlt*.*
-endif
+mlt_headers: $(foreach x,$(MLT),$(PREFIX)/include/pkgconf/$(notdir $x))
+
+$(foreach x,$(MLT),$(PREFIX)/include/pkgconf/$(notdir $x)): $(MLT)
+	@cp $(dir $<)/$(notdir $@) $(PREFIX)/include/pkgconf
+	@chmod u+w $(PREFIX)/include/pkgconf/$(notdir $@)
 
 # end of file
--- a/packages/redboot/current/ChangeLog
+++ b/packages/redboot/current/ChangeLog
@@ -1,3 +1,8 @@
+2000-11-27  Drew Moseley  <dmoseley@redhat.com>
+
+	* src/main.c: Switch to an application stack before running a
+	user-downloaded app.
+
 2000-11-20  Gary Thomas  <gthomas@redhat.com>
 
 	* src/flash.c: Use CYGBLD_REDBOOT_MIN_IMAGE_SIZE.
--- a/packages/redboot/current/src/main.c
+++ b/packages/redboot/current/src/main.c
@@ -93,6 +93,10 @@ CYG_HAL_TABLE_BEGIN( __RedBoot_CMD_TAB__
 CYG_HAL_TABLE_END( __RedBoot_CMD_TAB_END__, RedBoot_commands );
 extern struct cmd __RedBoot_CMD_TAB__[], __RedBoot_CMD_TAB_END__;
 
+#ifdef HAL_ARCH_PROGRAM_NEW_STACK
+extern void HAL_ARCH_PROGRAM_NEW_STACK(void *fun);
+#endif
+
 void
 do_version(int argc, char *argv[])
 {
@@ -172,7 +176,11 @@ cyg_start(void)
             if (res == 0) {
                 // Special case of '$' - need to start GDB protocol
                 CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);
+#ifdef HAL_ARCH_PROGRAM_NEW_STACK
+                HAL_ARCH_PROGRAM_NEW_STACK(breakpoint);
+#else
                 breakpoint();  // Get GDB stubs started, with a proper environment, etc.
+#endif
             } else {
                 if (strlen(line) > 0) {
                     if ((cmd = parse(line, &argc, &argv[0])) != (struct cmd *)0) {
@@ -288,7 +296,11 @@ do_go(int argc, char *argv[])
     HAL_DCACHE_SYNC();
     HAL_ICACHE_INVALIDATE_ALL();
     HAL_DCACHE_INVALIDATE_ALL();
+#ifdef HAL_ARCH_PROGRAM_NEW_STACK
+    HAL_ARCH_PROGRAM_NEW_STACK(fun);
+#else
     (*fun)();
+#endif
 }
 
 // 
--- a/packages/services/memalloc/common/current/ChangeLog
+++ b/packages/services/memalloc/common/current/ChangeLog
@@ -1,3 +1,8 @@
+2000-11-25  Jonathan Larmour  <jlarmour@redhat.com>
+
+	* cdl/memalloc.cdl: Make sure PWD variable doesn't clash with bash PWD
+	by renaming to XPWD
+
 2000-11-24  Jonathan Larmour  <jlarmour@redhat.com>
 
 	* cdl/memalloc.cdl: Invoke heapgen.tcl with build directory
--- a/packages/services/memalloc/common/current/cdl/memalloc.cdl
+++ b/packages/services/memalloc/common/current/cdl/memalloc.cdl
@@ -231,7 +231,7 @@ cdl_package CYGPKG_MEMALLOC {
         # an absolute path.
         make -priority 50 {
             heaps.cxx : heapgeninc.tcl <PACKAGE>/src/heapgen.tcl
-            sh -c "PWD=`pwd` ; cd $(REPOSITORY)/$(PACKAGE)/src ; sh heapgen.tcl \"$(PREFIX)\" \"$$PWD\""
+            XPWD=`pwd` ; cd $(REPOSITORY)/$(PACKAGE)/src ; sh heapgen.tcl "$(PREFIX)" "$$XPWD"
             @cp heaps.hxx "$(PREFIX)"/include/pkgconf/heaps.hxx
             @chmod u+w "$(PREFIX)"/include/pkgconf/heaps.hxx
         }