Index: kernel/dmotor.c
===================================================================
RCS file: /cvsroot/brickos/brickos/kernel/dmotor.c,v
retrieving revision 1.9
diff -u -r1.9 dmotor.c
--- kernel/dmotor.c	9 Jan 2004 01:44:56 -0000	1.9
+++ kernel/dmotor.c	13 Aug 2004 23:28:08 -0000
@@ -69,7 +69,7 @@
 extern void dm_handler(void);
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 __asm__("\n\
-.section .text.hi\n\
+.section .text\n\
 .align 1\n\
 .global _dm_handler\n\
 _dm_handler:\n\
Index: kernel/lnp-logical.c
===================================================================
RCS file: /cvsroot/brickos/brickos/kernel/lnp-logical.c,v
retrieving revision 1.6
diff -u -r1.6 lnp-logical.c
--- kernel/lnp-logical.c	13 Dec 2002 14:12:01 -0000	1.6
+++ kernel/lnp-logical.c	13 Aug 2004 23:28:08 -0000
@@ -104,10 +104,10 @@
 //! the byte received interrupt handler
 //
 #ifdef CONF_RCX_COMPILER
-static void rx_handler(void) {
+__TEXT_HI__ static void rx_handler(void) {
 #else
 HANDLER_WRAPPER("rx_handler","rx_core");
-void rx_core(void) {
+__TEXT_HI__ void rx_core(void) {
 #endif
   time_t new_tx;
   lnp_timeout_reset();
@@ -138,10 +138,10 @@
 //! the receive error interrupt handler
 //
 #ifdef CONF_RCX_COMPILER
-static void rxerror_handler(void) {
+__TEXT_HI__ static void rxerror_handler(void) {
 #else
 HANDLER_WRAPPER("rxerror_handler","rxerror_core");
-void rxerror_core(void) {
+__TEXT_HI__ void rxerror_core(void) {
 #endif
   time_t new_tx;
   if(tx_state<TX_ACTIVE) {
@@ -159,10 +159,10 @@
 //! the end-of-transmission interrupt handler
 //
 #ifdef CONF_RCX_COMPILER
-void txend_handler(void) {
+__TEXT_HI__ void txend_handler(void) {
 #else
 HANDLER_WRAPPER("txend_handler","txend_core");
-void txend_core(void) {
+__TEXT_HI__ void txend_core(void) {
 #endif
   // shutdown transmit and irqs, clear status flags
   //
@@ -174,10 +174,10 @@
 /*! write next byte if there's one left, otherwise unhook irq.
 */
 #ifdef CONF_RCX_COMPILER
-static void tx_handler(void) {
+__TEXT_HI__ static void tx_handler(void) {
 #else
 HANDLER_WRAPPER("tx_handler","tx_core");
-void tx_core(void) {
+__TEXT_HI__ void tx_core(void) {
 #endif
   if(tx_ptr<tx_end) {
     // transmit next byte
@@ -192,7 +192,7 @@
 }
 
 //! shutdown IR port
-void lnp_logical_shutdown(void) {
+__TEXT_HI__ void lnp_logical_shutdown(void) {
   S_CR =0;        // everything off
   carrier_shutdown();
   lnp_logical_range(0);
@@ -208,7 +208,7 @@
 //! initialize link networking protocol logical layer (IR port).
 /*! initially set to low range.
 */
-void lnp_logical_init(void) {
+__TEXT_HI__ void lnp_logical_init(void) {
   // safe initial state.
   //
   lnp_logical_shutdown();
@@ -245,11 +245,11 @@
 }
 
 
-static wakeup_t write_allow(wakeup_t data) {
+__TEXT_HI__ static wakeup_t write_allow(wakeup_t data) {
   return get_system_up_time() >= *((volatile time_t*)&allow_tx);
 }
 
-static wakeup_t write_complete(wakeup_t data) {
+__TEXT_HI__ static wakeup_t write_complete(wakeup_t data) {
   return *((volatile signed char*)&tx_state)<TX_ACTIVE;
 }
 
@@ -258,7 +258,7 @@
     \param len number of bytes to transmit
     \return 0 on success, else collision
 */
-int lnp_logical_write(const void* buf,size_t len) {
+__TEXT_HI__ int lnp_logical_write(const void* buf,size_t len) {
   unsigned char tmp;
 
 #ifdef CONF_TM
Index: kernel/lnp.c
===================================================================
RCS file: /cvsroot/brickos/brickos/kernel/lnp.c,v
retrieving revision 1.8
diff -u -r1.8 lnp.c
--- kernel/lnp.c	2 Jan 2004 12:27:40 -0000	1.8
+++ kernel/lnp.c	13 Aug 2004 23:28:08 -0000
@@ -58,6 +58,9 @@
 #endif
 
 #include <string.h>
+#ifndef __TEXT_HI__
+#define __TEXT_HI__
+#endif
 
 ///////////////////////////////////////////////////////////////////////////////
 //
@@ -132,9 +135,9 @@
 #define lnp_checksum_step(sum,d)  (unsigned char)((sum) += (d))
 
 #ifdef CONF_HOST
-unsigned char lnp_checksum_copy( unsigned char *dest,
-                                 const unsigned char *data, 
-                                 unsigned length )
+__TEXT_HI__ unsigned char lnp_checksum_copy( unsigned char *dest,
+					     const unsigned char *data, 
+					     unsigned length )
 {
   unsigned char a = 0xff;
   unsigned char t;
@@ -174,7 +177,7 @@
 //! send a LNP integrity layer packet of given length
 /*! \return 0 on success.
 */
-int lnp_integrity_write(const unsigned char *data,unsigned char length) {
+__TEXT_HI__ int lnp_integrity_write(const unsigned char *data,unsigned char length) {
   int r;
 #if defined(CONF_MM)
   char* buffer_ptr = malloc(length+3);
@@ -195,7 +198,7 @@
 //! send a LNP addressing layer packet of given length
 /*! \return 0 on success.
 */
-int lnp_addressing_write(const unsigned char *data,unsigned char length,
+__TEXT_HI__ int lnp_addressing_write(const unsigned char *data,unsigned char length,
                          unsigned char dest,unsigned char srcport) {
   int r;
 #if defined(CONF_MM)
@@ -258,7 +261,7 @@
 }
 
 //! receive a byte, decoding LNP packets with a state machine.
-void lnp_integrity_byte(unsigned char b) {
+__TEXT_HI__ void lnp_integrity_byte(unsigned char b) {
   static unsigned char buffer[256+3];
   static int bytesRead,endOfData;
   static unsigned char chk;
@@ -382,7 +385,6 @@
      {
         lnp_rcx_message = (lnp_rcx_temp1 > 2) ? 3 : lnp_rcx_temp1;
      } 
-     else
 #endif
      {
         // Invoke remote handler if any
@@ -442,10 +444,10 @@
 
 //! reset the integrity layer on error or timeout.
 #if defined(CONF_RCX_COMPILER) || defined(CONF_HOST)
-void lnp_integrity_reset(void) {
+__TEXT_HI__ void lnp_integrity_reset(void) {
 #else
 HANDLER_WRAPPER("lnp_integrity_reset","lnp_integrity_reset_core");
-void lnp_integrity_reset_core(void) {
+__TEXT_HI__ void lnp_integrity_reset_core(void) {
 #endif
 #ifndef CONF_HOST
   if(tx_state>TX_IDLE) {
@@ -469,16 +471,16 @@
 //! return whether a packet is currently being received
 /*! \return 1 if yes, else zero
 */
-int lnp_integrity_active(void) {
+__TEXT_HI__ int lnp_integrity_active(void) {
   return lnp_integrity_state!=LNPwaitHeader;
 }
 
 //! reset the inter-byte timeout counter.
 #if defined(CONF_RCX_COMPILER) || defined(CONF_HOST)
-void lnp_timeout_reset(void) {
+__TEXT_HI__ void lnp_timeout_reset(void) {
 #else
 HANDLER_WRAPPER("lnp_timeout_reset","lnp_timeout_reset_core");
-void lnp_timeout_reset_core(void) {
+__TEXT_HI__ void lnp_timeout_reset_core(void) {
 #endif
   lnp_timeout_counter=lnp_timeout;
 }
@@ -486,14 +488,14 @@
 //! set the inter-byte timeout and reset the timeout counter to that value.
 /*! \param  timeout the new timeout value
 */
-void lnp_timeout_set(unsigned short timeout) {
+__TEXT_HI__ void lnp_timeout_set(unsigned short timeout) {
   lnp_timeout_counter=lnp_timeout=timeout;
 }
 
 //! Initialise protocol handlers
 /*! Adressing port 0 is reserved for the program handler.
 */
-void lnp_init(void) {
+__TEXT_HI__ void lnp_init(void) {
   int k;
   
   for(k=1; k<=LNP_PORTMASK; k++)
@@ -509,14 +511,14 @@
 }
 
 #ifdef CONF_RCX_MESSAGE
-wakeup_t msg_received(wakeup_t m) {
+__TEXT_HI__ wakeup_t msg_received(wakeup_t m) {
     return (m == 0 ? lnp_rcx_message != 0 : lnp_rcx_message == m);
 }
 
 //! send a standard firmware message
 /*! \return 0 on success.
  */
-int send_msg(unsigned char msg)
+__TEXT_HI__ int send_msg(unsigned char msg)
 {
   int r;
 #if defined(CONF_MM)
Index: kernel/program.c
===================================================================
RCS file: /cvsroot/brickos/brickos/kernel/program.c,v
retrieving revision 1.8
diff -u -r1.8 program.c
--- kernel/program.c	24 Sep 2002 03:10:06 -0000	1.8
+++ kernel/program.c	13 Aug 2004 23:28:08 -0000
@@ -158,7 +158,7 @@
 }
 
 //! packet command parser task
-static int packet_consumer(int argc, char *argv[]) {
+__TEXT_HI__ static int packet_consumer(int argc, char *argv[]) {
   packet_cmd_t cmd;
   unsigned char nr=0;
   program_t *prog=programs; // to avoid a silly warning
@@ -494,7 +494,7 @@
 
 #if defined(CONF_LR_HANDLER)
 //! handle remote key input (P1-P5, A1-C1, A2-C2, stop, beep)
-int lrkey_handler(unsigned int etype, unsigned int key) {
+__TEXT_HI__ int lrkey_handler(unsigned int etype, unsigned int key) {
   unsigned char pnr = 0;
 
   // If a program is running, stop it
@@ -635,7 +635,7 @@
 //! initialize program support
 /*! run in single tasking mode
 */
-void program_init() {
+__TEXT_HI__ void program_init() {
   packet_len=0;
   sem_init(&packet_sem,0,0);
   execi(&packet_consumer,0,0,PRIO_HIGHEST,DEFAULT_STACK_SIZE);
@@ -654,7 +654,7 @@
 //! shutdown program support
 /*! run in single tasking mode
 */
-void program_shutdown() {
+__TEXT_HI__ void program_shutdown() {
   lnp_addressing_set_handler(0,LNP_DUMMY_ADDRESSING);
   sem_destroy(&packet_sem);
 
Index: kernel/tm.c
===================================================================
RCS file: /cvsroot/brickos/brickos/kernel/tm.c,v
retrieving revision 1.11
diff -u -r1.11 tm.c
--- kernel/tm.c	9 Jan 2004 01:44:56 -0000	1.11
+++ kernel/tm.c	13 Aug 2004 23:28:08 -0000
@@ -435,7 +435,13 @@
   }
   
   td->tflags = 0;
-  if ((size_t)code_start < (size_t)&mm_start)
+
+  //! the high memory segment
+  extern char __text_hi, __etext_hi;
+
+  if ((size_t)code_start < (size_t)&mm_start
+      || ((size_t)code_start > (size_t)&__text_hi
+	  && (size_t)code_start < (size_t)&__etext_hi))
   {
     td->tflags |= T_KERNEL;
     nb_system_tasks++;
