<div dir="ltr"><div>I made a fast search:</div><div>These BSPs use <b>rtems_timecounter_simple_downcounter</b>:</div><div>arm/shared/armv7m</div><div>m68k/mcf52235</div><div>m68k/mcf5225x</div><div>m68k/mcf5329</div><div>m68k/uC5282</div><div>powerpc/mpc55xxevb</div><div>sparc/erc32</div><div>sparc/leon2</div><div>sparc/leon3</div><div>sparc/shared</div><div><br></div><div>These use <b>rtems_timecounter_simple_upcounter</b>:</div><div><div>powerpc/mpc55xxevb</div><div>arm/lpc22xx</div></div><div><br></div><div>We should search a little more for the other changes but at least these BSPs will be affected. Maybe we should wait Sebastian's opinion, since he suggested the change in timecounter's signatures.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jan 11, 2016 at 3:44 PM, Joel Sherrill <span dir="ltr"><<a href="mailto:joel@rtems.org" target="_blank">joel@rtems.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Mon, Jan 11, 2016 at 12:28 PM, Marcos Díaz <span dir="ltr"><<a href="mailto:marcos.diaz@tallertechnologies.com" target="_blank">marcos.diaz@tallertechnologies.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I will issue a ticket. But I noticed that in my patch I include changes to common code that Sebastian suggested, and this will break any other BSP that uses <span style="font-size:12.8px">rtems timecounter simple </span><span style="font-size:12.8px">downcounter or upcounter, since these function's signatures changed. Should we update all BSPs? Or make changes more locally to our BSP?  Meanwhile please do not apply the patch I sent.</span><div><span style="font-size:12.8px"><br></span></div></div></blockquote><div><br></div></span><div>I would prefer not to ship BSPs with bugs but fixing them comes with risks.</div><div>So I would lean to the same fix on the master and 4.11 branch fixing it</div><div>where it needs to be fixed.</div><div><br></div><div>What BSPs does this change impact?</div><div><div class="h5"><div><br></div><div>--joel</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><span style="font-size:12.8px"></span></div></div><div class="gmail_extra"><div><div><br><div class="gmail_quote">On Mon, Jan 11, 2016 at 3:16 PM, Joel Sherrill <span dir="ltr"><<a href="mailto:joel@rtems.org" target="_blank">joel@rtems.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">At this point, a ticket is needed for anything applied to 4.11 that is not release<div>mechanics related.</div><span><font color="#888888"><div><br></div><div>--joel</div></font></span></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div>On Mon, Jan 11, 2016 at 11:47 AM, Marcos Diaz <span dir="ltr"><<a href="mailto:marcos.diaz@tallertechnologies.com" target="_blank">marcos.diaz@tallertechnologies.com</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>Hi Sebastian,<br>
<br>
we did some more testing and found out what's causing the problem. Based on what<br>
I posted at <a href="https://lists.rtems.org/pipermail/devel/2015-December/013235.html" rel="noreferrer" target="_blank">https://lists.rtems.org/pipermail/devel/2015-December/013235.html</a>,<br>
the problem arises when the ticker interrupt occurs while a task is executing<br>
one of the instructions that make up the following line:<br>
<br>
is_count_pending = (systick->csr & ARMV7M_SYSTICK_CSR_COUNTFLAG) != 0;<br>
<br>
which compiling with -O3 are:<br>
<br>
ldr.w r3, [r9]<br>
ubfx r5, r3, #16, #1<br>
strb.w r5, [r8, #64]<br>
<br>
If the SysTick counts to 0 and the ldr executes before the interrupt occurs,<br>
R3 will have the CSR.COUNTFLAG bit set. Even though _ARMV7M_TC_at_tick will<br>
clear the is_count_pending boolean, the task will still see it as true.<br>
<br>
The solution we found is to simply disable interrupts while reading that flag.<br>
We also use a local variable inside _ARMV7M_TC_is_pending instead of directly<br>
returning the current value of the is_count_pending global, just in case.<br>
<br>
Here's the patch that fixes it; this applies to the 4.11 branch.<br>
Do we have to open a new thread for it to be applied to the mainline, or will<br>
this suffice? Should we open a ticket for 4.11?<br>
<br>
---<br>
 .../arm/shared/armv7m/clock/armv7m-clock-config.c  | 38 +++++++++++++++-------<br>
 c/src/lib/libbsp/shared/clockdrv_shell.h           | 16 ++++++++-<br>
 cpukit/rtems/src/clocktick.c                       |  6 +++-<br>
 cpukit/sapi/include/rtems/timecounter.h            | 35 ++++++++++++++++----<br>
 cpukit/score/include/rtems/score/timecounter.h     | 37 +++++++++++++++++++--<br>
 cpukit/score/src/kern_tc.c                         | 16 ++++-----<br>
 doc/bsp_howto/clock.t                              | 13 +++++++-<br>
 7 files changed, 130 insertions(+), 31 deletions(-)<br>
<br>
diff --git a/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c b/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c<br>
index e78684c..53bd7cf 100644<br>
--- a/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c<br>
+++ b/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c<br>
@@ -25,6 +25,8 @@ static void Clock_isr(void *arg);<br>
<br>
 static rtems_timecounter_simple _ARMV7M_TC;<br>
<br>
+static bool is_count_pending = false;<br>
+<br>
 static uint32_t _ARMV7M_TC_get(rtems_timecounter_simple *tc)<br>
 {<br>
   volatile ARMV7M_Systick *systick = _ARMV7M_Systick;<br>
@@ -34,9 +36,20 @@ static uint32_t _ARMV7M_TC_get(rtems_timecounter_simple *tc)<br>
<br>
 static bool _ARMV7M_TC_is_pending(rtems_timecounter_simple *tc)<br>
 {<br>
-  volatile ARMV7M_SCB *scb = _ARMV7M_SCB;<br>
+  volatile ARMV7M_Systick *systick = _ARMV7M_Systick;<br>
+  ISR_lock_Context lock_context;<br>
+<br>
+  _Timecounter_Acquire( &lock_context );<br>
+  /* We use this bool since the hardware flag is reset each time it is read. */<br>
+  if (!is_count_pending)<br>
+  {<br>
+    is_count_pending = ((systick->csr & ARMV7M_SYSTICK_CSR_COUNTFLAG) != 0 );<br>
+  }<br>
<br>
-  return ((scb->icsr & ARMV7M_SCB_ICSR_PENDSTSET) != 0);<br>
+  const bool is_pending_local = is_count_pending;<br>
+<br>
+  _Timecounter_Release( &lock_context );<br>
+  return is_pending_local;<br>
 }<br>
<br>
 static uint32_t _ARMV7M_TC_get_timecount(struct timecounter *tc)<br>
@@ -48,19 +61,23 @@ static uint32_t _ARMV7M_TC_get_timecount(struct timecounter *tc)<br>
   );<br>
 }<br>
