Commit 30e316f7 authored by Kevin Wolf's avatar Kevin Wolf

kernel2: lio_composite_stream()

+ kernel2: Neuer Syscall zum Zusammenbasteln von Stream aus zwei
  verschiedenen Streams (Eingabe und Ausgabe)
Signed-off-by: Kevin Wolf's avatarKevin Wolf <kevin@tyndur.org>
parent 7ca8b93d
......@@ -114,6 +114,7 @@
#define SYSCALL_LIO_STREAM_ORIGIN 103
#define SYSCALL_LIO_PIPE 104
#define SYSCALL_LIO_IOCTL 105
#define SYSCALL_LIO_COMPOSITE_STREAM 106
#define SYSCALL_LIO_SRV_SERVICE_REGISTER 110
#define SYSCALL_LIO_SRV_TREE_SET_RING 111
......
......@@ -79,6 +79,16 @@ int lio_pipe(struct lio_stream **reader, struct lio_stream **writer,
*/
struct lio_stream* lio_open(struct lio_resource* res, int flags);
/**
* Setzt einen neuen Stream zusammen, der die Eingaberessource von read und
* die Ausgaberessource von write benutzt.
*
* @return Zusammengesetzter Stream oder NULL, wenn der Stream nicht
* erfolgreich erstellt werden konnte.
*/
struct lio_stream* lio_composite_stream(struct lio_stream* read,
struct lio_stream* write);
/**
* Liest aus einem Stream aus.
*
......
......@@ -216,6 +216,11 @@ int syscall_lio_pipe(lio_usp_stream_t* stream_reader,
lio_usp_stream_t* stream_writer,
bool bidirectional);
/// Ein- und Ausgabestream zusammensetzen
int syscall_lio_composite_stream(lio_usp_stream_t* read,
lio_usp_stream_t* write,
lio_usp_stream_t* result);
/// Stream schließen
int syscall_lio_close(lio_usp_stream_t* stream_id);
......
......@@ -391,6 +391,37 @@ fail:
return NULL;
}
/**
* Setzt einen neuen Stream zusammen, der die Eingaberessource von read und
* die Ausgaberessource von write benutzt.
*
* @return Zusammengesetzter Stream oder NULL, wenn der Stream nicht
* erfolgreich erstellt werden konnte.
*/
struct lio_stream* lio_composite_stream(struct lio_stream* read,
struct lio_stream* write)
{
struct lio_stream* s;
s = calloc(1, sizeof(*s));
if (s == NULL) {
return NULL;
}
*s = (struct lio_stream) {
.res = read->res_read,
.res_read = read->res_read,
.res_write = write->res_write,
.flags = LIO_READ | LIO_WRITE,
.eof = false,
};
s->res_read->ref++;
s->res_write->ref++;
return s;
}
/**
* Liest aus einem Stream aus.
*
......
......@@ -118,6 +118,8 @@ void syscall_init()
syscall_register(SYSCALL_LIO_RESOURCE, &syscall_lio_resource, 4);
syscall_register(SYSCALL_LIO_OPEN, &syscall_lio_open, 3);
syscall_register(SYSCALL_LIO_PIPE, &syscall_lio_pipe, 3);
syscall_register(SYSCALL_LIO_COMPOSITE_STREAM,
&syscall_lio_composite_stream, 3);
syscall_register(SYSCALL_LIO_CLOSE, &syscall_lio_close, 1);
syscall_register(SYSCALL_LIO_READ, &syscall_lio_read, 6);
syscall_register(SYSCALL_LIO_WRITE, &syscall_lio_write, 6);
......
......@@ -129,6 +129,37 @@ int syscall_lio_pipe(lio_usp_stream_t* stream_reader,
return 0;
}
/// Ein- und Ausgabestream zusammensetzen
int syscall_lio_composite_stream(lio_usp_stream_t* read,
lio_usp_stream_t* write,
lio_usp_stream_t* result)
{
struct lio_usp_stream* rd;
struct lio_usp_stream* wr;
struct lio_stream* composite;
struct lio_usp_stream* fd_composite;
// TODO: is_userspace
rd = lio_usp_get_stream(current_process, *read);
if (rd == NULL) {
return -EBADF;
}
wr = lio_usp_get_stream(current_process, *write);
if (wr == NULL) {
return -EBADF;
}
composite = lio_composite_stream(rd->stream, wr->stream);
if (composite == NULL) {
return -ENOMEM;
}
fd_composite = lio_usp_add_stream(current_process, composite);
*result = fd_composite->usp_id;
return 0;
}
/// Stream schließen
int syscall_lio_close(lio_usp_stream_t* stream_id)
{
......
......@@ -162,6 +162,14 @@ int lio_pipe(lio_stream_t* reader, lio_stream_t* writer, bool bidirectional);
*/
lio_stream_t lio_open(lio_resource_t resource, int flags);
/**
* Setzt einen neuen Stream zusammen, der die Eingaberessource von read und
* die Ausgaberessource von write benutzt.
*
* @return 0 bei Erfolg, negativ im Fehlerfall
*/
lio_stream_t lio_composite_stream(lio_stream_t read, lio_stream_t write);
/**
* Erstellt eine zusätzliche Stream-ID für einen Stream.
*
......
......@@ -126,6 +126,36 @@ lio_stream_t lio_open(lio_resource_t resource, int flags)
return result;
}
/**
* Setzt einen neuen Stream zusammen, der die Eingaberessource von read und
* die Ausgaberessource von write benutzt.
*
* @return 0 bei Erfolg, negativ im Fehlerfall
*/
lio_stream_t lio_composite_stream(lio_stream_t read, lio_stream_t write)
{
volatile lio_stream_t composite;
int result;
asm(
"pushl %4;"
"pushl %3;"
"pushl %2;"
"mov %1, %%eax;"
"int $0x30;"
"add $0xc, %%esp;"
: "=a" (result)
: "i" (SYSCALL_LIO_COMPOSITE_STREAM), "r" (&read), "r" (&write),
"r" (&composite)
: "memory");
if (result < 0) {
return result;
}
return composite;
}
/**
* Gibt Informationen zu einer Ressource zurück.
*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment