On Sun, Sep 25 18:02, Kevin Wolf wrote: > + libc: LIOv2-Syscalls implementiert (aber noch nicht benutzt) > > Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx> > --- > src/modules/include/syscall.h | 214 ++++++++++++++++ > src/modules/lib/syscalls/lostio.c | 492 +++++++++++++++++++++++++++++++++++++ > 2 files changed, 706 insertions(+), 0 deletions(-) > create mode 100644 src/modules/lib/syscalls/lostio.c > > diff --git a/src/modules/include/syscall.h b/src/modules/include/syscall.h > index 74ef0be..ec56196 100644 > --- a/src/modules/include/syscall.h > +++ b/src/modules/include/syscall.h > @@ -105,4 +105,218 @@ void syscall_timer(uint32_t timer_id, uint32_t usec); > > void syscall_debug_stacktrace(pid_t pid); > > + > +// LIO2 > + > +typedef lio_usp_stream_t lio_stream_t; > +typedef lio_usp_resource_t lio_resource_t; > + > +/* FIXME Duplikat von lio_usp_dir_entry in syscall_structs.h */ > +struct lio_dir_entry { > + lio_usp_resource_t resource; > + char name[LIO_MAX_FNLEN + 1]; > + struct lio_stat stat; > +} __attribute__((packed)); > + > +/** > + * Sucht eine Ressource anhand eines Pfads und gibt ihre ID zur??ck. > + * > + * @param follow_symlink Wenn follow_symlink true ist und der Pfad auf eine > + * symbolische Verkn??pfung zeigt, dann wird die Verkn??fung aufgel??st. Ist > + * follow_symlink false, wird in diesem Fall die Verkn??pfung selbst > + * zur??ckgegeben. > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. Insbesondere: Öhm nein, allgemein eher nicht 0 bei Erfolg ;-) > + * > + * -ENOENT Es wurde keine Ressource mit dem gegebenen Pfad gefunden > + */ > +lio_resource_t lio_resource(const char* path, bool follow_symlink); > + > +/** > + * ??ffnet eine Ressource und gibt die ID des entstandenen Streams zur??ck. > + * > + * @param resource ID der zu ??ffnenden Ressource > + * @param flags Bitmaske aus LIO_*-Flags > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. Insbesondere: Dito > + * > + * -EINVAL Es gibt keine Ressource mit der gegebenen ID > + * -EACCES Die Ressource unterst??tzt ein gesetztes Flag nicht > + */ > +lio_stream_t lio_open(lio_resource_t resource, int flags); > + > +/** > + * Gibt Informationen zu einer Ressource zur??ck. > + * > + * @param resource ID der Ressource > + * @param sbuf Puffer f??r die Informationen > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. Insbesondere: > + * > + * -EINVAL Es gibt keine Ressource mit der gegebenen ID > + */ > +int lio_stat(lio_resource_t resource, struct lio_stat* sbuf); > + > +/** > + * Schlie??t einen Stream. > + * > + * @param s Der zu schlie??ende Stream > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +int lio_close(lio_stream_t s); > + > +/** > + * Liest aus dem Stream ab der aktuellen Position des Dateizeigers und bewegt > + * den Dateizeiger hinter das letzte gelesene Byte. > + * > + * @param s Auszulesender Stream > + * @param bytes Zu lesende Bytes > + * @param buf Zielpuffer, in dem die ausgelesenen Daten abgelegt werden > + * > + * @return Die Anzahl der erfolgreich gelesenen Bytes ("short reads" sind > + * m??glich) oder negativ, falls sofort ein Fehler aufgetreten ist. > + */ > +ssize_t lio_read(lio_stream_t s, size_t bytes, void* buf); > + > +/** > + * Liest aus dem Stream ab der gegebenen Position. > + * > + * @param s Auszulesender Stream > + * @param offset Position, ab der gelesen werden soll, in Bytes vom Dateianfang > + * @param bytes Zu lesende Bytes > + * @param buf Zielpuffer, in dem die ausgelesenen Daten abgelegt werden > + * > + * @return Die Anzahl der erfolgreich gelesenen Bytes ("short reads" sind > + * m??glich) oder negativ, falls sofort ein Fehler aufgetreten ist. > + */ > +ssize_t lio_pread(lio_stream_t s, uint64_t offset, size_t bytes, void* buf); > + > +/** > + * Schreibt in den Stream ab der aktuellen Position des Dateizeigers und bewegt > + * den Dateizeiger hinter das letzte geschriebene Byte. > + * > + * @param s Zu schreibender Stream > + * @param bytes Zu schreibende Bytes > + * @param buf Quellpuffer, dessen Inhalt geschrieben werden soll > + * > + * @return Die Anzahl der erfolgreich gegeschriebenen Bytes ("short writes" > + * sind m??glich) oder negativ, falls sofort ein Fehler aufgetreten ist. > + */ > +ssize_t lio_write(lio_stream_t s, size_t bytes, const void* buf); > + > +/** > + * Schreibt in den Stream ab der gegebenen Position. > + * > + * @param s Zu schreibender Stream > + * @param offset Position, ab der geschrieben werden soll, in Bytes vom > + * Dateianfang > + * @param bytes Zu schreibende Bytes > + * @param buf Quellpuffer, dessen Inhalt geschrieben werden soll > + * > + * @return Die Anzahl der erfolgreich gegeschriebenen Bytes ("short writes" > + * sind m??glich) oder negativ, falls sofort ein Fehler aufgetreten ist. > + */ > +ssize_t lio_pwrite(lio_stream_t s, uint64_t offset, size_t bytes, > + const void* buf); > + > +/** > + * Bewegt den Dateizeiger des Streams und gibt seine aktuelle Position zur??ck > + * > + * @param s Stream, dessen Dateizeiger ver??ndert werden soll > + * @param offset Neue Dateizeigerposition als Offset in Bytes > + * @param whence Gibt an, wozu das Offset relativ ist (LIO_SEEK_*-Konstanten) > + * > + * @return Die neue Position des Dateizeigers in Bytes vom Dateianfang, oder > + * negativ im Fehlerfall. > + */ > +int64_t lio_seek(lio_stream_t s, uint64_t offset, int whence); > + > +/** > + * ??ndert die Dateigr????e der Ressource eines Streams > + * TODO Wieso nimmt das einen Stream und keine Ressource? > + * > + * @param s Zu ??ndernder Stream > + * @param size Neue Dateigr????e in Bytes > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +int lio_truncate(lio_stream_t s, uint64_t size); > + > +/** > + * Liest Eintr??ge einer Verzeichnisressource aus. > + * > + * @param res Auszulesende Verzeichnisressource > + * @param start Index des ersten zur??ckzugebenden Verzeichniseintrags > + * @param num Maximale Anzahl zur??ckzugebender Verzeichniseintr??ge > + * (Puffergr????e) > + * @param buf Array von Verzeichniseintr??gen, die bef??llt werden > + * > + * @return Anzahl der zur??ckgegebenen Verzeichniseintr??ge, oder negativ im > + * Fehlerfall. > + */ > +ssize_t lio_read_dir(lio_resource_t res, size_t start, size_t num, > + struct lio_dir_entry* buf); > + > +/** > + * Erstellt eine neue Datei. > + * > + * @param parent Verzeichnis, das die neue Datei enthalten soll > + * @param name Name der neuen Datei > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +lio_resource_t lio_mkfile(lio_resource_t parent, const char* name); Dito > + > +/** > + * Erstellt ein neues Verzeichnis. > + * > + * @param parent Verzeichnis, das das neue Unterverzeichnis enthalten soll > + * @param name Name des neuen Verzeichnisses > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. Dito > + */ > +lio_resource_t lio_mkdir(lio_resource_t parent, const char* name); > + > +/** > + * Erstellt eine neue symbolische Verkn??pfung > + * > + * @param parent Verzeichnis, das die neue Verkn??ofung enthalten soll > + * @param name Name der neuen Verkn??pfung > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. Und nochmal > + */ > +lio_resource_t lio_mksymlink(lio_resource_t parent, > + const char* name, const char* target); > + > +/* > + * Sofern die Ressource grunds??tzlich auf persistentem Speicher liegt, aber > + * unter Umst??nden bisher nur in einem nichtpersistentem Cache liegt, werden > + * alle ??nderungen, die an diesem Stream durchgef??hrt worden sind, persistent > + * gemacht. > + * > + * @param s Zur??ckzuschreibender Stream > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +int lio_sync(lio_stream_t s); > + > +/* > + * L??scht den Verzeichniseintrag einer Ressource aus ihrem Verzeichnis. Wenn > + * es keine weiteren Verweise (Hardlinks) auf die Ressource mehr gibt, wird sie > + * gel??scht. > + * > + * @param parent Verzeichnis, das die zu l??schende Ressource enth??lt > + * @param name Dateiname der zu l??schenden Ressource > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +int lio_unlink(lio_resource_t parent, const char* name); > + > +/** > + * Schreibt alle ??nderungen im Kernelcache zur??ck. > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +int lio_sync_all(void); > + > #endif > diff --git a/src/modules/lib/syscalls/lostio.c b/src/modules/lib/syscalls/lostio.c > new file mode 100644 > index 0000000..3ea52e1 > --- /dev/null > +++ b/src/modules/lib/syscalls/lostio.c > @@ -0,0 +1,492 @@ > +/* > + * Copyright (c) 2009 The tyndur Project. All rights reserved. > + * > + * This code is derived from software contributed to the tyndur Project > + * by Antoine Kaufmann. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED > + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR > + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR > + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, > + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, > + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; > + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, > + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR > + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF > + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include <syscall.h> > +#include <string.h> > + > +/** > + * Sucht eine Ressource anhand eines Pfads und gibt ihre ID zur??ck. > + * > + * @param follow_symlink Wenn follow_symlink true ist und der Pfad auf eine > + * symbolische Verkn??pfung zeigt, dann wird die Verkn??fung aufgel??st. Ist > + * follow_symlink false, wird in diesem Fall die Verkn??pfung selbst > + * zur??ckgegeben. > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. Insbesondere: Hier ists wohl nochmal das Selbe mit den Kommentaren, also schreibe ich das jetzt hier nicht noch überall hin. > + * > + * -ENOENT Es wurde keine Ressource mit dem gegebenen Pfad gefunden > + */ > +lio_resource_t lio_resource(const char* path, bool follow_symlink) > +{ > + volatile lio_resource_t result; > + size_t len; > + > + len = strlen(path) + 1; > + asm( > + "pushl %4;" > + "pushl %3;" > + "pushl %2;" > + "pushl %1;" > + "mov %0, %%eax;" > + "int $0x30;" > + "add $0x10, %%esp;" > + : : "i" (SYSCALL_LIO_RESOURCE), "r" (path), "r" (len), > + "r" ((uint32_t) follow_symlink), "r" (&result) : "memory"); > + > + return result; > +} > + > +/** > + * ??ffnet eine Ressource und gibt die ID des entstandenen Streams zur??ck. > + * > + * @param resource ID der zu ??ffnenden Ressource > + * @param flags Bitmaske aus LIO_*-Flags > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. Insbesondere: > + * > + * -EINVAL Es gibt keine Ressource mit der gegebenen ID > + * -EACCES Die Ressource unterst??tzt ein gesetztes Flag nicht > + */ > +lio_stream_t lio_open(lio_resource_t resource, int flags) > +{ > + volatile lio_stream_t result; > + > + asm( > + "pushl %3;" > + "pushl %2;" > + "pushl %1;" > + "mov %0, %%eax;" > + "int $0x30;" > + "add $0xc, %%esp;" > + : : "i" (SYSCALL_LIO_OPEN), "r" (&resource), "r" (flags), "r" (&result) > + : "memory"); > + > + return result; > +} > + > +/** > + * Gibt Informationen zu einer Ressource zur??ck. > + * > + * @param resource ID der Ressource > + * @param sbuf Puffer f??r die Informationen > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. Insbesondere: > + * > + * -EINVAL Es gibt keine Ressource mit der gegebenen ID > + */ > +int lio_stat(lio_resource_t resource, struct lio_stat* sbuf) > +{ > + volatile int result; Hm hier ist wohl kein volatile nötig, glaube ich. > + > + asm( > + "pushl %3;" > + "pushl %2;" > + "mov %1, %%eax;" > + "int $0x30;" > + "add $0xc, %%esp;" Hm ist hier 0xc wirklich der richtige Wert, oder müsste das 0x8 sein? > + : "=a" (result) : "i" (SYSCALL_LIO_STAT), "r" (&resource), "r" (sbuf) > + : "memory"); > + > + return result; > +} > + > +/** > + * Schlie??t einen Stream. > + * > + * @param s Der zu schlie??ende Stream > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +int lio_close(lio_stream_t s) > +{ > + int result; > + > + asm( > + "pushl %2;" > + "mov %1, %%eax;" > + "int $0x30;" > + "add $0x4, %%esp;" > + : "=a" (result): "i" (SYSCALL_LIO_CLOSE), "r" (&s) : "memory"); > + > + return result; > +} > + > +static ssize_t read_syscall(lio_stream_t s, uint64_t offset, size_t bytes, > + void* buf, int updatepos) > +{ > + volatile ssize_t result; > + > + asm( > + "pushl %6;" > + "pushl %5;" > + "pushl %4;" > + "pushl %3;" > + "pushl %2;" > + "pushl %1;" > + "mov %0, %%eax;" > + "int $0x30;" > + "add $0x18, %%esp;" > + : : "i" (SYSCALL_LIO_READ), "r" (&s), "r" (&offset), "r" (bytes), > + "r" (buf), "r" (updatepos), "r" (&result) : "memory"); > + > + return result; > +} > + > +/** > + * Liest aus dem Stream ab der aktuellen Position des Dateizeigers und bewegt > + * den Dateizeiger hinter das letzte gelesene Byte. > + * > + * @param s Auszulesender Stream > + * @param bytes Zu lesende Bytes > + * @param buf Zielpuffer, in dem die ausgelesenen Daten abgelegt werden > + * > + * @return Die Anzahl der erfolgreich gelesenen Bytes ("short reads" sind > + * m??glich) oder negativ, falls sofort ein Fehler aufgetreten ist. > + */ > +ssize_t lio_read(lio_stream_t s, size_t bytes, void* buf) > +{ > + return read_syscall(s, 0, bytes, buf, 1); > +} > + > +/** > + * Liest aus dem Stream ab der gegebenen Position. > + * > + * @param s Auszulesender Stream > + * @param offset Position, ab der gelesen werden soll, in Bytes vom Dateianfang > + * @param bytes Zu lesende Bytes > + * @param buf Zielpuffer, in dem die ausgelesenen Daten abgelegt werden > + * > + * @return Die Anzahl der erfolgreich gelesenen Bytes ("short reads" sind > + * m??glich) oder negativ, falls sofort ein Fehler aufgetreten ist. > + */ > +ssize_t lio_pread(lio_stream_t s, uint64_t offset, size_t bytes, void* buf) > +{ > + return read_syscall(s, offset, bytes, buf, 0); > +} > + > +static ssize_t write_syscall(lio_stream_t s, uint64_t offset, size_t bytes, > + const void* buf, int updatepos) > +{ > + volatile ssize_t result; > + > + asm( > + "pushl %6;" > + "pushl %5;" > + "pushl %4;" > + "pushl %3;" > + "pushl %2;" > + "pushl %1;" > + "mov %0, %%eax;" > + "int $0x30;" > + "add $0x18, %%esp;" > + : : "i" (SYSCALL_LIO_WRITE), "r" (&s), "r" (&offset), "r" (bytes), > + "r" (buf), "r" (updatepos), "r" (&result) : "memory"); > + > + return result; > +} > + > +/** > + * Schreibt in den Stream ab der aktuellen Position des Dateizeigers und bewegt > + * den Dateizeiger hinter das letzte geschriebene Byte. > + * > + * @param s Zu schreibender Stream > + * @param bytes Zu schreibende Bytes > + * @param buf Quellpuffer, dessen Inhalt geschrieben werden soll > + * > + * @return Die Anzahl der erfolgreich gegeschriebenen Bytes ("short writes" > + * sind m??glich) oder negativ, falls sofort ein Fehler aufgetreten ist. > + */ > +ssize_t lio_write(lio_stream_t s, size_t bytes, const void* buf) > +{ > + return write_syscall(s, 0, bytes, buf, 1); > +} > + > +/** > + * Schreibt in den Stream ab der gegebenen Position. > + * > + * @param s Zu schreibender Stream > + * @param offset Position, ab der geschrieben werden soll, in Bytes vom > + * Dateianfang > + * @param bytes Zu schreibende Bytes > + * @param buf Quellpuffer, dessen Inhalt geschrieben werden soll > + * > + * @return Die Anzahl der erfolgreich gegeschriebenen Bytes ("short writes" > + * sind m??glich) oder negativ, falls sofort ein Fehler aufgetreten ist. > + */ > +ssize_t lio_pwrite(lio_stream_t s, uint64_t offset, size_t bytes, > + const void* buf) > +{ > + return write_syscall(s, offset, bytes, buf, 0); > +} > + > +/** > + * Bewegt den Dateizeiger des Streams und gibt seine aktuelle Position zur??ck > + * > + * @param s Stream, dessen Dateizeiger ver??ndert werden soll > + * @param offset Neue Dateizeigerposition als Offset in Bytes > + * @param whence Gibt an, wozu das Offset relativ ist (LIO_SEEK_*-Konstanten) > + * > + * @return Die neue Position des Dateizeigers in Bytes vom Dateianfang, oder > + * negativ im Fehlerfall. > + */ > +int64_t lio_seek(lio_stream_t s, uint64_t offset, int whence) > +{ > + volatile int64_t result; > + > + asm( > + "pushl %4;" > + "pushl %3;" > + "pushl %2;" > + "pushl %1;" > + "mov %0, %%eax;" > + "int $0x30;" > + "add $0x10, %%esp;" > + : : "i" (SYSCALL_LIO_SEEK), "r" (&s), "r" (&offset), "r" (whence), > + "r" (&result) : "memory"); > + > + return result; > +} > + > +/** > + * ??ndert die Dateigr????e der Ressource eines Streams > + * TODO Wieso nimmt das einen Stream und keine Ressource? > + * > + * @param s Zu ??ndernder Stream > + * @param size Neue Dateigr????e in Bytes > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +int lio_truncate(lio_stream_t s, uint64_t size) > +{ > + volatile int result; Hier dann wohl auch nicht. > + > + asm( > + "pushl %3;" > + "pushl %2;" > + "mov %1, %%eax;" > + "int $0x30;" > + "add $0x08, %%esp;" > + : "=a" (result) > + : "i" (SYSCALL_LIO_TRUNCATE), "r" (&s), "r" (&size) > + : "memory"); > + > + return result; > +} > + > +/** > + * Liest Eintr??ge einer Verzeichnisressource aus. > + * > + * @param res Auszulesende Verzeichnisressource > + * @param start Index des ersten zur??ckzugebenden Verzeichniseintrags > + * @param num Maximale Anzahl zur??ckzugebender Verzeichniseintr??ge > + * (Puffergr????e) > + * @param buf Array von Verzeichniseintr??gen, die bef??llt werden > + * > + * @return Anzahl der zur??ckgegebenen Verzeichniseintr??ge, oder negativ im > + * Fehlerfall. > + */ > +ssize_t lio_read_dir(lio_resource_t res, size_t start, size_t num, > + struct lio_dir_entry* buf) > +{ > + volatile ssize_t result; > + > + asm( > + "pushl %5;" > + "pushl %4;" > + "pushl %3;" > + "pushl %2;" > + "pushl %1;" > + "mov %0, %%eax;" > + "int $0x30;" > + "add $0x14, %%esp;" > + : : "i" (SYSCALL_LIO_READ_DIR), "r" (&res), "r" (start), "r" (num), > + "r" (buf), "r" (&result) : "memory"); > + > + return result; > + > +} > + > +/** > + * Erstellt eine neue Datei. > + * > + * @param parent Verzeichnis, das die neue Datei enthalten soll > + * @param name Name der neuen Datei > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +lio_resource_t lio_mkfile(lio_resource_t parent, const char* name) > +{ > + volatile lio_resource_t result; > + size_t len; > + > + len = strlen(name) + 1; > + asm( > + "pushl %4;" > + "pushl %3;" > + "pushl %2;" > + "pushl %1;" > + "mov %0, %%eax;" > + "int $0x30;" > + "add $0x10, %%esp;" > + : : "i" (SYSCALL_LIO_MKFILE), "r" (&parent), "r" (name), "r" (len), > + "r" (&result) : "memory"); > + > + return result; > +} > + > +/** > + * Erstellt ein neues Verzeichnis. > + * > + * @param parent Verzeichnis, das das neue Unterverzeichnis enthalten soll > + * @param name Name des neuen Verzeichnisses > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +lio_resource_t lio_mkdir(lio_resource_t parent, const char* name) > +{ > + volatile lio_resource_t result; > + size_t len; > + > + len = strlen(name) + 1; > + asm( > + "pushl %4;" > + "pushl %3;" > + "pushl %2;" > + "pushl %1;" > + "mov %0, %%eax;" > + "int $0x30;" > + "add $0x10, %%esp;" > + : : "i" (SYSCALL_LIO_MKDIR), "r" (&parent), "r" (name), "r" (len), > + "r" (&result) : "memory"); > + > + return result; > +} > + > +/** > + * Erstellt eine neue symbolische Verkn??pfung > + * > + * @param parent Verzeichnis, das die neue Verkn??ofung enthalten soll > + * @param name Name der neuen Verkn??pfung > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +lio_resource_t lio_mksymlink(lio_resource_t parent, > + const char* name, const char* target) > +{ > + volatile lio_resource_t result; > + size_t name_len; > + size_t target_len; > + > + name_len = strlen(name) + 1; > + target_len = strlen(target) + 1; > + asm( > + "pushl %6;" > + "pushl %5;" > + "pushl %4;" > + "pushl %3;" > + "pushl %2;" > + "pushl %1;" > + "mov %0, %%eax;" > + "int $0x30;" > + "add $0x18, %%esp;" > + : : "i" (SYSCALL_LIO_MKSYMLINK), "r" (&parent), "r" (name), "r" (name_len), > + "r" (target), "r" (target_len), "r" (&result) : "memory"); > + > + return result; > +} > + > +/* > + * Sofern die Ressource grunds??tzlich auf persistentem Speicher liegt, aber > + * unter Umst??nden bisher nur in einem nichtpersistentem Cache liegt, werden > + * alle ??nderungen, die an diesem Stream durchgef??hrt worden sind, persistent > + * gemacht. > + * > + * @param s Zur??ckzuschreibender Stream > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +int lio_sync(lio_stream_t s) > +{ > + int result; > + > + asm( > + "pushl %2;" > + "mov %1, %%eax;" > + "int $0x30;" > + "add $0x4, %%esp;" > + : "=a" (result): "i" (SYSCALL_LIO_SYNC), "r" (&s) : "memory"); > + > + return result; > +} > + > +/* > + * L??scht den Verzeichniseintrag einer Ressource aus ihrem Verzeichnis. Wenn > + * es keine weiteren Verweise (Hardlinks) auf die Ressource mehr gibt, wird sie > + * gel??scht. > + * > + * @param parent Verzeichnis, das die zu l??schende Ressource enth??lt > + * @param name Dateiname der zu l??schenden Ressource > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +int lio_unlink(lio_resource_t parent, const char* name) > +{ > + int result; > + size_t name_len; > + > + name_len = strlen(name) + 1; > + asm( > + "pushl %4;" > + "pushl %3;" > + "pushl %2;" > + "mov %1, %%eax;" > + "int $0x30;" > + "add $0xc, %%esp;" > + : "=a" (result) : "i" (SYSCALL_LIO_UNLINK), "r" (&parent), "r" (name), > + "r" (name_len) : "memory"); > + > + return result; > +} > + > +/** > + * Schreibt alle ??nderungen im Kernelcache zur??ck. > + * > + * @return 0 bei Erfolg, negativ im Fehlerfall. > + */ > +int lio_sync_all(void) > +{ > + int result; > + > + asm( > + "pushl $0;" > + "int $0x30;" > + "add $0x4, %%esp;" > + : "=a" (result) : "0" (SYSCALL_LIO_SYNC_ALL)); > + > + return result; > +} > + Mit den Änderungen oben könnte das dann vielleicht korrekt sein. ;-) Acked-by: Antoine Kaufmann <toni@xxxxxxxxxx> -- Antoine Kaufmann <toni@xxxxxxxxxxxxxxxx>
Attachment:
signature.asc
Description: Digital signature