[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. ;-)