Commit 230f4dd9 authored by Kevin Wolf's avatar Kevin Wolf

kernel2: Neuer Syscall lio_pipe()

+ kernel2: lio_pipe() in den Userspace exportieren
Signed-off-by: Kevin Wolf's avatarKevin Wolf <kevin@tyndur.org>
parent 3ce55f06
......@@ -112,6 +112,7 @@
#define SYSCALL_LIO_PROBE_SERVICE 101
#define SYSCALL_LIO_DUP 102
#define SYSCALL_LIO_STREAM_ORIGIN 103
#define SYSCALL_LIO_PIPE 104
#define SYSCALL_LIO_SRV_SERVICE_REGISTER 110
#define SYSCALL_LIO_SRV_TREE_SET_RING 111
......
......@@ -211,6 +211,11 @@ int syscall_lio_stat(lio_usp_resource_t* resid, struct lio_stat* sbuf);
void syscall_lio_open(lio_usp_resource_t* resid, int flags,
lio_usp_stream_t* stream_id);
/// Pipe erstellen
int syscall_lio_pipe(lio_usp_stream_t* stream_reader,
lio_usp_stream_t* stream_writer,
bool bidirectional);
/// Stream schließen
int syscall_lio_close(lio_usp_stream_t* stream_id);
......
......@@ -117,6 +117,7 @@ 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_CLOSE, &syscall_lio_close, 1);
syscall_register(SYSCALL_LIO_READ, &syscall_lio_read, 6);
syscall_register(SYSCALL_LIO_WRITE, &syscall_lio_write, 6);
......
......@@ -104,6 +104,31 @@ void syscall_lio_open(lio_usp_resource_t* resid, int flags,
*stream_id = fd->usp_id;
}
/// Pipe erstellen
int syscall_lio_pipe(lio_usp_stream_t* stream_reader,
lio_usp_stream_t* stream_writer,
bool bidirectional)
{
struct lio_stream* rd;
struct lio_stream* wr;
struct lio_usp_stream* fd_rd;
struct lio_usp_stream* fd_wr;
int ret;
ret = lio_pipe(&rd, &wr, bidirectional);
if (ret < 0) {
return ret;
}
fd_rd = lio_usp_add_stream(current_process, rd);
fd_wr = lio_usp_add_stream(current_process, wr);
*stream_reader = fd_rd->usp_id;
*stream_writer = fd_wr->usp_id;
return 0;
}
/// Stream schließen
int syscall_lio_close(lio_usp_stream_t* stream_id)
{
......
......@@ -136,6 +136,19 @@ struct lio_dir_entry {
*/
lio_resource_t lio_resource(const char* path, bool follow_symlink);
/**
* Erstellt eine neue Pipe und gibt Streams auf beide Enden zurück.
*
* @param reader Wird bei Erfolg auf das erste Ende der Pipe gesetzt
* @param writer Wird bei Erfolg auf das zweite Ende der Pipe gesetzt
* @param bidirectional Wenn false, dann kann auf writer nur geschrieben und
* auf reader nur gelesen werden. Wenn true, dann funktioniert auch die andere
* Richtung.
*
* @return 0 bei Erfolg, negativ im Fehlerfall
*/
int lio_pipe(lio_stream_t* reader, lio_stream_t* writer, bool bidirectional);
/**
* Öffnet eine Ressource und gibt die ID des entstandenen Streams zurück.
*
......
......@@ -61,6 +61,43 @@ lio_resource_t lio_resource(const char* path, bool follow_symlink)
return result;
}
/**
* Erstellt eine neue Pipe und gibt Streams auf beide Enden zurück.
*
* @param reader Wird bei Erfolg auf das erste Ende der Pipe gesetzt
* @param writer Wird bei Erfolg auf das zweite Ende der Pipe gesetzt
* @param bidirectional Wenn false, dann kann auf writer nur geschrieben und
* auf reader nur gelesen werden. Wenn true, dann funktioniert auch die andere
* Richtung.
*
* @return 0 bei Erfolg, negativ im Fehlerfall
*/
int lio_pipe(lio_stream_t* reader, lio_stream_t* writer, bool bidirectional)
{
volatile lio_stream_t rd;
volatile lio_stream_t wr;
int result;
asm(
"pushl %4;"
"pushl %3;"
"pushl %2;"
"mov %1, %%eax;"
"int $0x30;"
"add $0xc, %%esp;"
: "=a" (result)
: "i" (SYSCALL_LIO_PIPE), "r" (&rd), "r" (&wr),
"r" ((uint32_t) bidirectional)
: "memory");
if (result == 0) {
*reader = rd;
*writer = wr;
}
return result;
}
/**
* Öffnet eine Ressource und gibt die ID des entstandenen Streams 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