Allocate pids on bsp core

This commit is contained in:
Jan Schär 2022-05-04 14:03:06 +02:00
parent 323a9cc088
commit ede347c10b
7 changed files with 91 additions and 61 deletions

View File

@ -705,6 +705,10 @@ errors proc_mgmt PROC_MGMT_ERR_ {
failure DOMAIN_NOT_RUNNING "Domain is not currently running", failure DOMAIN_NOT_RUNNING "Domain is not currently running",
failure ALREADY_SPANNED "Domain has already been spanned to the given core", failure ALREADY_SPANNED "Domain has already been spanned to the given core",
failure KILL "Failed to kill requested domain", failure KILL "Failed to kill requested domain",
failure NAME_BUF_TOO_SMALL "Failed to return name because the buffer is too small",
failure PID_BUF_TOO_SMALL "Failed to return pids because the buffer is too small",
failure NAME_TOO_LONG "Process name is too long",
failure ALLOCATE_PID "Failed to allocate pid",
}; };
// errors from ELF library // errors from ELF library
@ -1383,7 +1387,6 @@ errors aos AOS_ERR_ {
failure RPC_ARG_TOO_BIG "RPC argument is too big", failure RPC_ARG_TOO_BIG "RPC argument is too big",
failure RPC_RET_TOO_BIG "RPC return value is too big", failure RPC_RET_TOO_BIG "RPC return value is too big",
failure RPC_UNKNOWN_MSG_TYPE "RPC with unknown message type", failure RPC_UNKNOWN_MSG_TYPE "RPC with unknown message type",
failure RPC_PROCESS_UNKNOWN_PID "Requested process name for an unknown PID",
success RPC_ASYNC_REPLY "The RPC call will complete asynchronously", success RPC_ASYNC_REPLY "The RPC call will complete asynchronously",
}; };

View File

@ -32,6 +32,7 @@ enum rpc_mtype {
RPC_MTYPE_PROCESS_SPAWN, RPC_MTYPE_PROCESS_SPAWN,
RPC_MTYPE_PROCESS_GET_NAME, RPC_MTYPE_PROCESS_GET_NAME,
RPC_MTYPE_PROCESS_GET_ALL_PIDS, RPC_MTYPE_PROCESS_GET_ALL_PIDS,
RPC_MTYPE_ALLOCATE_PID,
RPC_MTYPE_GET_BOOTINFO, RPC_MTYPE_GET_BOOTINFO,
RPC_MTYPE_COUNT // How many message types exist RPC_MTYPE_COUNT // How many message types exist
}; };

View File

@ -28,9 +28,6 @@ struct spawninfo {
domainid_t pid; // < unique id for this domain domainid_t pid; // < unique id for this domain
// Information about the binary
char * binary_name; // Name of the binary
// TODO(M2): Add fields you need to store state // TODO(M2): Add fields you need to store state
// when spawning a new dispatcher, // when spawning a new dispatcher,
// e.g. references to the child's // e.g. references to the child's
@ -63,7 +60,9 @@ struct spawninfo {
struct aos_rpc_server rpc_server; struct aos_rpc_server rpc_server;
}; };
struct spawninfo *spawn_get_process_list(void); errval_t allocate_pid (const char *process_name, domainid_t *pid);
errval_t get_process_name (domainid_t pid, char *process_name, size_t *len);
errval_t get_all_pids (domainid_t *pids, size_t *count);
// parse a commandline into arguments // parse a commandline into arguments
void spawn_parse_cmd(char *cmdline, int *argc, char **argv); void spawn_parse_cmd(char *cmdline, int *argc, char **argv);

View File

@ -20,10 +20,12 @@ extern coreid_t my_core_id;
void void
grading_setup_bsp_init(int argc, char **argv) { grading_setup_bsp_init(int argc, char **argv) {
debug_printf("grading_setup_bsp_init(argc=%d)\n", argc);
} }
void void
grading_setup_app_init(struct bootinfo * bi) { grading_setup_app_init(struct bootinfo * bi) {
debug_printf("grading_setup_app_init(bi=%p)\n", bi);
} }
void void

View File

