vbox: improve BFE argument handling
This commit is contained in:
parent
2c7c814e19
commit
3d274366ab
|
@ -36,6 +36,29 @@ void operator delete(void * p) {
|
||||||
Genode::env()->heap()->free(p, 0);
|
Genode::env()->heap()->free(p, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
template <int MAX_ARGS>
|
||||||
|
struct Args
|
||||||
|
{
|
||||||
|
int argc = 0;
|
||||||
|
char *argv[MAX_ARGS] = { };
|
||||||
|
|
||||||
|
struct Too_many_arguments { };
|
||||||
|
|
||||||
|
void add(char const *arg)
|
||||||
|
{
|
||||||
|
/* argv[MAX_ARGS - 1] must be unused and set to 0 */
|
||||||
|
if (argc >= MAX_ARGS - 1)
|
||||||
|
throw Too_many_arguments();
|
||||||
|
|
||||||
|
/* XXX yes const-casting hurts but main() needs char** */
|
||||||
|
argv[argc++] = const_cast<char *>(arg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} /* unnamed namespace */
|
||||||
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
/* string conversion function currently does not convert ... */
|
/* string conversion function currently does not convert ... */
|
||||||
|
@ -124,15 +147,14 @@ int nanosleep(const struct timespec *req, struct timespec *rem) {
|
||||||
/* main function of VBox is in Frontends/VBoxBFE/VBoxBFE.cpp */
|
/* main function of VBox is in Frontends/VBoxBFE/VBoxBFE.cpp */
|
||||||
extern "C" DECLEXPORT(int) TrustedMain (int argc, char **argv, char **envp);
|
extern "C" DECLEXPORT(int) TrustedMain (int argc, char **argv, char **envp);
|
||||||
|
|
||||||
int main(int, char **)
|
int main()
|
||||||
{
|
{
|
||||||
static char c_mem[16];
|
static char c_mem[16];
|
||||||
static char c_type[4];
|
static char c_type[4];
|
||||||
static char c_file[128];
|
static char c_file[128];
|
||||||
static bool bOverlay = false;
|
static bool bOverlay = false;
|
||||||
|
|
||||||
int argc = 9;
|
static Args<64> args;
|
||||||
char * argv[argc + 1];
|
|
||||||
|
|
||||||
/* request max available memory */
|
/* request max available memory */
|
||||||
size_t vm_size = Genode::env()->ram_session()->avail();
|
size_t vm_size = Genode::env()->ram_session()->avail();
|
||||||
|
@ -164,51 +186,41 @@ int main(int, char **)
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
argv[0] = (char *)"virtualbox";
|
args.add("virtualbox");
|
||||||
argv[1] = (char *)"-m";
|
args.add("-m");
|
||||||
|
|
||||||
Genode::snprintf(c_mem, sizeof(c_mem), "%u", vm_size / 1024 / 1024);
|
Genode::snprintf(c_mem, sizeof(c_mem), "%u", vm_size / 1024 / 1024);
|
||||||
argv[2] = c_mem;
|
args.add(c_mem);
|
||||||
argv[3] = (char *)"-boot";
|
args.add("-boot");
|
||||||
|
|
||||||
if (!Genode::strcmp(c_type, "iso")) {
|
if (!Genode::strcmp(c_type, "iso")) {
|
||||||
argv[4] = (char *)"d";
|
args.add("d");
|
||||||
argv[5] = (char *)"-cdrom";
|
args.add("-cdrom");
|
||||||
} else
|
} else
|
||||||
if (!Genode::strcmp(c_type, "vdi")) {
|
if (!Genode::strcmp(c_type, "vdi")) {
|
||||||
argv[4] = (char *)"c";
|
args.add("c");
|
||||||
argv[5] = (char *)"-hda";
|
args.add("-hda");
|
||||||
} else {
|
} else {
|
||||||
PERR("invalid configuration - abort");
|
PERR("invalid configuration - abort");
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
argv[6] = c_file;
|
args.add(c_file);
|
||||||
argv[7] = (char *)"-ioapic";
|
args.add("-ioapic");
|
||||||
|
|
||||||
if (9 > argc + 1) {
|
|
||||||
PERR("argc argv misconfiguration - abort");
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bOverlay)
|
if (bOverlay)
|
||||||
argv[8] = (char *)"-overlay";
|
args.add("-overlay");
|
||||||
else {
|
|
||||||
argc -= 1;
|
|
||||||
argv[8] = 0;
|
|
||||||
}
|
|
||||||
argv[9] = 0;
|
|
||||||
|
|
||||||
PINF("start %s image '%s' with %zu MB Guest memory=%zu",
|
PINF("start %s image '%s' with %zu MB Guest memory=%zu",
|
||||||
c_type, c_file, vm_size / 1024 / 1024,
|
c_type, c_file, vm_size / 1024 / 1024,
|
||||||
Genode::env()->ram_session()->avail());
|
Genode::env()->ram_session()->avail());
|
||||||
|
|
||||||
if (RT_FAILURE(RTR3InitExe(argc, (char ***)&argv, 0))) {
|
if (RT_FAILURE(RTR3InitExe(args.argc, (char ***)&args.argv, 0))) {
|
||||||
PERR("Intialization of VBox Runtime failed.");
|
PERR("Intialization of VBox Runtime failed.");
|
||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TrustedMain(argc, argv, NULL);
|
return TrustedMain(args.argc, args.argv, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
} /* EXTERN "C" */
|
} /* EXTERN "C" */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user