Skip to content

Commit

Permalink
modified auth and mount
Browse files Browse the repository at this point in the history
Signed-off-by: Jens Nyberg <jens.nyberg@gmail.com>
  • Loading branch information
jezze committed Jun 21, 2016
1 parent c974807 commit 0f7f61f
Show file tree
Hide file tree
Showing 9 changed files with 74 additions and 58 deletions.
2 changes: 1 addition & 1 deletion include/kernel.h
@@ -1,7 +1,7 @@
#include <kernel/resource.h>
#include <kernel/binary.h>
#include <kernel/service.h>
#include <kernel/task.h>
#include <kernel/container.h>
#include <kernel/task.h>
#include <kernel/abi.h>
#include <kernel/kernel.h>
2 changes: 1 addition & 1 deletion src/abi/call.h
Expand Up @@ -31,7 +31,7 @@ unsigned int call_create(unsigned int descriptor, unsigned int count, char *name
unsigned int call_destroy(unsigned int descriptor, unsigned int count, char *name);
unsigned int call_despawn(void);
unsigned int call_load(unsigned int descriptor);
unsigned int call_mount(unsigned int mount, unsigned int pdescriptor, unsigned int cdescriptor);
unsigned int call_mount(unsigned int pdescriptor, unsigned int cdescriptor);
unsigned int call_open(unsigned int descriptor);
unsigned int call_read(unsigned int descriptor, void *buffer, unsigned int count);
unsigned int call_seek(unsigned int descriptor, unsigned int offset);
Expand Down
72 changes: 38 additions & 34 deletions src/kernel/abi.c
Expand Up @@ -2,13 +2,20 @@
#include "resource.h"
#include "binary.h"
#include "service.h"
#include "task.h"
#include "container.h"
#include "task.h"

#define CALLS 16

static unsigned int (*calls[CALLS])(struct container *container, struct task *task, void *stack);

static struct container_server *getserver(struct container *container, unsigned int server)
{

return &container->servers[server & (CONTAINER_SERVERS - 1)];

}

static struct container_mount *getmount(struct container *container, unsigned int mount)
{

Expand All @@ -32,11 +39,10 @@ static unsigned int walk(struct container *container, struct task *task, void *s
unsigned int offset;
unsigned int count;

if (!pdescriptor->backend || !pdescriptor->protocol)
if (!pdescriptor->server)
return 0;

descriptor->backend = pdescriptor->backend;
descriptor->protocol = pdescriptor->protocol;
descriptor->server = pdescriptor->server;
descriptor->state.id = pdescriptor->state.id;

if (!args->count)
Expand All @@ -55,11 +61,10 @@ static unsigned int walk(struct container *container, struct task *task, void *s

struct container_mount *mount = &container->mounts[i];

if (descriptor->backend == mount->child.backend && descriptor->protocol == mount->child.protocol && descriptor->state.id == mount->child.id)
if (descriptor->server == mount->child.server && descriptor->state.id == mount->child.id)
{

descriptor->backend = mount->parent.backend;
descriptor->protocol = mount->parent.protocol;
descriptor->server = mount->parent.server;
descriptor->state.id = mount->parent.id;

break;
Expand All @@ -68,7 +73,7 @@ static unsigned int walk(struct container *container, struct task *task, void *s

}

if (!descriptor->protocol->parent(descriptor->backend, &descriptor->state))
if (!descriptor->server->protocol->parent(descriptor->server->backend, &descriptor->state))
return 0;

}
Expand All @@ -78,19 +83,18 @@ static unsigned int walk(struct container *container, struct task *task, void *s

unsigned int i;

if (!descriptor->protocol->child(descriptor->backend, &descriptor->state, count, args->path + offset))
if (!descriptor->server->protocol->child(descriptor->server->backend, &descriptor->state, count, args->path + offset))
return 0;

for (i = 0; i < CONTAINER_MOUNTS; i++)
{

struct container_mount *mount = &container->mounts[i];

if (descriptor->backend == mount->parent.backend && descriptor->protocol == mount->parent.protocol && descriptor->state.id == mount->parent.id)
if (descriptor->server == mount->parent.server && descriptor->state.id == mount->parent.id)
{

descriptor->backend = mount->child.backend;
descriptor->protocol = mount->child.protocol;
descriptor->server = mount->child.server;
descriptor->state.id = mount->child.id;

break;
Expand All @@ -116,7 +120,7 @@ static unsigned int create(struct container *container, struct task *task, void
if (!args->count || !args->name)
return 0;

return descriptor->protocol->create(descriptor->backend, &descriptor->state, args->count, args->name);
return descriptor->server->protocol->create(descriptor->server->backend, &descriptor->state, args->count, args->name);

}

Expand All @@ -129,7 +133,7 @@ static unsigned int destroy(struct container *container, struct task *task, void
if (!args->count || !args->name)
return 0;

return descriptor->protocol->destroy(descriptor->backend, &descriptor->state, args->count, args->name);
return descriptor->server->protocol->destroy(descriptor->server->backend, &descriptor->state, args->count, args->name);

}

Expand All @@ -139,7 +143,7 @@ static unsigned int open(struct container *container, struct task *task, void *s
struct {void *caller; unsigned int descriptor;} *args = stack;
struct task_descriptor *descriptor = getdescriptor(task, args->descriptor);

return descriptor->protocol->open(descriptor->backend, &descriptor->state);
return descriptor->server->protocol->open(descriptor->server->backend, &descriptor->state);

}

Expand All @@ -149,7 +153,7 @@ static unsigned int close(struct container *container, struct task *task, void *
struct {void *caller; unsigned int descriptor;} *args = stack;
struct task_descriptor *descriptor = getdescriptor(task, args->descriptor);

return descriptor->protocol->close(descriptor->backend, &descriptor->state);
return descriptor->server->protocol->close(descriptor->server->backend, &descriptor->state);

}

Expand All @@ -162,7 +166,7 @@ static unsigned int read(struct container *container, struct task *task, void *s
if (!args->buffer || !args->count)
return 0;

return descriptor->protocol->read(descriptor->backend, &descriptor->state, args->count, args->buffer);
return descriptor->server->protocol->read(descriptor->server->backend, &descriptor->state, args->count, args->buffer);

}

Expand All @@ -175,48 +179,48 @@ static unsigned int write(struct container *container, struct task *task, void *
if (!args->buffer || !args->count)
return 0;

return descriptor->protocol->write(descriptor->backend, &descriptor->state, args->count, args->buffer);
return descriptor->server->protocol->write(descriptor->server->backend, &descriptor->state, args->count, args->buffer);

}

static unsigned int auth(struct container *container, struct task *task, void *stack)
{

struct {void *caller; unsigned int descriptor; unsigned int backend;} *args = stack;
struct container_server *server = getserver(container, container->nservers + 1);
struct task_descriptor *descriptor = getdescriptor(task, args->descriptor);

descriptor->backend = service_findbackend(args->backend);
server->backend = service_findbackend(args->backend);

if (!descriptor->backend)
if (!server->backend)
return 0;

descriptor->protocol = service_findprotocol(descriptor->backend);
server->protocol = service_findprotocol(server->backend);

if (!descriptor->protocol)
if (!server->protocol)
return 0;

descriptor->state.id = descriptor->protocol->root(descriptor->backend);
descriptor->server = server;
descriptor->state.id = descriptor->server->protocol->root(descriptor->server->backend);

return 1;
return ++container->nservers;

}

static unsigned int mount(struct container *container, struct task *task, void *stack)
{

struct {void *caller; unsigned int mount; unsigned int pdescriptor; unsigned int cdescriptor;} *args = stack;
struct container_mount *mount = getmount(container, args->mount);
struct {void *caller; unsigned int pdescriptor; unsigned int cdescriptor;} *args = stack;
struct container_mount *mount = getmount(container, container->nmounts + 1);
struct task_descriptor *pdescriptor = getdescriptor(task, args->pdescriptor);
struct task_descriptor *cdescriptor = getdescriptor(task, args->cdescriptor);

mount->parent.backend = pdescriptor->backend;
mount->parent.protocol = pdescriptor->protocol;
mount->parent.server = pdescriptor->server;
mount->parent.id = pdescriptor->state.id;
mount->child.backend = cdescriptor->backend;
mount->child.protocol = cdescriptor->protocol;
mount->child.server = cdescriptor->server;
mount->child.id = cdescriptor->state.id;

return 1;
return ++container->nmounts;

}

Expand All @@ -229,7 +233,7 @@ static unsigned int load(struct container *container, struct task *task, void *s
void (*module_init)(void);
void (*module_register)(void);

if (!descriptor->protocol->map(descriptor->backend, &descriptor->state, &descriptor->node))
if (!descriptor->server->protocol->map(descriptor->server->backend, &descriptor->state, &descriptor->node))
return 0;

format = binary_findformat(&descriptor->node);
Expand Down Expand Up @@ -262,7 +266,7 @@ static unsigned int unload(struct container *container, struct task *task, void
struct binary_format *format;
void (*module_unregister)(void);

if (!descriptor->protocol->map(descriptor->backend, &descriptor->state, &descriptor->node))
if (!descriptor->server->protocol->map(descriptor->server->backend, &descriptor->state, &descriptor->node))
return 0;

format = binary_findformat(&descriptor->node);
Expand All @@ -285,7 +289,7 @@ static unsigned int seek(struct container *container, struct task *task, void *s
struct {void *caller; unsigned int descriptor; unsigned int offset;} *args = stack;
struct task_descriptor *descriptor = getdescriptor(task, args->descriptor);

return descriptor->protocol->seek(descriptor->backend, &descriptor->state, args->offset);
return descriptor->server->protocol->seek(descriptor->server->backend, &descriptor->state, args->offset);

}

Expand Down
1 change: 0 additions & 1 deletion src/kernel/container.c
Expand Up @@ -2,7 +2,6 @@
#include "resource.h"
#include "binary.h"
#include "service.h"
#include "task.h"
#include "container.h"

void container_init(struct container *container)
Expand Down
16 changes: 14 additions & 2 deletions src/kernel/container.h
@@ -1,19 +1,31 @@
#define CONTAINER_SERVERS 32
#define CONTAINER_MOUNTS 32

struct container_server
{

struct service_backend *backend;
struct service_protocol *protocol;

};

struct container_mount
{

struct resource resource;
struct {struct service_backend *backend; struct service_protocol *protocol; unsigned int id;} parent;
struct {struct service_backend *backend; struct service_protocol *protocol; unsigned int id;} child;
struct {struct container_server *server; unsigned int id;} parent;
struct {struct container_server *server; unsigned int id;} child;

};

struct container
{

struct resource resource;
struct container_server servers[CONTAINER_SERVERS];
unsigned int nservers;
struct container_mount mounts[CONTAINER_MOUNTS];
unsigned int nmounts;

};

Expand Down
33 changes: 17 additions & 16 deletions src/kernel/kernel.c
Expand Up @@ -2,15 +2,14 @@
#include "resource.h"
#include "binary.h"
#include "service.h"
#include "task.h"
#include "container.h"
#include "task.h"
#include "kernel.h"

static void copydescriptor(struct task_descriptor *tdescriptor, struct task_descriptor *sdescriptor)
{

tdescriptor->backend = (sdescriptor) ? sdescriptor->backend : 0;
tdescriptor->protocol = (sdescriptor) ? sdescriptor->protocol : 0;
tdescriptor->server = (sdescriptor) ? sdescriptor->server : 0;
tdescriptor->state.id = (sdescriptor) ? sdescriptor->state.id : 0;

}
Expand All @@ -37,7 +36,7 @@ unsigned int kernel_setupbinary(struct task *task, unsigned int sp)

struct task_descriptor *descriptor = &task->descriptors[0x00];

if (!descriptor->protocol->map(descriptor->backend, &descriptor->state, &descriptor->node))
if (!descriptor->server->protocol->map(descriptor->server->backend, &descriptor->state, &descriptor->node))
return 0;

task->format = binary_findformat(&descriptor->node);
Expand All @@ -54,25 +53,27 @@ unsigned int kernel_setupbinary(struct task *task, unsigned int sp)
void kernel_setupramdisk(struct container *container, struct task *task, struct service_backend *backend)
{

struct container_server *server = &container->servers[0x00];
struct container_mount *mount = &container->mounts[0x00];
struct task_descriptor *init = &task->descriptors[0x08];
struct task_descriptor *root = &task->descriptors[0x09];

mount->parent.backend = backend;
mount->parent.protocol = service_findprotocol(backend);
mount->parent.id = mount->parent.protocol->root(backend);
mount->child.backend = mount->parent.backend;
mount->child.protocol = mount->parent.protocol;
mount->child.id = mount->parent.id;
root->backend = mount->parent.backend;
root->protocol = mount->parent.protocol;
server->backend = backend;
server->protocol = service_findprotocol(backend);
mount->parent.server = server;
mount->parent.id = server->protocol->root(backend);
mount->child.server = server;
mount->child.id = server->protocol->root(backend);
root->server = mount->parent.server;
root->state.id = mount->parent.id;
init->backend = mount->parent.backend;
init->protocol = mount->parent.protocol;
init->server = mount->parent.server;
init->state.id = mount->parent.id;

init->protocol->child(init->backend, &init->state, 4, "bin/");
init->protocol->child(init->backend, &init->state, 4, "init");
init->server->protocol->child(init->server->backend, &init->state, 4, "bin/");
init->server->protocol->child(init->server->backend, &init->state, 4, "init");

container->nservers++;
container->nmounts++;

}

Expand Down
1 change: 1 addition & 0 deletions src/kernel/task.c
Expand Up @@ -2,6 +2,7 @@
#include "resource.h"
#include "binary.h"
#include "service.h"
#include "container.h"
#include "task.h"

static struct list active;
Expand Down
3 changes: 1 addition & 2 deletions src/kernel/task.h
Expand Up @@ -27,8 +27,7 @@ struct task_descriptor

struct resource resource;
struct binary_node node;
struct service_backend *backend;
struct service_protocol *protocol;
struct container_server *server;
struct service_state state;

};
Expand Down
2 changes: 1 addition & 1 deletion src/utils/initfs.c
Expand Up @@ -9,7 +9,7 @@ void main(void)
return;

call_auth(CALL_L1, 2000);
call_mount(4, CALL_L0, CALL_L1);
call_mount(CALL_L0, CALL_L1);

}

0 comments on commit 0f7f61f

Please sign in to comment.