On Sat, Dec 20 23:49, Kevin Wolf wrote: > + kernel2: Syscall syscall_mem_allocate_physical > --- > src/kernel2/include/syscall.h | 4 ++++ > src/kernel2/src/syscall.c | 2 ++ > src/kernel2/src/syscalls/mem.c | 33 +++++++++++++++++++++++++++++++++ > 3 files changed, 39 insertions(+), 0 deletions(-) > > diff --git a/src/kernel2/include/syscall.h b/src/kernel2/include/syscall.h > index 160cbf3..05715a3 100644 > --- a/src/kernel2/include/syscall.h > +++ b/src/kernel2/include/syscall.h > @@ -77,6 +77,10 @@ void syscall_init(); > /// Einen Speicherblock allokieren. > vaddr_t syscall_mem_allocate(size_t bytes, syscall_arg_t flags, paddr_t* phys); > > +/// Physischen Speicher mappen > +vaddr_t syscall_mem_allocate_physical( > + size_t bytes, paddr_t position, syscall_arg_t flags); > + > /// Einen Speicherblock freigeben > void syscall_mem_free(vaddr_t start, size_t bytes); > > diff --git a/src/kernel2/src/syscall.c b/src/kernel2/src/syscall.c > index 1749c7e..58c82de 100644 > --- a/src/kernel2/src/syscall.c > +++ b/src/kernel2/src/syscall.c > @@ -49,6 +49,8 @@ syscall_t syscalls[SYSCALL_MAX]; > void syscall_init() > { > syscall_register(SYSCALL_MEM_ALLOCATE, &syscall_mem_allocate, 3); > + syscall_register(SYSCALL_MEM_ALLOCATE_PHYSICAL, > + &syscall_mem_allocate_physical, 3); > syscall_register(SYSCALL_MEM_FREE, &syscall_mem_free, 2); > > syscall_register(SYSCALL_PM_GET_PID, (void*) &syscall_pm_get_pid, 0); > diff --git a/src/kernel2/src/syscalls/mem.c b/src/kernel2/src/syscalls/mem.c > index bd41073..91457da 100644 > --- a/src/kernel2/src/syscalls/mem.c > +++ b/src/kernel2/src/syscalls/mem.c > @@ -74,6 +74,39 @@ vaddr_t syscall_mem_allocate(size_t bytes, syscall_arg_t flags, paddr_t* phys) > } > > /** > + * Einen Speicherblock an bekannter physischer Adresse mappen. > + * > + * @param bytes Groesse des Speicherblocks > + * @param position Physische Adresse des Speicherblocks > + * @param flags Unbenutzt > + * > + * @return Virtuelle Adresse des Blocks > + * > + * --- TODO laut Mail von Freaky --- > + * Hm k??nnten wir hier vielleicht noch irgendwas einbauen um sicher zu Sind hier meine oder deine oder gar keine Umlaute kaputt? ;-) > + * gehen, dass sie dass diese Blocks in der physischen Speicherverwaltung > + * reserviert sind? Ok, jo sie _sollten_ in der Memory-Map reserviert > + * sein, aber irgendwie weiss ich nicht so recht ob wir da nicht besser auf > + * nummer sicher gehen sollten... > + * > + * Das andere Problem w??re SMU wenn ich den Treiber versehtentlich mehrmals > + * starte,oder sogar 2 verschiedene Treiber habe, die gerne den selben > + * Speicherbereich h??tten? > + * > + * Aber weit schlimmer k??nnte das ausgehen, wenn der Prozess sich beendet, > + * oder beendet wird. Dann wird der Speicher doch physisch freigegeben? > + * --- Ende des TODO --- > + */ > +vaddr_t syscall_mem_allocate_physical( > + size_t bytes, paddr_t position, syscall_arg_t flags) > +{ > + size_t page_count = NUM_PAGES(PAGE_ALIGN_ROUND_UP(bytes)); > + > + return mmc_automap(&mmc_current_context(), position, page_count, > + USER_MEM_START, USER_MEM_END, MM_FLAGS_USER_DATA); > +} > + > +/** > * Einen Speicherbereich freigeben > * > * @param start Startadresse des Bereichs Schieb rein. -- Antoine Kaufmann <toni@xxxxxxxxxxxxxxxx>
Attachment:
pgpUlvHhlE_R3.pgp
Description: PGP signature