// Copyright 2016 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.
#ifndef ZIRCON_PROCESSARGS_H_
#define ZIRCON_PROCESSARGS_H_
#include <zircon/compiler.h>
#include <zircon/types.h>
#include <stdint.h>
__BEGIN_CDECLS
// This is a protocol for passing state to a new process
// via a message in a channel.
#define ZX_PROCARGS_PROTOCOL ((uint32_t)0x4150585du) // MXPA
#define ZX_PROCARGS_VERSION ((uint32_t)0x0001000u)
typedef struct zx_proc_args zx_proc_args_t;
struct zx_proc_args {
// Protocol and version identifiers to allow for
// different process start message protocols and
// versioning of the same.
uint32_t protocol;
uint32_t version;
// Offset from start of message to handle info
// array, which contains one uint32_t per handle
// passed along with the message.
uint32_t handle_info_off;
// Offset from start of message to arguments and
// count of arguments. Arguments are provided as
// a set of null-terminated utf-8 strings, one
// after the other.
uint32_t args_off;
uint32_t args_num;
// Offset from start of message to environment strings and count of
// them. Environment entries are provided as a set of null-terminated
// UTF-8 strings, one after the other. Canonically each string has
// the form "NAME=VALUE", but nothing enforces this.
uint32_t environ_off;
uint32_t environ_num;
// Offset from start of message to name strings and count of them.
// These strings are packed similar to the argument strings,
// but are referenced by PA_NS_* handle table entries and used
// to set up namespaces.
//
// Specifically: In a handle table entry with PA_HND_TYPE(info)
// of PA_NS_*, PA_HND_ARG(info) is an index into this name table.
uint32_t names_off;
uint32_t names_num;
};
// Handle Info entries associate a type and optional
// argument with each handle included in the process
// arguments message.
#define PA_HND(type, arg) (((type)&0xFF)| (((arg)&0xFFFF)<<16))
#define PA_HND_TYPE(n) ((n) & 0xFF)
#define PA_HND_SUBTYPE(n) (((n) >> 8) & 0xFF)
#define PA_HND_ARG(n) (((n) >> 16) & 0xFFFF)
// --- Core Runtime Handles ---
// Used by libc init (or equivalent) and dynamic loader
// Handle to our own process.
#define PA_PROC_SELF 0x01u
// Handle to the initial thread of our own process.
#define PA_THREAD_SELF 0x02u
// Handle to a Job object which can be used to make child processes. The
// Job can be the same as the one used to create this process or it can
// be different.
#define PA_JOB_DEFAULT 0x03u
// Handle to the root of our address space
#define PA_VMAR_ROOT 0x04u
// Handle to the VMAR used to load the initial program image.
#define PA_VMAR_LOADED 0x05u
// --- Loader Service and VMO Handles ---
// Used by libc init (or equivalent) and dynamic loader
// Service for loading shared libraries.
// See |fuchsia.ldsvc.Loader| for the interface definition.
#define PA_LDSVC_LOADER 0x10u
// Handle to the VMO containing the ELF image of the system vDSO. This
// handle is duplicable, transferable, readable, and executable, but not
// writable. The contents of the VM object should be treated like any
// other general-purpose ELF file image of type ET_DYN. A process only
// needs this handle so that it can map the vDSO into new processes it
// might create or propagate it on to its children so they can do so.
// Each process's own vDSO was mapped in by its creator before the
// process started, its address passed as an argument to entry point.
#define PA_VMO_VDSO 0x11u
// Handle to the VMO used to map the initial thread's stack. This
// handle usually has all rights. The protocol between process creator
// and new process is that this entire VM object has been mapped in
// before the process starts. The initial value for the SP register in
// the new process is the high edge of the mapping (assuming stacks grow
// downwards), adjusted down as required by the particular machine's C
// calling convention for function entry. Thus the new process can
// compute its exact stack bounds by subtracting the size reported by
// this VMO from the (adjusted back up) initial SP value.
#define PA_VMO_STACK 0x13u
// VM object handle for the main executable file
#define PA_VMO_EXECUTABLE 0x14u
// Used by kernel and userboot during startup
#define PA_VMO_BOOTDATA 0x1Au
// Used by kernel and userboot during startup
#define PA_VMO_BOOTFS 0x1Bu
// Used by the kernel to export debug information as a file in bootfs. When
// devmgr starts, it looks for handles of this type, and adds them as files in
// /boot/kernel/<vmo-name>.
#define PA_VMO_KERNEL_FILE 0x1Cu
// --- Namespace Handles ---
// A handle which will handle OPEN requests relative
// to a particular path which is specified by the
// nametable entry referred to by the "arg" field
#define PA_NS_DIR 0x20u
// --- FDIO Handles ---
// Used by libfdio for passing fdtable, fsroot, etc
// Handle types the fdio library uses
#define PA_FDIO_REMOTE 0x32u
#define PA_FDIO_LOGGER 0x35u
#define PA_FDIO_SOCKET 0x36u
// Server endpoint for handling connection to appmgr services.
#define PA_DIRECTORY_REQUEST 0x3Bu
// Used by devmgr and devhosts
#define PA_RESOURCE 0x3Fu
// --- Various ---
// Handle types for one-off use and prototyping
#define PA_USER0 0xF0u
#define PA_USER1 0xF1u
#define PA_USER2 0xF2u
__END_CDECLS
#endif // ZIRCON_PROCESSARGS_H_