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

Re: [tyndur-devel] [Lost] [PATCH v2 09/10] kernel2: IRQ-Verarbeitung fixen



On Sat, Dec 20 23:49, Kevin Wolf wrote:
> ! kernel2: Der RPC zur Benachrichtigung ueber einen IRQ muss immer von dem Task selbst kommen, der benachrichtigt wird.
> * kernel2: Die RPC-Liste, in die eingetragen wird, dass es ein IRQ war, gehoert strenggenommen zum Callee, nicht zum Caller. Das ist mit dem oberen Fix zwar egal, weil es immer dieselben sind, aber schoener ist es schon so.
> ---
>  src/kernel2/src/interrupts/im.c |    6 ++++++
>  src/kernel2/src/syscalls/rpc.c  |    3 +--
>  2 files changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/src/kernel2/src/interrupts/im.c b/src/kernel2/src/interrupts/im.c
> index 1838b4d..d8e12fc 100644
> --- a/src/kernel2/src/interrupts/im.c
> +++ b/src/kernel2/src/interrupts/im.c
> @@ -226,6 +226,7 @@ bool im_add_handler(uint32_t intr, pm_process_t* handler)
>  void im_send_interrupts(void)
>  {
>      uint32_t intr;
> +    pm_thread_t* old_thread = cpu_get_current()->thread;
>  
>      for (intr = 0; intr < IM_NUM_INTERRUPTS; intr++)
>      {
> @@ -235,7 +236,10 @@ void im_send_interrupts(void)
>                  break;
>              }
>  
> +            // Dieses Wechseln des Tasks ist wichtig: IRQs werden nur
> +            // angenommen, wenn der Task sie sich selbst schickt
>              // TODO schedule_to_task(intr_handling_task[intr], esp);
> +            cpu_get_current()->thread = list_get_element_at(intr_handling_task[intr]->threads, 0);
>  
>              if (!fastrpc_irq(intr_handling_task[intr], 0, 0,
>                  sizeof(intr), (char*) &intr, intr - IM_IRQ_BASE))
> @@ -245,4 +249,6 @@ void im_send_interrupts(void)
>              intr_to_send[intr]--;
>          }
>      }
> +
> +    cpu_get_current()->thread = old_thread;
>  }
> diff --git a/src/kernel2/src/syscalls/rpc.c b/src/kernel2/src/syscalls/rpc.c
> index 14fbe11..aa978de 100644
> --- a/src/kernel2/src/syscalls/rpc.c
> +++ b/src/kernel2/src/syscalls/rpc.c
> @@ -323,8 +323,7 @@ bool fastrpc_irq(pm_process_t* callee, size_t metadata_size, void* metadata,
>          return FALSE;
>      }
>  
> -    rpc_t* rpc = list_get_element_at(
> -        cpu_get_current()->thread->process->rpcs, 0);
> +    rpc_t* rpc = list_get_element_at(callee->rpcs, 0);
>      rpc->reenable_irq = irq;
>  
>      return TRUE;

Rein damit.

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: pgpvg51rUG8Ae.pgp
Description: PGP signature