blob: 5415894b65d7397a901ae437c446471e242d36ae [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.process;
using fuchsia.io;
using zx;
struct HandleInfo {
// The handle to use for this argument.
handle handle;
// Process argument identifier, from <zircon/processargs.h>.
uint32 id;
};
struct NameInfo {
// Path at which to install the associated directory.
//
// Must be an absolute path (i.e., start with '/').
string path;
// The associated directory.
fuchsia.io.Directory directory;
};
struct LaunchInfo {
// The executable to run in the process.
handle<vmo> executable;
// The job in which to create the process.
handle<job> job;
// The name to assign to the created process.
string name;
};
struct LaunchResult {
// A status code describing the result of the launch.
zx.status status;
// A string describing the failure.
//
// Non-null when |status| is an error.
string? error_message;
// The process that was launched.
//
// Present when |status| is ZX_OK.
handle<process>? process;
};
struct ProcessStartData {
// The process that was created.
handle<process> process;
// The vmar object that was created when the process was created.
//
// See <https://fuchsia.googlesource.com/zircon/+/master/docs/syscalls/process_create.md>.
handle<vmar> root_vmar;
// The initial thread for the process.
//
// Should be passed to |zx_process_start| when starting the process.
handle<thread> thread;
// The address of the initial entry point in the process.
//
// Should be passed to |zx_process_start| when starting the process.
uint64 entry;
// The stack pointer value for the initial thread of the process.
//
// Should be passed to |zx_process_start| when starting the process.
uint64 sp;
// The bootstrap channel to pass to the process on startup.
//
// Should be passed to |zx_process_start| when starting the process.
handle<channel> bootstrap;
// The base address of the vDSO to pass to the process on startup.
//
// Should be passed to |zx_process_start| when starting the process.
uint64 vdso_base;
// The base load address of the ELF file loaded.
//
// Most often used by debuggers or other tools that inspect the process.
uint64 base;
};
struct CreateWithoutStartingResult {
// A status code describing the result of the launch.
zx.status status;
// A string describing the failure.
//
// Non-null when |status| is an error.
string? error_message;
// Data describing the process that was created.
//
// Non-null when |status| is ZX_OK.
ProcessStartData? data;
};
[Discoverable]
interface Launcher {
// Creates and starts the process described by |info|.
//
// After processing this message, the |Launcher| is reset to its initial
// state and is ready to launch another process.
1: Launch(LaunchInfo info) -> (LaunchResult result);
// Creates the process described by |info| but does not start it.
//
// After processing this message, the |Launcher| is reset to its initial
// state and is ready to launch another process.
//
// The caller is responsible for calling |zx_process_start| using the data
// in |ProcessStartData| to actually start the process.
2: CreateWithoutStarting(LaunchInfo info) -> (CreateWithoutStartingResult result);
// Adds the given arguments to the command-line for the process.
//
// Calling this method multiple times concatenattes the arguments.
10: AddArgs(vector<string> args);
// Adds the given variables to the environment variables for the process.
//
// Calling this method multiple times concatenates the variables.
11: AddEnvirons(vector<string> environ);
// Adds the given names to the namespace for the process.
//
// The paths in the namespace must be non-overlapping. See
// <https://fuchsia.googlesource.com/docs/+/master/the-book/namespaces.md> for details.
//
// Calling this method multiple times concatenates the names.
12: AddNames(vector<NameInfo> names);
// Adds the given handles to the startup handles for the process.
//
// Calling this method multiple times concatenates the handles.
13: AddHandles(vector<HandleInfo> handles);
};