[PATCH] score: Fix _Addresses_Subtract()

Sebastian Huber sebastian.huber at embedded-brains.de
Mon Aug 6 09:54:43 UTC 2018


Use architecture-specific integer type for an address difference.

Update #3486.
---
 cpukit/include/rtems/rtems/partimpl.h     | 4 ++--
 cpukit/include/rtems/score/address.h      | 9 +++------
 cpukit/rtems/src/dpmemexternal2internal.c | 8 ++++----
 cpukit/rtems/src/dpmeminternal2external.c | 8 ++++----
 4 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/cpukit/include/rtems/rtems/partimpl.h b/cpukit/include/rtems/rtems/partimpl.h
index ff857708f0..02d3ff8b44 100644
--- a/cpukit/include/rtems/rtems/partimpl.h
+++ b/cpukit/include/rtems/rtems/partimpl.h
@@ -77,9 +77,9 @@ RTEMS_INLINE_ROUTINE bool _Partition_Is_buffer_on_boundary (
   Partition_Control *the_partition
 )
 {
-  uint32_t     offset;
+  intptr_t offset;
 
-  offset = (uint32_t) _Addresses_Subtract(
+  offset = _Addresses_Subtract(
     the_buffer,
     the_partition->starting_address
   );
diff --git a/cpukit/include/rtems/score/address.h b/cpukit/include/rtems/score/address.h
index 8f38f7c2dc..fb88230d18 100644
--- a/cpukit/include/rtems/score/address.h
+++ b/cpukit/include/rtems/score/address.h
@@ -77,7 +77,7 @@ RTEMS_INLINE_ROUTINE void *_Addresses_Subtract_offset (
 }
 
 /**
- * @brief Subtract two offsets.
+ * @brief Subtract two addresses.
  *
  * This function is used to subtract two addresses.  It returns the
  * resulting offset.
@@ -86,16 +86,13 @@ RTEMS_INLINE_ROUTINE void *_Addresses_Subtract_offset (
  * @param[in] right is the address on the right hand side of the subtraction.
  *
  * @return This method returns the resulting address.
- *
- * @note  The cast of an address to an uint32_t makes this code
- *        dependent on an addresses being thirty two bits.
  */
-RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
+RTEMS_INLINE_ROUTINE intptr_t _Addresses_Subtract(
   const void *left,
   const void *right
 )
 {
-  return (int32_t) ((const char *) left - (const char *) right);
+  return (intptr_t) ( (const char *) left - (const char *) right );
 }
 
 /**
diff --git a/cpukit/rtems/src/dpmemexternal2internal.c b/cpukit/rtems/src/dpmemexternal2internal.c
index 0456010675..0d9a754b23 100644
--- a/cpukit/rtems/src/dpmemexternal2internal.c
+++ b/cpukit/rtems/src/dpmemexternal2internal.c
@@ -29,7 +29,7 @@ rtems_status_code rtems_port_external_to_internal(
 {
   Dual_ported_memory_Control *the_port;
   ISR_lock_Context            lock_context;
-  uint32_t                    ending;
+  uintptr_t                   length;
 
   if ( internal == NULL ) {
     return RTEMS_INVALID_ADDRESS;
@@ -41,12 +41,12 @@ rtems_status_code rtems_port_external_to_internal(
     return RTEMS_INVALID_ID;
   }
 
-  ending = _Addresses_Subtract( external, the_port->external_base );
+  length = (uintptr_t) _Addresses_Subtract( external, the_port->external_base );
 
-  if ( ending > the_port->length ) {
+  if ( length > the_port->length ) {
     *internal = external;
   } else {
-    *internal = _Addresses_Add_offset( the_port->internal_base, ending );
+    *internal = _Addresses_Add_offset( the_port->internal_base, length );
   }
 
   _ISR_lock_ISR_enable( &lock_context );
diff --git a/cpukit/rtems/src/dpmeminternal2external.c b/cpukit/rtems/src/dpmeminternal2external.c
index bd66ee45cb..9cd1a5d2f8 100644
--- a/cpukit/rtems/src/dpmeminternal2external.c
+++ b/cpukit/rtems/src/dpmeminternal2external.c
@@ -29,7 +29,7 @@ rtems_status_code rtems_port_internal_to_external(
 {
   Dual_ported_memory_Control *the_port;
   ISR_lock_Context            lock_context;
-  uint32_t                    ending;
+  uintptr_t                   length;
 
   if ( external == NULL ) {
     return RTEMS_INVALID_ADDRESS;
@@ -41,12 +41,12 @@ rtems_status_code rtems_port_internal_to_external(
     return RTEMS_INVALID_ID;
   }
 
-  ending = _Addresses_Subtract( internal, the_port->internal_base );
+  length = (uintptr_t) _Addresses_Subtract( internal, the_port->internal_base );
 
-  if ( ending > the_port->length ) {
+  if ( length > the_port->length ) {
     *external = internal;
   } else {
-    *external = _Addresses_Add_offset( the_port->external_base, ending );
+    *external = _Addresses_Add_offset( the_port->external_base, length );
   }
 
   _ISR_lock_ISR_enable( &lock_context );
-- 
2.13.7



More information about the devel mailing list