blob: d0cb50825cc1d155217ce20c01d820afa8b7b442 [file] [log] [blame]
// Copyright 2019 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.init;
using fuchsia.ldsvc;
using fuchsia.mem;
using fuchsia.process;
/// The protocol used to initialize processes.
protocol Bootstrap {
/// Provide the interpreter (in the sense of PT_INTERP) with the capabilities and information it
/// needs to load code.
///
/// This method must be called at most once, and must come before all other method calls if it
/// is sent at all.
InitializeInterpreter(InterpreterInfo info);
/// Provide the program with the capabilities and information it needs for runtime support.
///
/// This method must be called exactly once. It must proceed all other messages except the
/// optional call to `InitializeInterpreter`.
InitializeRuntime(RuntimeInfo info);
/// Add the given handles to set of startup handles for the process.
///
/// Must be called after `InitializeInterpreter` and `InitializeRuntime`, and before
/// `Start`. Can be called multiple times.
AddHandles(vector<fuchsia.process.HandleInfo>:64 handles);
/// Add the given names to the namespace of the new process.
///
/// Must be called after `InitializeInterpreter` and `InitializeRuntime`, and before
/// `Start`. Can be called multiple times.
AddNames(vector<fuchsia.process.NameInfo>:64 names);
/// Start the process.
///
/// This must be called last, and exactly once, after initialization and after all handles and
/// names have been added.
///
/// * argc: The number of arguments in `argv`.
/// * environc: The number of variables in the `environ`.
///
/// The command line arguments and environment variables for the process.
///
/// Each byte sequence in `data` is terminated by a single 0x00 byte. The
/// first `argc` byte sequences in the payload are the command line
/// arguments. The next `environc` byte sequences are the environment
/// variables.
Start(uint32 argc, uint32 environc, fuchsia.mem.Data data);
};
struct RuntimeInfo {
/// The process being bootstrapped.
zx.handle:PROCESS process;
/// The initial thread of the process being bootstrapped.
zx.handle:THREAD initial_thread;
/// REVIEW: What VMAR(s) does the program runtime receive?
zx.handle:VMAR vmars;
};
/// Flags to modulate the behavior of the interpreter for a process.
bits InterpreterFlags : uint64 {
DEBUG = 0x1;
TRACE = 0x2;
};
/// Information need by the interpreter to initialize a process.
struct InterpreterInfo {
/// Flags to modulate the behavior of the interpreter.
/// REVIEW: Can this be removed?
InterpreterFlags flags;
/// The VMAR into which the interpreter should load code.
zx.handle:VMAR target_vmar;
/// The VMAR into which the interpreter was loaded.
zx.handle:VMAR interpreter_vmar;
/// The executable to load.
zx.handle:VMO executable;
/// The shared library loader to use for the process.
fuchsia.ldsvc.Loader loader;
};