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

[tyndur-devel] [PATCH v2 5/8] kernel2: LIO-Read-Syscall nimmt jetzt Flags



+ kernel2: Der LIO-Read-Syscall nimmt jetzt Flags. Bit 0 zeigt wie
  gehabt an, dass der Dateizeiger benutzt werden soll. Bit 1 ist
  für blockierendes Lesen vorgesehen, wird aber noch ignoriert.

+ libc: lio_readf() erlaubt es, dem Syscall direkt Flags zu übergeben.
  Das LIO_REQ_BLOCKING-Flag wird bei lio_(p)read gesetzt und wirkt sich
  aus sobald der Kernel es berücksichtigt.

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/include/syscall_structs.h     | 11 +++++++++++
 src/kernel2/src/syscalls/lostio.c |  4 ++--
 src/modules/include/syscall.h     | 18 ++++++++++++++++++
 src/modules/lib/syscalls/lostio.c | 10 +++++-----
 4 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/src/include/syscall_structs.h b/src/include/syscall_structs.h
index e43295b..0d5892c 100644
--- a/src/include/syscall_structs.h
+++ b/src/include/syscall_structs.h
@@ -133,6 +133,17 @@ enum lio_flags {
     LIO_SYMLINK     = 512,
 };
 
+/**
+ * Gibt Optionen zu einem einzelnen Request an.
+ */
+enum lio_req_flags {
+    /** Der Dateizeiger wird nach der Operation bewegt, Offset ignoriert */
+    LIO_REQ_FILEPOS         = 1,
+
+    /** Die Operation blockiert, wenn sie sonst nichts tun würde */
+    LIO_REQ_BLOCKING        = 2,
+};
+
 
 /**
  * Gibt an, realtiv zu welcher Position in der Datei das lio_seek-Offset
diff --git a/src/kernel2/src/syscalls/lostio.c b/src/kernel2/src/syscalls/lostio.c
index 314ca98..b060626 100644
--- a/src/kernel2/src/syscalls/lostio.c
+++ b/src/kernel2/src/syscalls/lostio.c
@@ -151,7 +151,7 @@ int syscall_lio_pass_fd(lio_usp_stream_t* stream_id, pid_t pid)
 
 /// Aus Stream lesen
 void syscall_lio_read(lio_usp_stream_t* stream_id, uint64_t* offset,
-    size_t bytes, void* buffer, int updatepos, ssize_t* result)
+    size_t bytes, void* buffer, int flags, ssize_t* result)
 {
     struct lio_usp_stream* fd;
 
@@ -162,7 +162,7 @@ void syscall_lio_read(lio_usp_stream_t* stream_id, uint64_t* offset,
         return;
     }
 
-    if (updatepos) {
+    if (flags & LIO_REQ_FILEPOS) {
         *result = lio_read(fd->stream, bytes, buffer);
     } else {
         *result = lio_pread(fd->stream, *offset, bytes, buffer);
diff --git a/src/modules/include/syscall.h b/src/modules/include/syscall.h
index 33cd98e..1528b12 100644
--- a/src/modules/include/syscall.h
+++ b/src/modules/include/syscall.h
@@ -184,6 +184,24 @@ int lio_close(lio_stream_t s);
 lio_stream_t lio_pass_fd(lio_stream_t s, pid_t pid);
 
 /**
+ * Liest aus dem Stream.
+ *
+ * @param s Auszulesender Stream
+ * @param offset Position, ab der gelesen werden soll, in Bytes vom
+ * Dateianfang. Wenn in @flags LIO_REQ_FILEPOS gesetzt ist, wird die Angabe
+ * ignoriert und stattdessen von der aktuellen Position des Dateizeigers
+ * gelesen.
+ * @param bytes Zu lesende Bytes
+ * @param buf Zielpuffer, in dem die ausgelesenen Daten abgelegt werden
+ * @param flags Bitmaske von lio_req_flags
+ *
+ * @return Die Anzahl der erfolgreich gelesenen Bytes ("short reads" sind
+ * möglich) oder negativ, falls sofort ein Fehler aufgetreten ist.
+ */
+ssize_t lio_readf(lio_stream_t s, uint64_t offset, size_t bytes,
+    void* buf, int flags);
+
+/**
  * Liest aus dem Stream ab der aktuellen Position des Dateizeigers und bewegt
  * den Dateizeiger hinter das letzte gelesene Byte.
  *
diff --git a/src/modules/lib/syscalls/lostio.c b/src/modules/lib/syscalls/lostio.c
index 6cf8dc1..c702084 100644
--- a/src/modules/lib/syscalls/lostio.c
+++ b/src/modules/lib/syscalls/lostio.c
@@ -169,8 +169,8 @@ lio_stream_t lio_pass_fd(lio_stream_t s, pid_t pid)
     }
 }
 
-static ssize_t read_syscall(lio_stream_t s, uint64_t offset, size_t bytes,
-    void* buf, int updatepos)
+ssize_t lio_readf(lio_stream_t s, uint64_t offset, size_t bytes,
+    void* buf, int flags)
 {
     volatile ssize_t result;
 
@@ -185,7 +185,7 @@ static ssize_t read_syscall(lio_stream_t s, uint64_t offset, size_t bytes,
         "int $0x30;"
         "add $0x18, %%esp;"
     : : "i" (SYSCALL_LIO_READ), "r" (&s), "r" (&offset), "r" (bytes),
-        "r" (buf), "r" (updatepos), "r" (&result) : "memory");
+        "r" (buf), "r" (flags), "r" (&result) : "memory");
 
     return result;
 }
@@ -203,7 +203,7 @@ static ssize_t read_syscall(lio_stream_t s, uint64_t offset, size_t bytes,
  */
 ssize_t lio_read(lio_stream_t s, size_t bytes, void* buf)
 {
-    return read_syscall(s, 0, bytes, buf, 1);
+    return lio_readf(s, 0, bytes, buf, LIO_REQ_FILEPOS | LIO_REQ_BLOCKING);
 }
 
 /**
@@ -219,7 +219,7 @@ ssize_t lio_read(lio_stream_t s, size_t bytes, void* buf)
  */
 ssize_t lio_pread(lio_stream_t s, uint64_t offset, size_t bytes, void* buf)
 {
-    return read_syscall(s, offset, bytes, buf, 0);
+    return lio_readf(s, offset, bytes, buf, LIO_REQ_BLOCKING);
 }
 
 static ssize_t write_syscall(lio_stream_t s, uint64_t offset, size_t bytes,
-- 
2.1.4