diff mbox series

[v2] Mini-OS: add some macros for asm statements

Message ID 20240719155701.18856-1-jgross@suse.com (mailing list archive)
State New
Headers show
Series [v2] Mini-OS: add some macros for asm statements | expand

Commit Message

Jürgen Groß July 19, 2024, 3:57 p.m. UTC
Instead of having #ifdefs sprinkled around in x86 code, add some
macros defining constants for asm statements to address differences
between 32- and 64-bit mode.

Modify existing code to use those macros.

While at it convert the assembler parts of run_idle_thread() to a more
sane variant.

Signed-off-by: Juergen Gross <jgross@suse.com>
---
V2:
- addressed comments by Andrew Cooper
---
 arch/x86/sched.c | 34 ++++++++++------------------------
 include/x86/os.h | 18 ++++++++++--------
 2 files changed, 20 insertions(+), 32 deletions(-)

Comments

Jan Beulich July 22, 2024, 7:15 a.m. UTC | #1
On 19.07.2024 17:57, Juergen Gross wrote:
> --- a/arch/x86/sched.c
> +++ b/arch/x86/sched.c
> @@ -60,16 +60,10 @@ void dump_stack(struct thread *thread)
>      unsigned long *bottom = (unsigned long *)(thread->stack + STACK_SIZE); 
>      unsigned long *pointer = (unsigned long *)thread->sp;
>      int count;
> -    if(thread == current)
> -    {
> -#ifdef __i386__    
> -        asm("movl %%esp,%0"
> -            : "=r"(pointer));
> -#else
> -        asm("movq %%rsp,%0"
> -            : "=r"(pointer));
> -#endif
> -    }
> +
> +    if ( thread == current )
> +        asm("mov %%"ASM_SP",%0" : "=r"(pointer));

As you switch the if() to Xen style, why not also the asm()? Irrespective of
which precise style is meant to be used, the last closing double quote likely
also wants to be followed by a blank?