<br>
-static void _ARMV7M_TC_tick(void)<br>
-{<br>
-  rtems_timecounter_simple_downcounter_tick(&_ARMV7M_TC, _ARMV7M_TC_get);<br>
-}<br>
-<br>
-static void _ARMV7M_Systick_at_tick(void)<br>
+static void _ARMV7M_TC_at_tick(rtems_timecounter_simple *tc)<br>
 {<br>
   volatile ARMV7M_Systick *systick = _ARMV7M_Systick;<br>
-<br>
+  is_count_pending = false;<br>
   /* Clear COUNTFLAG */<br>
   systick->csr;<br>
 }<br>
<br>
+static void _ARMV7M_TC_tick(void)<br>
+{<br>
+  rtems_timecounter_simple_downcounter_tick(<br>
+    &_ARMV7M_TC,<br>
+    _ARMV7M_TC_get,<br>
+    _ARMV7M_TC_at_tick<br>
+  );<br>
+}<br>
+<br>
 static void _ARMV7M_Systick_handler(void)<br>
 {<br>
   _ARMV7M_Interrupt_service_enter();<br>
@@ -111,9 +128,6 @@ static void _ARMV7M_Systick_cleanup(void)<br>
<br>
 #define Clock_driver_timecounter_tick() _ARMV7M_TC_tick()<br>
<br>
-#define Clock_driver_support_at_tick() \<br>
-  _ARMV7M_Systick_at_tick()<br>
-<br>
 #define Clock_driver_support_initialize_hardware() \<br>
   _ARMV7M_Systick_initialize()<br>
<br>
diff --git a/c/src/lib/libbsp/shared/clockdrv_shell.h b/c/src/lib/libbsp/shared/clockdrv_shell.h<br>
index d546fb8..96b962f 100644<br>
--- a/c/src/lib/libbsp/shared/clockdrv_shell.h<br>
+++ b/c/src/lib/libbsp/shared/clockdrv_shell.h<br>
@@ -44,6 +44,13 @@<br>
   #define Clock_driver_support_find_timer()<br>
 #endif<br>
<br>
+/**<br>
+ * @brief Do nothing by default.<br>
+ */<br>
+#ifndef Clock_driver_support_at_tick<br>
+  #define Clock_driver_support_at_tick()<br>
+#endif<br>
+<br>
 /*<br>
  * A specialized clock driver may use for example rtems_timecounter_tick_simple()<br>
  * instead of the default.<br>
@@ -108,7 +115,14 @@ rtems_isr Clock_isr(<br>
           && _Thread_Executing->Start.entry_point<br>
             == (Thread_Entry) rtems_configuration_get_idle_task()<br>
       ) {<br>
-        _Timecounter_Tick_simple(interval, (*tc->tc_get_timecount)(tc));<br>
+        ISR_lock_Context lock_context;<br>
+<br>
+        _Timecounter_Acquire(&lock_context);<br>
+        _Timecounter_Tick_simple(<br>
+          interval,<br>
+          (*tc->tc_get_timecount)(tc),<br>
+          &lock_context<br>
+        );<br>
       }<br>
<br>
       Clock_driver_support_at_tick();<br>
diff --git a/cpukit/rtems/src/clocktick.c b/cpukit/rtems/src/clocktick.c<br>
index e2cd35f..a6bf26d 100644<br>
--- a/cpukit/rtems/src/clocktick.c<br>
+++ b/cpukit/rtems/src/clocktick.c<br>
@@ -23,9 +23,13 @@<br>
<br>
 rtems_status_code rtems_clock_tick( void )<br>
 {<br>
+  ISR_lock_Context lock_context;<br>
+<br>
+  _Timecounter_Acquire( &lock_context );<br>
   _Timecounter_Tick_simple(<br>
     rtems_configuration_get_microseconds_per_tick(),<br>
-    0<br>
+    0,<br>
+    &lock_context<br>
   );<br>
<br>
   return RTEMS_SUCCESSFUL;<br>
diff --git a/cpukit/sapi/include/rtems/timecounter.h b/cpukit/sapi/include/rtems/timecounter.h<br>
index 04bc534..06b3973 100644<br>
--- a/cpukit/sapi/include/rtems/timecounter.h<br>
+++ b/cpukit/sapi/include/rtems/timecounter.h<br>
@@ -94,6 +94,13 @@ typedef struct {<br>
 } rtems_timecounter_simple;<br>
<br>
 /**<br>
+ * @brief At tick handling done under protection of the timecounter lock.<br>
+ */<br>
+typedef uint32_t rtems_timecounter_simple_at_tick(<br>
+  rtems_timecounter_simple *tc<br>
+);<br>
+<br>
+/**<br>
  * @brief Returns the current value of a simple timecounter.<br>
  */<br>
 typedef uint32_t rtems_timecounter_simple_get(<br>
@@ -199,20 +206,28 @@ RTEMS_INLINE_ROUTINE uint32_t rtems_timecounter_simple_scale(<br>
  *<br>
  * @param[in] tc The simple timecounter.<br>
  * @param[in] get The method to get the value of the simple timecounter.<br>
+ * @param[in] at_tick The method to perform work under timecounter lock<br>
+ * protection at this tick, e.g. clear a pending flag.<br>
  */<br>
 RTEMS_INLINE_ROUTINE void rtems_timecounter_simple_downcounter_tick(<br>
-  rtems_timecounter_simple     *tc,<br>
-  rtems_timecounter_simple_get  get<br>
+  rtems_timecounter_simple         *tc,<br>
+  rtems_timecounter_simple_get      get,<br>
+  rtems_timecounter_simple_at_tick  at_tick<br>
 )<br>
 {<br>
+  ISR_lock_Context lock_context;<br>
   uint32_t current;<br>
<br>
+  _Timecounter_Acquire( &lock_context );<br>
+<br>
+  ( *at_tick )( tc );<br>
+<br>
   current = rtems_timecounter_simple_scale(<br>
     tc,<br>
     tc->real_interval - ( *get )( tc )<br>
   );<br>
<br>
-  _Timecounter_Tick_simple( tc->binary_interval, current );<br>
+  _Timecounter_Tick_simple( tc->binary_interval, current, &lock_context );<br>
 }<br>
<br>
 /**<br>
@@ -220,17 +235,25 @@ RTEMS_INLINE_ROUTINE void rtems_timecounter_simple_downcounter_tick(<br>
  *<br>
  * @param[in] tc The simple timecounter.<br>
  * @param[in] get The method to get the value of the simple timecounter.<br>
+ * @param[in] at_tick The method to perform work under timecounter lock<br>
+ * protection at this tick, e.g. clear a pending flag.<br>
  */<br>
 RTEMS_INLINE_ROUTINE void rtems_timecounter_simple_upcounter_tick(<br>
-  rtems_timecounter_simple     *tc,<br>
-  rtems_timecounter_simple_get  get<br>
+  rtems_timecounter_simple         *tc,<br>
+  rtems_timecounter_simple_get      get,<br>
+  rtems_timecounter_simple_at_tick  at_tick<br>
 )<br>
 {<br>
+  ISR_lock_Context lock_context;<br>
   uint32_t current;<br>
<br>
+  _Timecounter_Acquire( &lock_context );<br>
+<br>
+  ( *at_tick )( tc );<br>
+<br>
   current = rtems_timecounter_simple_scale( tc, ( *get )( tc ) );<br>
<br>
-  _Timecounter_Tick_simple( tc->binary_interval, current );<br>
+  _Timecounter_Tick_simple( tc->binary_interval, current, &lock_context );<br>
 }<br>
<br>
 /**<br>
diff --git a/cpukit/score/include/rtems/score/timecounter.h b/cpukit/score/include/rtems/score/timecounter.h<br>
index 0d17cc7..0e611b5 100644<br>
--- a/cpukit/score/include/rtems/score/timecounter.h<br>
+++ b/cpukit/score/include/rtems/score/timecounter.h<br>
@@ -26,6 +26,8 @@<br>
 #include <sys/time.h><br>
 #include <sys/timetc.h><br>
<br>
+#include <rtems/score/isrlock.h><br>
+<br>
 #ifdef __cplusplus<br>
 extern "C" {<br>
 #endif /* __cplusplus */<br>
@@ -161,6 +163,31 @@ void _Timecounter_Install( struct timecounter *tc );<br>
 void _Timecounter_Tick( void );<br>
<br>
 /**<br>
+ * @brief Lock to protect the timecounter mechanic.<br>
+ */<br>
+ISR_LOCK_DECLARE( extern, _Timecounter_Lock )<br>
+<br>
+/**<br>
+ * @brief Acquires the timecounter lock.<br>
+ *<br>
+ * @param[in] lock_context The lock context.<br>
+ *<br>
+ * See _Timecounter_Tick_simple().<br>
+ */<br>
+#define _Timecounter_Acquire( lock_context ) \<br>
+  _ISR_lock_ISR_disable_and_acquire( &_Timecounter_Lock, lock_context )<br>
+<br>
+/**<br>
+ * @brief Releases the timecounter lock.<br>
+ *<br>
+ * @param[in] lock_context The lock context.<br>
+ *<br>
+ * See _Timecounter_Tick_simple().<br>
+ */<br>
+#define _Timecounter_Release(lock_context) \<br>
+  _ISR_lock_Release_and_ISR_enable(&_Timecounter_Lock, lock_context)<br>
+<br>
+/**<br>
  * @brief Performs a simple timecounter tick.<br>
  *<br>
  * This is a special purpose tick function for simple timecounter to support<br>
@@ -169,8 +196,14 @@ void _Timecounter_Tick( void );<br>
  * @param[in] delta The time in timecounter ticks elapsed since the last call<br>
  * to _Timecounter_Tick_simple().<br>
  * @param[in] offset The current value of the timecounter.<br>
- */<br>
-void _Timecounter_Tick_simple( uint32_t delta, uint32_t offset );<br>
+ * @param[in] lock_context The lock context of the corresponding<br>
+ * _Timecounter_Acquire().<br>
+ */<br>
+void _Timecounter_Tick_simple(<br>
+  uint32_t delta,<br>
+  uint32_t offset,<br>
+  ISR_lock_Context *lock_context<br>
+);<br>
<br>
 /**<br>
  * @brief The wall clock time in seconds.<br>
diff --git a/cpukit/score/src/kern_tc.c b/cpukit/score/src/kern_tc.c<br>
index f6a1136..4257533 100644<br>
--- a/cpukit/score/src/kern_tc.c<br>
+++ b/cpukit/score/src/kern_tc.c<br>
@@ -64,7 +64,9 @@ __FBSDID("$FreeBSD r284178 2015-06-09T11:49:56Z$");<br>
 #ifdef __rtems__<br>
 #include <limits.h><br>
 #include <rtems.h><br>
-ISR_LOCK_DEFINE(static, _Timecounter_Lock, "Timecounter");<br>
+ISR_LOCK_DEFINE(, _Timecounter_Lock, "Timecounter")<br>
+#define _Timecounter_Release(lock_context) \<br>
+  _ISR_lock_Release_and_ISR_enable(&_Timecounter_Lock, lock_context)<br>
 #define hz rtems_clock_get_ticks_per_second()<br>
 #define printf(...)<br>
 #define log(...)<br>
@@ -1383,7 +1385,7 @@ tc_windup(void)<br>
 #ifdef __rtems__<br>
        ISR_lock_Context lock_context;<br>
<br>
-       _ISR_lock_ISR_disable_and_acquire(&_Timecounter_Lock, &lock_context);<br>
+       _Timecounter_Acquire(&lock_context);<br>
 #endif /* __rtems__ */<br>
<br>
        /*<br>
@@ -1538,7 +1540,7 @@ tc_windup(void)<br>
        timekeep_push_vdso();<br>
 #endif /* __rtems__ */<br>
 #ifdef __rtems__<br>
-       _ISR_lock_Release_and_ISR_enable(&_Timecounter_Lock, &lock_context);<br>
+       _Timecounter_Release(&lock_context);<br>
 #endif /* __rtems__ */<br>
 }<br>
<br>
@@ -1963,14 +1965,12 @@ _Timecounter_Tick(void)<br>
 }<br>
 #ifdef __rtems__<br>
 void<br>
-_Timecounter_Tick_simple(uint32_t delta, uint32_t offset)<br>
+_Timecounter_Tick_simple(uint32_t delta, uint32_t offset,<br>
+    ISR_lock_Context *lock_context)<br>
 {<br>
        struct bintime bt;<br>
        struct timehands *th;<br>
        uint32_t ogen;<br>
-       ISR_lock_Context lock_context;<br>
-<br>
-       _ISR_lock_ISR_disable_and_acquire(&_Timecounter_Lock, &lock_context);<br>
<br>
        th = timehands;<br>
        ogen = th->th_generation;<br>
@@ -1997,7 +1997,7 @@ _Timecounter_Tick_simple(uint32_t delta, uint32_t offset)<br>
        time_second = th->th_microtime.tv_sec;<br>
        time_uptime = th->th_offset.sec;<br>
<br>
-       _ISR_lock_Release_and_ISR_enable(&_Timecounter_Lock, &lock_context);<br>
+       _Timecounter_Release(lock_context);<br>
<br>
        _Watchdog_Tick();<br>
 }<br>
diff --git a/doc/bsp_howto/clock.t b/doc/bsp_howto/clock.t<br>
index f58b898..2891bb2 100644<br>
--- a/doc/bsp_howto/clock.t<br>
+++ b/doc/bsp_howto/clock.t<br>
@@ -89,6 +89,13 @@ static uint32_t some_tc_get( rtems_timecounter_simple *tc )<br>
   return some.counter;<br>
 @}<br>