@ -289,28 +289,8 @@ static errval_t handle_rpc_process_get_name(
grading_rpc_handler_process_get_name(pid); grading_rpc_handler_process_get_name(pid);
// search for the pid *ret_size = RPC_SHARED_SIZE;
char *name = NULL; return get_process_name(pid, rpc->shared_mem, ret_size);
for (struct spawninfo *si = spawn_get_process_list(); si != NULL; si = si->next) {
if (si->pid == pid) {
name = si->binary_name;
break;
}
}
if (name == NULL) {
return AOS_ERR_RPC_PROCESS_UNKNOWN_PID;
}
size_t name_len = strlen(name) + 1;
if(name_len > RPC_SHARED_SIZE) {
return AOS_ERR_RPC_RET_TOO_BIG;
}
memcpy(rpc->shared_mem, name, name_len);
*ret_size = name_len;
return SYS_ERR_OK;
} }
static errval_t handle_rpc_process_get_all_pids( static errval_t handle_rpc_process_get_all_pids(
@ -320,23 +300,28 @@ static errval_t handle_rpc_process_get_all_pids(
) { ) {
grading_rpc_handler_process_get_all_pids(); grading_rpc_handler_process_get_all_pids();
// size in bytes
size_t list_size = 0;
domainid_t *buf = rpc->shared_mem; domainid_t *buf = rpc->shared_mem;
size_t list_size = RPC_SHARED_SIZE / sizeof(domainid_t);
// get all PIDs that fit into the given space errval_t err = get_all_pids(buf, &list_size);
for (struct spawninfo *si = spawn_get_process_list(); si != NULL; si = si->next) { if (err_is_fail(err)) return err;
if (list_size + sizeof(domainid_t) > RPC_SHARED_SIZE) { *ret_size = list_size * sizeof(domainid_t);
return AOS_ERR_RPC_RET_TOO_BIG; return SYS_ERR_OK;
} }
*buf = si->pid; static errval_t handle_rpc_allocate_pid(
++buf; struct generic_rpc_server *rpc,
list_size += sizeof(domainid_t); struct capref arg_cap, size_t arg_size, uintptr_t arg0, uintptr_t arg1,
struct capref *ret_cap, size_t *ret_size, uintptr_t *ret0, uintptr_t *ret1
) {
const char* process_name = rpc->shared_mem;
if (arg_size == 0 || process_name[arg_size - 1] != '\0') {
return ERR_INVALID_ARGS;
} }
*ret_size = list_size; domainid_t pid;
errval_t err = allocate_pid(process_name, &pid);
if (err_is_fail(err)) return err;
*ret0 = pid;
return SYS_ERR_OK; return SYS_ERR_OK;
} }
@ -435,5 +420,6 @@ rpc_handler_t rpc_handlers[RPC_MTYPE_COUNT] = {
[RPC_MTYPE_PROCESS_SPAWN] = handle_rpc_process_spawn, [RPC_MTYPE_PROCESS_SPAWN] = handle_rpc_process_spawn,
[RPC_MTYPE_PROCESS_GET_NAME] = handle_rpc_process_get_name, [RPC_MTYPE_PROCESS_GET_NAME] = handle_rpc_process_get_name,
[RPC_MTYPE_PROCESS_GET_ALL_PIDS] = handle_rpc_process_get_all_pids, [RPC_MTYPE_PROCESS_GET_ALL_PIDS] = handle_rpc_process_get_all_pids,
[RPC_MTYPE_ALLOCATE_PID] = handle_rpc_allocate_pid,
[RPC_MTYPE_GET_BOOTINFO] = handle_rpc_get_bootinfo, [RPC_MTYPE_GET_BOOTINFO] = handle_rpc_get_bootinfo,
}; };

View File