> @@ -119,20 +113,12 @@ struct thread* arch_create_thread(char *name, void (*function)(void *),
>  
>  void run_idle_thread(void)
>  {
> -    /* Switch stacks and run the thread */ 
> -#if defined(__i386__)
> -    __asm__ __volatile__("mov %0,%%esp\n\t"
> -                         "push %1\n\t" 
> -                         "ret"                                            
> -                         :"=m" (idle_thread->sp)
> -                         :"m" (idle_thread->ip));                          
> -#elif defined(__x86_64__)
> -    __asm__ __volatile__("mov %0,%%rsp\n\t"
> -                         "push %1\n\t" 
> -                         "ret"                                            
> -                         :"=m" (idle_thread->sp)
> -                         :"m" (idle_thread->ip));                                                    
> -#endif
> +    /* Switch stacks and run the thread */
> +    asm volatile ("mov %[sp], %%"ASM_SP"\n\t"
> +                  "jmp *%[ip]\n\t"
> +                  :
> +                  : [sp] "m" (idle_thread->sp),
> +                    [ip] "m" (idle_thread->ip));
>  }

Here instead you look to be switching to Linux style. Was that intended?

As an aside, I think the construct is slightly problematic: In principle
the compiler could make a copy of idle_thread->ip on the stack. (It
won't normally, for code efficiency reasons.) That would break with the
earlier change of the stack pointer. Using an "r" constraint would
perhaps be better there. Yet if so wanted, that would certainly be a
separate change.

With the adjustments (or respective clarifications as to style intentions),
which I'd be fine making while committing so long as you agree:
Reviewed-by: Jan Beulich <jbeulich@suse.com>

Jan
Jürgen Groß July 22, 2024, 8:44 a.m. UTC | #2
On 22.07.24 09:15, Jan Beulich wrote:
> On 19.07.2024 17:57, Juergen Gross wrote:
>> --- a/arch/x86/sched.c
>> +++ b/arch/x86/sched.c
>> @@ -60,16 +60,10 @@ void dump_stack(struct thread *thread)
>>       unsigned long *bottom = (unsigned long *)(thread->stack + STACK_SIZE);
>>       unsigned long *pointer = (unsigned long *)thread->sp;
>>       int count;
>> -    if(thread == current)
>> -    {
>> -#ifdef __i386__
>> -        asm("movl %%esp,%0"
>> -            : "=r"(pointer));
>> -#else
>> -        asm("movq %%rsp,%0"
>> -            : "=r"(pointer));
>> -#endif
>> -    }
>> +
>> +    if ( thread == current )
>> +        asm("mov %%"ASM_SP",%0" : "=r"(pointer));
> 
> As you switch the if() to Xen style, why not also the asm()? Irrespective of
> which precise style is meant to be used, the last closing double quote likely
> also wants to be followed by a blank?

Yes, indeed.

> 
>> @@ -119,20 +113,12 @@ struct thread* arch_create_thread(char *name, void (*function)(void *),
>>   
>>   void run_idle_thread(void)
>>   {
>> -    /* Switch stacks and run the thread */
>> -#if defined(__i386__)
>> -    __asm__ __volatile__("mov %0,%%esp\n\t"
>> -                         "push %1\n\t"
>> -                         "ret"
>> -                         :"=m" (idle_thread->sp)
>> -                         :"m" (idle_thread->ip));
>> -#elif defined(__x86_64__)
>> -    __asm__ __volatile__("mov %0,%%rsp\n\t"
>> -                         "push %1\n\t"
>> -                         "ret"
>> -                         :"=m" (idle_thread->sp)
>> -                         :"m" (idle_thread->ip));
>> -#endif
>> +    /* Switch stacks and run the thread */
>> +    asm volatile ("mov %[sp], %%"ASM_SP"\n\t"
>> +                  "jmp *%[ip]\n\t"
>> +                  :
>> +                  : [sp] "m" (idle_thread->sp),
>> +                    [ip] "m" (idle_thread->ip));
>>   }
> 
> Here instead you look to be switching to Linux style. Was that intended?

No, not really. I took Andrew's suggestion verbatim.

> As an aside, I think the construct is slightly problematic: In principle
> the compiler could make a copy of idle_thread->ip on the stack. (It
> won't normally, for code efficiency reasons.) That would break with the
> earlier change of the stack pointer. Using an "r" constraint would
> perhaps be better there. Yet if so wanted, that would certainly be a
> separate change.
> 
> With the adjustments (or respective clarifications as to style intentions),
> which I'd be fine making while committing so long as you agree:
> Reviewed-by: Jan Beulich <jbeulich@suse.com>

Thanks. I agree with the suggested changes (to spell it out explicitly: I
meant to use Xen coding style, as this is the Mini-OS style, too).


Juergen
diff mbox series

Patch

diff --git a/arch/x86/sched.c b/arch/x86/sched.c
index dabe6fd6..42805f9f 100644
--- a/arch/x86/sched.c
+++ b/arch/x86/sched.c
@@ -60,16 +60,10 @@  void dump_stack(struct thread *thread)
     unsigned long *bottom = (unsigned long *)(thread->stack + STACK_SIZE); 
     unsigned long *pointer = (unsigned long *)thread->sp;
     int count;
-    if(thread == current)
-    {
-#ifdef __i386__    
-        asm("movl %%esp,%0"
-            : "=r"(pointer));
-#else
-        asm("movq %%rsp,%0"
-            : "=r"(pointer));
-#endif
-    }
+
+    if ( thread == current )
+        asm("mov %%"ASM_SP",%0" : "=r"(pointer));
+
     printk("The stack for \"%s\"\n", thread->name);
     for(count = 0; count < 25 && pointer < bottom; count ++)
     {
@@ -119,20 +113,12 @@  struct thread* arch_create_thread(char *name, void (*function)(void *),
 
 void run_idle_thread(void)
 {
-    /* Switch stacks and run the thread */ 
-#if defined(__i386__)
-    __asm__ __volatile__("mov %0,%%esp\n\t"
-                         "push %1\n\t" 
-                         "ret"                                            
-                         :"=m" (idle_thread->sp)
-                         :"m" (idle_thread->ip));                          
-#elif defined(__x86_64__)
-    __asm__ __volatile__("mov %0,%%rsp\n\t"
-                         "push %1\n\t" 
-                         "ret"                                            
-                         :"=m" (idle_thread->sp)
-                         :"m" (idle_thread->ip));                                                    
-#endif
+    /* Switch stacks and run the thread */
+    asm volatile ("mov %[sp], %%"ASM_SP"\n\t"
+                  "jmp *%[ip]\n\t"
+                  :
+                  : [sp] "m" (idle_thread->sp),
+                    [ip] "m" (idle_thread->ip));
 }
 
 unsigned long __local_irq_save(void)
diff --git a/include/x86/os.h b/include/x86/os.h
index ee34d784..0095be13 100644
--- a/include/x86/os.h
+++ b/include/x86/os.h
@@ -61,6 +61,16 @@ 
 #define TRAP_deferred_nmi     31
 #define TRAP_xen_callback     32
 
+#if defined(__i386__)
+#define __SZ    "l"
+#define __REG   "e"
+#else
+#define __SZ    "q"
+#define __REG   "r"
+#endif
+
+#define ASM_SP  __REG"sp"
+
 /* Everything below this point is not included by assembler (.S) files. */
 #ifndef __ASSEMBLY__
 
@@ -141,14 +151,6 @@  do {									\
 
 #else
 
-#if defined(__i386__)
-#define __SZ "l"
-#define __REG "e"
-#else
-#define __SZ "q"
-#define __REG "r"
-#endif
-
 #define __cli() asm volatile ( "cli" : : : "memory" )
 #define __sti() asm volatile ( "sti" : : : "memory" )