[PATCH 3/3] use RTEMS_PARAVIRT as guard to distinguish between virtual and native functionality on i386

Philipp Eppelt philipp.eppelt at mailbox.tu-dresden.de
Wed Nov 27 18:10:28 UTC 2013


Yes, the .h file is in the follow up patch, which should be applied
afterwards. I was just writing a mail with that info.

Cheers,
Philipp

On 11/27/2013 07:07 PM, Joel Sherrill wrote:
> Generally looks good except you are mentioning a
> new .h file which is not present.
> 
> +#include <virtualizationlayercpu.h>
> 
> I would assume that should be part of a patch in this
> series and that it should be "rtems/virtualizationlayercpu.h".
> 
> My only other comment is that the use of only cpu.c
> and cpu_asm.c dates to the dawn of RTEMS. If you
> want to add score/cpu/i386/cpuidle.c and move that
> code into its own file, I wouldn't be opposed to it.
> But I don't consider that a hard requirement.
> 
> The other two patches look OK if folks like the name.
> 
> --joel
> 
> On 11/27/2013 12:00 PM, Philipp Eppelt wrote:
>> ---
>>  cpukit/score/cpu/i386/cpu.c                    | 18 +++++++++
>>  cpukit/score/cpu/i386/rtems/score/cpu.h        | 51 ++++++++++++++++++++------
>>  cpukit/score/cpu/i386/rtems/score/interrupts.h | 31 ++++++++++++++++
>>  3 files changed, 88 insertions(+), 12 deletions(-)
>>
>> diff --git a/cpukit/score/cpu/i386/cpu.c b/cpukit/score/cpu/i386/cpu.c
>> index c87a76d..0a6139f 100644
>> --- a/cpukit/score/cpu/i386/cpu.c
>> +++ b/cpukit/score/cpu/i386/cpu.c
>> @@ -97,6 +97,22 @@ uint32_t   _CPU_ISR_Get_level( void )
>>    return level;
>>  }
>>  
>> +
>> +#if defined(RTEMS_PARAVIRT)
>> +  
>> +#include <virtualizationlayercpu.h>
>> +  
>> +void *_CPU_Thread_Idle_body( uintptr_t ignored )
>> +{
>> +  while(1) 
>> +  {
>> +    _CPU_Virtual_idle_thread();
>> +  }
>> +  return NULL;
>> +}
>> +
>> +#else 
>> +
>>  void *_CPU_Thread_Idle_body( uintptr_t ignored )
>>  {
>>    while(1){
>> @@ -105,6 +121,8 @@ void *_CPU_Thread_Idle_body( uintptr_t ignored )
>>    return NULL;
>>  }
>>  
>> +#endif /*RTEMS_PARAVIRT*/
>> +
>>  struct Frame_ {
>>  	struct Frame_  *up;
>>  	uintptr_t		pc;
>> diff --git a/cpukit/score/cpu/i386/rtems/score/cpu.h b/cpukit/score/cpu/i386/rtems/score/cpu.h
>> index 43422ed..a8c2ed3 100644
>> --- a/cpukit/score/cpu/i386/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/i386/rtems/score/cpu.h
>> @@ -376,11 +376,24 @@ SCORE_EXTERN Context_Control_fp  _CPU_Null_fp_context;
>>  
>>  #define _CPU_ISR_Flash( _level )   i386_flash_interrupts( _level )
>>  
>> -#define _CPU_ISR_Set_level( _new_level ) \
>> -  { \
>> -    if ( _new_level ) __asm__ volatile ( "cli" ); \
>> -    else              __asm__ volatile ( "sti" ); \
>> -  }
>> +#if defined(RTEMS_PARAVIRT)
>> +  #include <virtualizationlayercpu.h>
>> +
>> +  #define _CPU_ISR_Set_level( _new_level ) \
>> +    { \
>> +      if( _new_level )  _CPU_Virtual_Interrupts_close(); \
>> +      else		_CPU_Virtual_Interrupts_open(); \
>> +    }
>> +
>> +#else
>> +
>> +  #define _CPU_ISR_Set_level( _new_level ) \
>> +    { \
>> +      if ( _new_level ) __asm__ volatile ( "cli" ); \
>> +      else              __asm__ volatile ( "sti" ); \
>> +    }
>> +
>> +#endif /*RTEMS_PARAVIRT*/
>>  
>>  uint32_t   _CPU_ISR_Get_level( void );
>>  
>> @@ -497,16 +510,30 @@ uint32_t   _CPU_ISR_Get_level( void );
>>   *    + disable interrupts and halt the CPU
>>   */
>>  
>> -#define _CPU_Fatal_halt( _error ) \
>> +#if defined(RTEMS_PARAVIRT)
>> +
>> +  #include <virtualizationlayercpu.h>
>> +  
>> +  #define _CPU_Fatal_halt( _error ) \
>>    { \
>> -    uint32_t _error_lvalue = ( _error ); \
>> -    __asm__ volatile ( "cli ; \
>> -                    movl %0,%%eax ; \
>> -                    hlt" \
>> -                    : "=r" ((_error_lvalue)) : "0" ((_error_lvalue)) \
>> -    ); \
>> +    _CPU_Virtual_Interrupts_close(); \
>> +    _CPU_Virtual_exec_stop_error( _error ); \
>>    }
>>  
>> +#else
>> +
>> +  #define _CPU_Fatal_halt( _error ) \
>> +    { \
>> +      uint32_t _error_lvalue = ( _error ); \
>> +      __asm__ volatile ( "cli ; \
>> +                      movl %0,%%eax ; \
>> +                      hlt" \
>> +                      : "=r" ((_error_lvalue)) : "0" ((_error_lvalue)) \
>> +      ); \
>> +    }
>> +
>> +#endif /*RTEMS_PARAVIRT*/
>> +
>>  #endif /* ASM */
>>  
>>  /* end of Fatal Error manager macros */
>> diff --git a/cpukit/score/cpu/i386/rtems/score/interrupts.h b/cpukit/score/cpu/i386/rtems/score/interrupts.h
>> index bed6330..1bc9391 100644
>> --- a/cpukit/score/cpu/i386/rtems/score/interrupts.h
>> +++ b/cpukit/score/cpu/i386/rtems/score/interrupts.h
>> @@ -33,6 +33,36 @@ typedef int  (*rtems_raw_irq_is_enabled)	(const struct __rtems_raw_irq_connect_d
>>   * 
>>   */
>>  /**@{**/
>> +#if defined(RTEMS_PARAVIRT)
>> +  #include <virtualizationlayercpu.h>
>> +
>> +#define i386_disable_interrupts( _level ) \
>> +  { \
>> +    _CPU_Virtual_Interrupts_disable( _level ); \
>> +  }
>> +
>> +#define i386_enable_interrupts( _level )  \
>> +  { \
>> +    _CPU_Virtual_Interrupts_enable( _level ); \
>> +  }
>> +
>> +#define i386_flash_interrupts( _level ) \
>> +  { \
>> +    _CPU_Virtual_Interrupts_enable(_level); \
>> +    _CPU_Virtual_Interrupts_disable(_level); \
>> +  }
>> +
>> +#define i386_get_interrupt_level( _level ) \
>> +  { \
>> +    _CPU_Virtual_Interrupts_get_level( _level ); \
>> +  }
>> +
>> +#define _CPU_ISR_Disable( _level ) i386_disable_interrupts( _level )
>> +#define _CPU_ISR_Enable( _level ) i386_enable_interrupts( _level )
>> +
>> +
>> +#else /*RTEMS_PARAVIRT*/
>> +
>>  
>>  #define i386_disable_interrupts( _level ) \
>>    { \
>> @@ -75,6 +105,7 @@ typedef int  (*rtems_raw_irq_is_enabled)	(const struct __rtems_raw_irq_connect_d
>>  #define _CPU_ISR_Disable( _level ) i386_disable_interrupts( _level )
>>  #define _CPU_ISR_Enable( _level ) i386_enable_interrupts( _level )
>>  
>> +#endif /*RTEMS_PARAVIRT*/
>>  /** @} */
>>  
>>  #endif
>>
> 
> 
> 




More information about the devel mailing list