| // 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; |
| using zx; |
| |
| /// 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(resource struct { |
| info InterpreterInfo; |
| }); |
| |
| /// 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(resource struct { |
| info RuntimeInfo; |
| }); |
| |
| /// 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(resource struct { |
| handles vector<fuchsia.process.HandleInfo>:64; |
| }); |
| |
| /// 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(resource struct { |
| names vector<fuchsia.process.NameInfo>:64; |
| }); |
| |
| /// 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(resource struct { |
| argc uint32; |
| environc uint32; |
| data fuchsia.mem.Data; |
| }); |
| }; |
| |
| type RuntimeInfo = resource struct { |
| /// The process being bootstrapped. |
| process zx.handle:PROCESS; |
| |
| /// The initial thread of the process being bootstrapped. |
| initial_thread zx.handle:THREAD; |
| |
| /// REVIEW: What VMAR(s) does the program runtime receive? |
| vmars zx.handle:VMAR; |
| }; |
| |
| /// Flags to modulate the behavior of the interpreter for a process. |
| type InterpreterFlags = strict bits : uint64 { |
| DEBUG = 0x1; |
| TRACE = 0x2; |
| }; |
| |
| /// Information need by the interpreter to initialize a process. |
| type InterpreterInfo = resource struct { |
| /// Flags to modulate the behavior of the interpreter. |
| /// REVIEW: Can this be removed? |
| flags InterpreterFlags; |
| |
| /// The VMAR into which the interpreter should load code. |
| target_vmar zx.handle:VMAR; |
| |
| /// The VMAR into which the interpreter was loaded. |
| interpreter_vmar zx.handle:VMAR; |
| |
| /// The executable to load. |
| executable zx.handle:VMO; |
| |
| /// The shared library loader to use for the process. |
| loader client_end:fuchsia.ldsvc.Loader; |
| }; |