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

Re: [Lost] [Patch 1/3] kernel2: RPC



> > Index: trunk/src/kernel2/src/syscalls/rpc.c
> > ===================================================================
> > --- trunk.orig/src/kernel2/src/syscalls/rpc.c
> > +++ trunk/src/kernel2/src/syscalls/rpc.c
> > ....
> > +    // Der aufgerufene Task darf wieder laufen
> > +    if (callee->status == PM_STATUS_WAIT_FOR_RPC) {
> > +        callee->status = PM_STATUS_READY;
> > +    }
> > +
>
> Muss da das if wirklich hin? Wenn ja, deckt es auch alle Fälle? Irgendwie
> bin ich da grad etwas unsicher.

Hm, keine Ahnung. Aber von BLOCKED auf READY setzen, nur weil ein RPC kommt? 
Halte ich mal grundsätzlich für mutig.

> > +void syscall_fastrpc_ret(void)
> > +{
> > +    rpc_t* rpc = list_pop(cpu_get_current()->thread->process->rpcs);
> > +    interrupt_stack_frame_t* callee_isf =
> > +        cpu_get_current()->thread->kernel_stack;
> > +
> > +    // Wenn der Task vom RPC-Handler zurückkehrt, obwohl der Handler
> > +    // gar nicht aufgerufen wurde, läuft was schief
> > +    if (rpc == NULL) {
> > +#if 0
> > +        if(debug_test_flag(DEBUG_FLAG_STACK_BACKTRACE)) {
> > +            stack_backtrace_ebp(callee_isf->ebp, callee_isf->eip);
> > +        }
> > +#endif
> > +        kprintf("Unerwartete Rueckkehr vom RPC-Handler\n");
>
> Und dann kommt absichtlich ein PF? ;-)

Na gut, ich laß mal ein return springen... Oder lieber panic, solange es kein 
abort_task gibt?

> > +/**
> > + * Mappt einen Speicherbereich eines anderen Tasks in einen MM-Kontext
> > an eine + * freie Adresse in einem vorgegebenen Adressberech.
> > + *
> > + * @param target_ctx Kontext, in den gemappt werden soll
> > + * @param source_ctx Kontext, aus dem Speicher gemappt werden soll
> > + * @param start Virtuelle Startadresse des zu mappenden Speicherbereichs
> > + *      bezueglich source_ctx
> > + * @param count Anzahl der zu mappenden Seiten
> > + * @param lower_limit Niedrigste zulaessige virtuelle Adresse
> > + * @param upper_limit Hoechste zulaessige virtuelle Adresse
> > + * @param flags Flags fuer die Pagetable
> > + */
> > +vaddr_t mmc_automap_user(mmc_context_t* target_ctx, mmc_context_t*
> > source_ctx, +    vaddr_t start, size_t count, uintptr_t lower_limit,
> > uintptr_t upper_limit, +    int flags)
> > +{
> > +    size_t i;
> > +    paddr_t paddr;
> > +    vaddr_t vaddr;
> > +    vaddr_t free_page =
> > +        find_contiguous_pages(target_ctx, count, lower_limit,
> > upper_limit); +
> > +    if (free_page == NULL) {
> > +        return NULL;
> > +    }
> > +
> > +    // FIXME Hier wird unter Umstaenden ziemlich oft dieselbe Pagetable
> > gemappt +    // und wieder ungemappt (in mmc_resolve)
> > +    for (i = 0; i < count; i++) {
> > +        paddr = mmc_resolve(source_ctx, start + (i * PAGE_SIZE));
> > +        vaddr = free_page + (i * PAGE_SIZE);
> > +        if (!mmc_map(target_ctx, vaddr, paddr, flags, count)) {
> > +            mmc_unmap(target_ctx, free_page, i);
>
> Und phyisch freigeben?

Da würde sich der Prozeß, dem der source_ctx gehört, aber freuen, wenn mit 
seinen Pages plötzlich SMU gemacht wird. ;-)