[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