@ -8,6 +8,7 @@
#include <aos/dispatcher_arch.h> #include <aos/dispatcher_arch.h>
#include <aos/lmp_chan.h> #include <aos/lmp_chan.h>
#include <aos/aos_rpc.h> #include <aos/aos_rpc.h>
#include <aos/aos_urpc.h>
#include <barrelfish_kpi/paging_arm_v8.h> #include <barrelfish_kpi/paging_arm_v8.h>
#include <barrelfish_kpi/domain_params.h> #include <barrelfish_kpi/domain_params.h>
#include <spawn/multiboot.h> #include <spawn/multiboot.h>
@ -15,13 +16,46 @@
extern struct bootinfo *bi; extern struct bootinfo *bi;
extern coreid_t my_core_id; extern coreid_t my_core_id;
extern struct aos_urpc urpc_to_bsp;
struct spawninfo *spawn_process_list = NULL; static struct spawninfo *spawn_process_list = NULL;
// All PIDs are allocated on the BSP core.
// TODO: handle "freeing" of PIDs in case we learn how to detect stopped child processes // TODO: handle "freeing" of PIDs in case we learn how to detect stopped child processes
domainid_t spawn_last_pid = 1; static domainid_t spawn_next_pid = 1;
#define MAX_PID 1023
static char *process_names[1024];
struct spawninfo *spawn_get_process_list(void) { errval_t allocate_pid (const char *process_name, domainid_t *pid) {
return spawn_process_list; if (spawn_next_pid > MAX_PID) return SPAWN_ERR_OUT_OF_PIDS;
char *name_copy = strdup(process_name);
if (name_copy == NULL) return LIB_ERR_MALLOC_FAIL;
process_names[spawn_next_pid] = name_copy;
debug_printf("Allocated pid %"PRIuDOMAINID" for process \"%s\".\n", spawn_next_pid, process_name);
*pid = spawn_next_pid;
spawn_next_pid++;
return SYS_ERR_OK;
}
errval_t get_process_name (domainid_t pid, char *process_name, size_t *len) {
if (pid == 0 || pid >= spawn_next_pid) return PROC_MGMT_ERR_DOMAIN_TABLE_FIND;
size_t actual_len = strlen(process_names[pid]) + 1;
if (actual_len > *len) return PROC_MGMT_ERR_NAME_BUF_TOO_SMALL;
*len = actual_len;
memcpy(process_name, process_names[pid], actual_len);
return SYS_ERR_OK;
}
errval_t get_all_pids (domainid_t *pids, size_t *count) {
if (*count < spawn_next_pid - 1) return PROC_MGMT_ERR_PID_BUF_TOO_SMALL;
*count = spawn_next_pid - 1;
for (size_t i = 0; i < *count; i++) {
pids[i] = i + 1;
}
return SYS_ERR_OK;
} }
/** /**
@ -331,24 +365,35 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si,
domainid_t *pid) { domainid_t *pid) {
errval_t err; errval_t err;
if(spawn_last_pid == MAX_DOMAINID) {
return SPAWN_ERR_OUT_OF_PIDS;
}
if(argc == 0) { if(argc == 0) {
debug_printf("[spawn_load_argv] argc == 0 (no arguments)\n"); debug_printf("[spawn_load_argv] argc == 0 (no arguments)\n");
return SPAWN_ERR_FIND_MODULE; return SPAWN_ERR_FIND_MODULE;
} }
assert(argc < MAX_CMDLINE_ARGS);
// Allocate pid
if (my_core_id == 0) {
err = allocate_pid(argv[0], pid);
if (err_is_fail(err)) return err_push(err, PROC_MGMT_ERR_ALLOCATE_PID);
} else {
size_t name_len = strlen(argv[0]) + 1;
if (name_len > RPC_SHARED_SIZE) return PROC_MGMT_ERR_NAME_TOO_LONG;
memcpy(urpc_to_bsp.shared_mem, argv[0], name_len);
uintptr_t pid_ret;
err = do_aos_urpc(
&urpc_to_bsp, RPC_MTYPE_ALLOCATE_PID,
NULL_CAP, name_len, 0, 0,
NULL, NULL, &pid_ret, NULL
);
if (err_is_fail(err)) return err_push(err, PROC_MGMT_ERR_ALLOCATE_PID);
*pid = pid_ret;
}
si->pid = *pid;
// - Initialize the spawn_info struct // - Initialize the spawn_info struct
// TODO // TODO
// copy name to spawninfo struct // copy name to spawninfo struct
size_t binary_name_len = strlen(argv[0]) + 1;
si->binary_name = malloc(binary_name_len);
if (si->binary_name == NULL) {
return LIB_ERR_MALLOC_FAIL;
}
memcpy(si->binary_name, argv[0], binary_name_len);
// - Get the module from the multiboot image // - Get the module from the multiboot image
// and map it (take a look at multiboot.c) // and map it (take a look at multiboot.c)
@ -359,8 +404,6 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si,
// } // }
// printf("\n"); // printf("\n");
assert(argc > 0);
assert(argc < MAX_CMDLINE_ARGS);
struct mem_region *module = multiboot_find_module(bi, argv[0]); struct mem_region *module = multiboot_find_module(bi, argv[0]);
if (module == NULL) return SPAWN_ERR_FIND_MODULE; if (module == NULL) return SPAWN_ERR_FIND_MODULE;
size_t elf_bytes = module->mrmod_size; size_t elf_bytes = module->mrmod_size;
@ -640,10 +683,6 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si,
); );
if (err_is_fail(err)) return err_push(err, SPAWN_ERR_RUN); if (err_is_fail(err)) return err_push(err, SPAWN_ERR_RUN);
// Get a unique PID
si->pid = ++spawn_last_pid;
*pid = si->pid;
// add to process list // add to process list
si->next = spawn_process_list; si->next = spawn_process_list;
spawn_process_list = si; spawn_process_list = si;

View File

@ -38,7 +38,7 @@ coreid_t my_core_id;
struct platform_info platform_info; struct platform_info platform_info;
// only valid on app core // only valid on app core
static struct aos_urpc urpc_to_bsp; struct aos_urpc urpc_to_bsp;
// only valid on app core // only valid on app core
static struct aos_urpc_server urpc_to_app_server; static struct aos_urpc_server urpc_to_app_server;