bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 3/3 gnumach] i386/x86_64: Add remote AST via IPI mechanism


From: Samuel Thibault
Subject: Re: [PATCH 3/3 gnumach] i386/x86_64: Add remote AST via IPI mechanism
Date: Sun, 13 Aug 2023 00:51:39 +0200
User-agent: NeoMutt/20170609 (1.8.3)

Applied, thanks!

Damien Zammit, le ven. 11 août 2023 08:35:04 +0000, a ecrit:
> ---
>  i386/i386/ast_check.c   |  4 ++++
>  i386/i386/i386asm.sym   |  1 +
>  i386/i386/locore.S      |  1 +
>  i386/i386/smp.c         | 16 +++++++++++++---
>  i386/i386/smp.h         |  1 +
>  i386/i386at/idt.h       |  3 +++
>  i386/i386at/int_init.c  |  4 ++++
>  i386/i386at/interrupt.S |  8 ++++++++
>  x86_64/interrupt.S      |  7 +++++++
>  9 files changed, 42 insertions(+), 3 deletions(-)
> 
> diff --git a/i386/i386/ast_check.c b/i386/i386/ast_check.c
> index 5121abf1..61cd5e87 100644
> --- a/i386/i386/ast_check.c
> +++ b/i386/i386/ast_check.c
> @@ -34,6 +34,9 @@
>  
>  #include <kern/ast.h>
>  #include <kern/processor.h>
> +#include <kern/smp.h>
> +#include <machine/cpu_number.h>
> +#include <machine/apic.h>
>  
>  /*
>   * Initialize for remote invocation of ast_check.
> @@ -47,6 +50,7 @@ void init_ast_check(const processor_t processor)
>   */
>  void cause_ast_check(const processor_t processor)
>  {
> +    smp_remote_ast(apic_get_cpu_apic_id(processor->slot_num));
>  }
>  
>  #endif       /* NCPUS > 1 */
> diff --git a/i386/i386/i386asm.sym b/i386/i386/i386asm.sym
> index 8af0c5d6..18b208e9 100644
> --- a/i386/i386/i386asm.sym
> +++ b/i386/i386/i386asm.sym
> @@ -48,6 +48,7 @@
>  #include <i386/apic.h>
>  #include <i386/xen.h>
>  
> +expr CALL_LOCAL_AST_BASE
>  expr CALL_SINGLE_FUNCTION_BASE
>  
>  offset       ApicLocalUnit           lu      apic_id         APIC_ID
> diff --git a/i386/i386/locore.S b/i386/i386/locore.S
> index 67fe4257..96ed958b 100644
> --- a/i386/i386/locore.S
> +++ b/i386/i386/locore.S
> @@ -652,6 +652,7 @@ INTERRUPT(21)
>  INTERRUPT(22)
>  INTERRUPT(23)
>  #endif
> +INTERRUPT(CALL_LOCAL_AST_BASE)
>  /* Invalidate TLB IPI to call pmap_update_interrupt() on a specific cpu */
>  INTERRUPT(CALL_SINGLE_FUNCTION_BASE)
>  #ifdef APIC
> diff --git a/i386/i386/smp.c b/i386/i386/smp.c
> index c0149a3b..f3810370 100644
> --- a/i386/i386/smp.c
> +++ b/i386/i386/smp.c
> @@ -45,19 +45,19 @@ static void smp_data_init(void)
>  
>  }
>  
> -void smp_pmap_update(unsigned apic_id)
> +static void smp_send_ipi(unsigned apic_id, unsigned vector)
>  {
>      unsigned long flags;
>  
>      cpu_intr_save(&flags);
>  
> -    apic_send_ipi(NO_SHORTHAND, FIXED, PHYSICAL, ASSERT, EDGE, 
> CALL_SINGLE_FUNCTION_BASE, apic_id);
> +    apic_send_ipi(NO_SHORTHAND, FIXED, PHYSICAL, ASSERT, EDGE, vector, 
> apic_id);
>  
>      do {
>          cpu_pause();
>      } while(lapic->icr_low.delivery_status == SEND_PENDING);
>  
> -    apic_send_ipi(NO_SHORTHAND, FIXED, PHYSICAL, DE_ASSERT, EDGE, 
> CALL_SINGLE_FUNCTION_BASE, apic_id);
> +    apic_send_ipi(NO_SHORTHAND, FIXED, PHYSICAL, DE_ASSERT, EDGE, vector, 
> apic_id);
>  
>      do {
>          cpu_pause();
> @@ -66,6 +66,16 @@ void smp_pmap_update(unsigned apic_id)
>      cpu_intr_restore(flags);
>  }
>  
> +void smp_remote_ast(unsigned apic_id)
> +{
> +    smp_send_ipi(apic_id, CALL_LOCAL_AST_BASE);
> +}
> +
> +void smp_pmap_update(unsigned apic_id)
> +{
> +    smp_send_ipi(apic_id, CALL_SINGLE_FUNCTION_BASE);
> +}
> +
>  /* See Intel IA32/64 Software Developer's Manual 3A Section 8.4.4.1 */
>  void smp_startup_cpu(unsigned apic_id, unsigned vector)
>  {
> diff --git a/i386/i386/smp.h b/i386/i386/smp.h
> index 1faa39cd..784936ea 100644
> --- a/i386/i386/smp.h
> +++ b/i386/i386/smp.h
> @@ -22,6 +22,7 @@
>  #define _SMP_H_
>  
>  int smp_init(void);
> +void smp_remote_ast(unsigned apic_id);
>  void smp_pmap_update(unsigned apic_id);
>  void smp_startup_cpu(unsigned apic_id, unsigned vector);
>  
> diff --git a/i386/i386at/idt.h b/i386/i386at/idt.h
> index f080bb12..1c30eb7d 100644
> --- a/i386/i386at/idt.h
> +++ b/i386/i386at/idt.h
> @@ -37,6 +37,9 @@
>  /* IOAPIC spurious interrupt vector set to 0xff */
>  #define IOAPIC_SPURIOUS_BASE 0xff
>  
> +/* Remote -> local AST requests */
> +#define CALL_LOCAL_AST_BASE 0xfa
> +
>  /* Currently for TLB shootdowns */
>  #define CALL_SINGLE_FUNCTION_BASE 0xfb
>  
> diff --git a/i386/i386at/int_init.c b/i386/i386at/int_init.c
> index e7fe7e31..e3c4b8c8 100644
> --- a/i386/i386at/int_init.c
> +++ b/i386/i386at/int_init.c
> @@ -45,6 +45,10 @@ int_fill(struct real_gate *myidt)
>                             int_entry_table[i], KERNEL_CS,
>                             ACC_PL_K|ACC_INTR_GATE, 0);
>       }
> +     fill_idt_gate(myidt, CALL_LOCAL_AST_BASE,
> +                           int_entry_table[i], KERNEL_CS,
> +                           ACC_PL_K|ACC_INTR_GATE, 0);
> +     i++;
>       fill_idt_gate(myidt, CALL_SINGLE_FUNCTION_BASE,
>                             int_entry_table[i], KERNEL_CS,
>                             ACC_PL_K|ACC_INTR_GATE, 0);
> diff --git a/i386/i386at/interrupt.S b/i386/i386at/interrupt.S
> index 1f661f8d..a20707da 100644
> --- a/i386/i386at/interrupt.S
> +++ b/i386/i386at/interrupt.S
> @@ -46,6 +46,9 @@ ENTRY(interrupt)
>       cmpl    $CALL_SINGLE_FUNCTION_BASE,%eax         /* was this a SMP call 
> single function request? */
>       je      _call_single
>  
> +     cmpl    $CALL_LOCAL_AST_BASE,%eax       /* was this a SMP remote -> 
> local ast request? */
> +     je      _call_local_ast
> +
>       subl    $24,%esp                /* Two local variables + 4 parameters */
>       movl    %eax,S_IRQ              /* save irq number */
>       call    spl7                    /* set ipl */
> @@ -127,4 +130,9 @@ _call_single:
>       call    EXT(lapic_eoi)          /* lapic EOI before the handler to 
> allow extra update */
>       call    EXT(pmap_update_interrupt) /* TODO: Allow other functions */
>       ret
> +
> +_call_local_ast:
> +     call    EXT(ast_check)          /* AST check on this cpu */
> +     call    EXT(lapic_eoi)          /* lapic EOI */
> +     ret
>  END(interrupt)
> diff --git a/x86_64/interrupt.S b/x86_64/interrupt.S
> index eabf934e..ec6dc96c 100644
> --- a/x86_64/interrupt.S
> +++ b/x86_64/interrupt.S
> @@ -45,6 +45,9 @@ ENTRY(interrupt)
>  
>       cmpl    $CALL_SINGLE_FUNCTION_BASE,%eax /* was this a SMP call single 
> function request? */
>       je      _call_single
> +
> +     cmpl    $CALL_LOCAL_AST_BASE,%eax       /* was this a SMP remote -> 
> local ast request? */
> +     je      _call_local_ast
>  #endif
>       subq    $16,%rsp                /* Two local variables */
>       movl    %eax,S_IRQ              /* save irq number */
> @@ -122,6 +125,10 @@ _call_single:
>       call    EXT(lapic_eoi)          /* lapic EOI before the handler to 
> allow extra update */
>       call    EXT(pmap_update_interrupt) /* TODO: Allow other functions */
>       ret
> +_call_local_ast:
> +     call    EXT(ast_check)          /* AST check on this cpu */
> +     call    EXT(lapic_eoi)          /* lapic EOI */
> +     ret
>  #endif
>       addq    $16,%rsp                /* pop local variables */
>  _no_eoi:
> -- 
> 2.40.1
> 
> 
> 

-- 
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]