Ir para o conteúdo
PS5PCEM
ParcialFirmware e HLE

Fibras e threads de nível de usuário

No Windows, cada fibra da libSceFiber é uma fibra real do Windows, então uma troca preserva os registradores convidados e a pilha convidada. Threads de nível de usuário começam pelo mesmo caminho de pthread.

Notas do repositório até 10 de outubro de 2026

Por que uma fibra não pode ser uma operação vazia

O código convidado roda como código de máquina nativo. Uma troca de fibra tem de retomar os registradores exatos e a pilha exata, com quadros de pilha do anfitrião e do convidado misturados nessa pilha. Devolver sucesso de sceFiberSwitch sem trocar deixaria o título continuar na pilha errada e corromper os dois lados.

O PS5PCEM apoia cada fibra convidada inicializada com uma fibra do Windows. sceFiberRun, sceFiberSwitch e sceFiberReturnToThread usam esse mecanismo. A thread que chamou sceFiberRun é a fibra raiz. O registro público SceFiber de 128 bytes guarda as assinaturas de ABI, o estado, o argumento de entrada, o nome e o intervalo de contexto fornecido por quem chamou.

De quem é a pilha

O título fornece um buffer de contexto, e esse buffer fica registrado no objeto de ABI. O Windows é dono da pilha real. Usar o buffer do título como pilha nativa do Windows pularia a página de guarda e a contabilidade de unwind que o sistema operacional exige. O contexto mínimo que o registro de firmware espera ainda é verificado, junto com o alinhamento e as assinaturas de início e de fim.

sceFiberGetSelf, a finalização, as verificações de posse entre threads e o reinício em tempo de execução estão implementados. O backend existe no alvo de execução nativa Windows x86-64. Outros anfitriões podem compilar o resto do emulador, e este caminho de troca não está disponível neles.

Threads de nível de usuário

A inicialização e a finalização da libSceUlt têm sucesso para que o sistema de tarefas de um título possa começar. Tempos de execução, filas de espera, pools de dados de fila, mutexes, semáforos e filas guardam estado no lado do anfitrião, indexado pelos objetos que o título alocou. Os próprios itens de trabalho começam pelo caminho de pthread já existente. Consultas de tamanho da área de trabalho devolvem os tamanhos alinhados que essas criações esperam.

Filas de eventos de borda de usuário do kernel compartilham a mesma espera consciente de sequência da sincronização pthread. O filtro -13 do VideoOut e o filtro -14 de gráficos seguem essa fila e preservam o identificador e os dados de usuário de cada registro. ULT é cola de escalonamento. Não acrescenta um segundo emulador de CPU.

O que está implementado

  • Fibras do Windows para sceFiberRun, sceFiberSwitch e sceFiberReturnToThread.
  • Assinaturas de ABI, verificações de posse e uma pilha pertencente ao anfitrião, com página de guarda.
  • Inicialização do ULT, filas, mutexes, semáforos e itens de trabalho apoiados em pthread.
  • Filas de eventos de borda de usuário compartilhadas com a conclusão do VideoOut e dos gráficos.

O que ainda falta

  • A troca de fibra existe no Windows x86-64. Outros sistemas operacionais anfitriões não executam código convidado nativamente.
  • Uma fibra não é uma thread de hardware escalonada de forma preemptiva.
  • O ULT não implementa um interpretador separado para os corpos dos workers.

Mecanismos relacionados

O que estas páginas descrevem

O texto segue as notas de arquitetura e os relatórios de outubro de 2026 no repositório do PS5PCEM. Um teste pontual que passa não é uma nova taxa de quadros nem uma nova conclusão de jogo.

Todas as tecnologias