8.6 KiB
Agenda - VM-Owned Builtins Protocol and System Services
Problema
O modelo de syscall atual atende bem chamadas host-backed e nao deve ser quebrado.
Ao mesmo tempo, falta um protocolo formal para chamadas e dados VM-owned entre guest e VM para casos como:
- input;
- random;
- window system integrado ao SO;
- builtins com leitura/escrita e lifecycle.
Hoje ja existe base para bytes VM-owned (decisao 003), mas ainda nao existe contrato equivalente para valores builtin, recursos tipados e handles VM-owned.
Dor
- sem protocolo, cada dominio tende a criar shape ad-hoc de stack e retorno;
- surfaces de linguagem (FE) e backend podem divergir do runtime real;
- faltam regras canonicas para criar/ler/escrever/destruir recursos VM-owned;
- verifier e toolchain ficam sem alvo estavel para validacao de chamadas VM-owned;
- discussoes de input/random/window tendem a virar agendas grandes e misturadas.
Alvo da Discussao
Definir um protocolo canonico de comunicacao guest <-> VM para operacoes VM-owned, preservando:
syscallcomo fronteira host-backed existente;- compatibilidade com o ABI atual de slots;
- determinismo por frame.
Achados Consolidados Desta Rodada
- manter separacao por camadas:
- decisao
003comoByte Transfer Core(data plane low-level); - protocolo VM-owned desta agenda como
Service Control Planepara builtins e servicos.
- decisao
- o guest nao recebe handle host-owned e nao acessa memoria host-owned diretamente.
- servicos VM-owned podem internamente delegar para host/sistema operacional, sem expor essa borda para userland.
syscallhost-backed atual permanece valido; esta agenda nao redesenha essa fronteira.- input e random passam a ser tratados como servicos VM-owned, com retorno de builtins/handles VM-owned.
- para input, a direcao preferida e leitura de snapshot congelado por frame com semantica de registrador (sem copia grande de dados por chamada).
Consolidado Parcial - HOSTCALL com kind (host | vm)
- proposta candidata:
- manter
HOSTCALL <index>no artefato pre-load; - substituir
SYSCpor uma tabela unificada de bindings (nome provisorio:CALLS/BIND); - cada entrada declara
kind,module,name,version,arg_slots,ret_slots.
- manter
- regra de resolucao:
- a decisao
hostvsvmocorre somente no loader; - loader resolve e patcha deterministamente:
kind=host->SYSCALL <id>;kind=vm->INTRINSIC <id>.
- a decisao
- o runtime nunca executa branch dinamico
host|vmem tempo de execucao. kindsepara semanticas sem colapsar contratos:hostcontinua host-backed (capability/politicas do dominio host);vmsegue contrato VM-owned (builtins/recursos/estado interno da VM).
- ponto tecnico critico identificado:
- o executor atual de intrinsic usa
fn(&[Value])e nao recebe contexto da VM/runtime; - servicos VM-owned stateful (input/map/window/random com recurso) exigem evolucao dessa interface.
- o executor atual de intrinsic usa
- regra de ABI para VM-owned:
- operacoes devem mapear 1:1 para diretivas versionadas;
arg_slotseret_slotsfixos por operacao/versao (sem shape dinamico).
- extensoes previstas (nao bloqueadoras do recorte inicial):
- lifecycle de handles VM-owned com anti-stale/generation;
- politica explicita de roots/GC para recursos vivos.
- ponto ainda pendente de fechamento nesta agenda:
- semantica de determinismo para random e, futuramente, fila/eventos de window system.
O Que Precisa Ser Definido
-
Plano de chamada VM-owned. Definir:
- ponto de entrada no bytecode para VM-owned:
INTRINSICcom registry formal; ouHOSTCALL + kind=vmcom patch de loader paraINTRINSIC;
- namespace de IDs;
- versionamento por operacao;
- metadados canonicos (
arg_slots,ret_slots, layout, custo, efeito, determinismo).
- ponto de entrada no bytecode para VM-owned:
-
Plano de dados builtin. Definir:
- como builtins sao representados em slots;
- quando um builtin e inline e quando vira handle;
- regras de leitura/escrita/atualizacao em stack e heap;
- regras de compatibilidade de layout entre versoes.
-
Modelo de recursos VM-owned. Definir:
- formato de handle (incluindo estrategia anti-stale);
- ownership;
- lifecycle (
create,read,update,destroy); - invariantes de validade.
- politica de singleton vs instancia alocada para builtins de snapshot (ex.:
Pad,Touch).
-
Perfil de input no protocolo. Fechar:
- como
Input.getPad()eInput.getTouch()mapeiam para o protocolo VM-owned; - se a API retorna ref singleton (
Input.getPad() -> PadRef) ou recebe destino (Input.getPad(dst_ref)), e por que; - relacao com as syscalls atuais de input no periodo de transicao (se houver);
- garantia de snapshot congelado por frame para leitura deterministica.
- como
-
Perfil de random no protocolo. Fechar:
- API minima (
RndG.pcg32(seed) -> RngRefe/ougetRandom), incluindo superficie inicial oficial; - PRNG deterministico e regras de seed;
- politicas de reproducibilidade.
- API minima (
-
Perfil de window system no protocolo. Fechar contrato minimo para:
- criacao e destruicao de janelas;
- leitura/escrita de estado de janela;
- fila de eventos;
- relacao com foco e input.
-
Modelo de fault/status. Definir:
- fronteira entre erro estrutural (
Trap) e resultado operacional (status); - como erros de handle/recurso/estado invalido sao expostos.
- fronteira entre erro estrutural (
-
Integracao com verifier e toolchain. Definir:
- validacoes estaticas minimas;
- regras de emissao no backend;
- requisitos para decode/disasm/assembler.
-
Politica de CAP, certificacao e telemetria para VM-owned. Definir:
- se VM-owned usa ou nao capability;
- como custo entra em certificacao;
- o que e observavel em telemetria.
-
Migração. Definir:
- como coexistem superficies antigas e novas;
- quando e como descontinuar chamadas legadas.
Shape Inicial de Referencia (Nao Decisao)
Este shape e apenas base de discussao para fechar bytecode/ABI, sem efeito normativo ate decisao formal:
vm_service_call(service_id, op_id, args...) -> (status, ret...)
Exemplos candidatos:
Input.getPad() -> (status, pad_ref)Input.getTouch() -> (status, touch_ref)RndG.pcg32(seed) -> (status, rng_ref)
Onde pad_ref, touch_ref e rng_ref sao builtins/handles VM-owned.
Sistemas Candidatos Para Cobertura
Esta agenda deve discutir explicitamente, alem de input/random/window:
- frame clock/tick index para consultas deterministicas de tempo de jogo;
- event queue VM-owned para UI/app;
- text input para apps com janelas;
- notificacoes de sistema para app.
Open Questions de Arquitetura
- Qual e o entrypoint de pre-load para VM-owned:
HOSTCALL + kind=vmem tabela unificada, ou tabela dedicada? - Como representar retorno de builtin em slots:
HeapRef<TBuiltin>, handle numerico tipado, ou forma hibrida? - Como evoluir a interface de intrinsic para receber contexto VM/runtime (alem de
args) sem quebrar o que ja existe? - Input usa singleton por dispositivo/frame ou instancia nova por chamada?
- Quais campos de
PadeTouchsao estritamente read-only para guest, e como bloquear escrita indevida? - Qual politica de lifetime dos snapshots de input entre frames (substituicao, aliasing, invalidacao)?
- Random sera estritamente deterministico por seed explicitamente passado, ou existe modo sem seed (host entropy)?
- Qual taxonomia canonica de
statuscompartilhada entre servicos VM-owned (input/random/window)? - Como o verifier valida compatibilidade entre assinatura esperada pelo FE e metadados reais do service registry?
- Como garantir compatibilidade binaria quando um builtin evoluir layout entre versoes?
- Como tratar custo/certificacao para VM-owned sem reintroduzir modelo de capability desnecessario?
- Window system exigira fila/event loop VM-owned; como evitar acoplamento indevido com scheduler do runtime?
- Qual estrategia de migracao para remover chamadas legadas de input sem quebrar toolchain antiga?
Dependencias
../virtual-machine/ISA_CORE.md../specs/16-host-abi-and-syscalls.md../specs/16a-syscall-policies.md../decisions/003-vm-owned-byte-transfer-protocol.md../decisions/004-host-fault-taxonomy.md
Fora de Escopo
- redesenhar o modelo de syscall host-backed;
- UX final do window manager;
- detalhes de compositor/renderizacao de UI;
- protocolo de rede/distribuicao remota.
Critério de Saida Desta Agenda
Pode virar PR quando houver decisao escrita sobre:
- contrato canonico do protocolo VM-owned (call plane + data plane);
- shape e lifecycle de builtins/handles;
- perfil minimo fechado para input, random e window system;
- regras de fault/status e verificacao;
- plano de migracao sem quebra da fronteira de syscall existente.