<br>
+static void some_tc_at_tick( rtems_timecounter_simple *tc )<br>
+@{<br>
+  /*<br>
+   * Do work necessary at the clock tick interrupt, e.g. clear a pending flag.<br>
+   */<br>
+@}<br>
+<br>
 static bool some_tc_is_pending( rtems_timecounter_simple *tc )<br>
 @{<br>
   return some.is_pending;<br>
@@ -105,7 +112,11 @@ static uint32_t some_tc_get_timecount( struct timecounter *tc )<br>
<br>
 static void some_tc_tick( void )<br>
 @{<br>
-  rtems_timecounter_simple_downcounter_tick( &some_tc, some_tc_get );<br>
+  rtems_timecounter_simple_downcounter_tick(<br>
+    &some_tc,<br>
+    some_tc_get,<br>
+    some_tc_at_tick<br>
+  );<br>
 @}<br>
<br>
 static void some_support_initialize_hardware( void )<br>
--<br>
2.7.0<br>
</div></div><div><div><br><span>
_______________________________________________<br>
devel mailing list<br>
<a href="mailto:devel@rtems.org" target="_blank">devel@rtems.org</a><br>
<a href="http://lists.rtems.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.rtems.org/mailman/listinfo/devel</a><br>
</span></div></div></blockquote></div><br></div>
</blockquote></div><br><br clear="all"><div><br></div></div></div>-- <br><div><div dir="ltr"><span><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:16px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">______________________________</span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><a href="http://www.tallertechnologies.com" target="_blank"><img src="http://www.tallertechnologies.com/templates/tallertechnologies/images/signature.png" width="200" height="78"></a></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><b style="font-weight:normal"><br><span style="font-size:16px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span></b></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><font face="verdana, sans-serif" size="4">Marcos Díaz</font></span></p><p dir="ltr" style="margin-top:0pt;margin-bottom:0pt"><font color="#000000" face="verdana, sans-serif" size="2"><span style="line-height:17px;white-space:pre-wrap">Software Engineer</span></font></p><span><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><b style="font-weight:normal"><br><span style="font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span></b></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><font face="arial, helvetica, sans-serif" size="1">San Lorenzo 47, 3rd Floor, Office 5</font></span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><font face="arial, helvetica, sans-serif" size="1">Córdoba, Argentina </font></span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><b style="font-weight:normal"><font face="arial, helvetica, sans-serif" size="1"><br><span style="color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span></font></b></p></span><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><font face="arial, helvetica, sans-serif" size="1"><span style="color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Phone:</span><span style="color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> <a href="tel:%2B54%20351%204217888" value="+543514217888" target="_blank">+54 351 4217888</a> / <a href="tel:%2B54%20351%204218211" value="+543514218211" target="_blank">+54 351 4218211</a>/ </span><span style="color:rgb(0,0,0);line-height:12px;white-space:pre-wrap"><a href="tel:%2B54%20351%207617452" value="+543517617452" target="_blank">+54 351 7617452</a></span></font></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><font face="arial, helvetica, sans-serif" size="1"><span style="color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Skype:</span><span style="color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> markdiaz22</span></font></p><div><span style="font-size:11px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><br></span></div></span></div></div>
</div>
</blockquote></div></div></div><br></div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><span><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:16px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">______________________________</span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><a href="http://www.tallertechnologies.com" target="_blank"><img src="http://www.tallertechnologies.com/templates/tallertechnologies/images/signature.png" width="200" height="78"></a></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><b style="font-weight:normal"><br><span style="font-size:16px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span></b></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><font face="verdana, sans-serif" size="4">Marcos Díaz</font></span></p><p dir="ltr" style="margin-top:0pt;margin-bottom:0pt"><font color="#000000" face="verdana, sans-serif" size="2"><span style="line-height:17px;white-space:pre-wrap">Software Engineer</span></font></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><b style="font-weight:normal"><br><span style="font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span></b></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><font face="arial, helvetica, sans-serif" size="1">San Lorenzo 47, 3rd Floor, Office 5</font></span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><font face="arial, helvetica, sans-serif" size="1">Córdoba, Argentina </font></span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><b style="font-weight:normal"><font face="arial, helvetica, sans-serif" size="1"><br><span style="color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span></font></b></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><font face="arial, helvetica, sans-serif" size="1"><span style="color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Phone:</span><span style="color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> +54 351 4217888 / +54 351 4218211/ </span><span style="color:rgb(0,0,0);line-height:12px;white-space:pre-wrap">+54 351 7617452</span></font></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><font face="arial, helvetica, sans-serif" size="1"><span style="color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Skype:</span><span style="color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> markdiaz22</span></font></p><div><span style="font-size:11px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><br></span></div></span></div></div>
</div>