Files

85 lines
3.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef UTSM_SCHED_EXT_H
#define UTSM_SCHED_EXT_H
#include <utsm/types.h>
#include <utsm/sched.h>
/*
* SAS-R0-PCQ 调度器扩展接口(ROADMAP Phase 7)。
*
* 冻结 ABI(sched.h)之外的内核本体能力层,仅供 UTSM 内核与 selftest
* 使用,不跨组件边界(DKM 驱动经 kernel_api.sched 使用精简服务表)。
*
* 切换模型(xv6 式栈驱动):
* - 新任务初始栈帧由 utsm_task_create 伪造(7 个 u64):
* sp[0..3]=r15/r14/r13/r12(0), sp[4]=rbx(task slot), sp[5]=rbp(0),
* sp[6]=&utsm_task_trampoline —— switch 的 ret 直接落 trampoline。
* - 抢占:IRQ 帧落在被抢占任务自己的栈上,切换只换 rsp(arch.rsp);
* 恢复时沿原栈 iretq。TCB arch.rip/rflags 仅占位零(resume 全由 rsp 驱动)。
* - 协作:schedule() 入口 pushfq 保存本任务 rflags → cli;恢复点 popfq。
*/
/* 应用 FUCK [sched] 配置(enable 前生效;tick_hz=0 用默认 100) */
void utsm_sched_config(u32 tick_hz, u32 timeslice_ms, u32 demo_ms, int demo_fault);
/* bootstrap 任务绑定:sched_init + cpu_init(0) + 当前 rsp 注册为 RUNNING
* 任务(priority 最低,K_KERNEL|NO_MIGRATE)。不开中断、不碰定时器。
* 返回 bootstrap slot(>=0),负数失败。 */
int utsm_sched_bootstrap_init(void);
/* 创建任务:4 页任务栈(arena kmem_alloc_page)+ 伪造初始栈帧 + 入队。
* process_slot = 0xFFFFFFFF 表示无进程关联(纯内核任务,crypto_context=NULL)。
* 返回 task slot(>=0),负数失败。仅在未启用抢占时(bootstrap 上下文)调用。 */
int utsm_task_create(u32 process_slot, u32 priority, void (*entry)(void *), void *arg);
/* 启用抢占:LAPIC timer 校准配置 → 注册 tick handler → 异常钩子 →
* DRR fault 回调接线 → LVT 解除 mask。tick_hz=0 用配置默认。
* 返回 0 成功;失败时调度器保持协作模式(系统继续正常启动)。 */
int utsm_sched_enable(u32 tick_hz);
/* 静默:cli → 停 LAPIC timer → 异常钩子注销 → DRR 回调解绑 → 杀掉全部
* 非 bootstrap 任务 → sti。dsk_load_and_jump 之前调用,保证 DSK 交接
* 路径与无调度器时逐字节一致。 */
void utsm_sched_quiesce(void);
/* demo 窗口:创建 3 个不同优先级 demo 任务(prio 1/20/40)→ enable →
* bootstrap 忙等 demo_ms 毫秒(被周期抢占,demo 任务交错运行 = 抢占证据)。
* FUCK [sched] demo_ms=0 时为空操作。 */
void utsm_sched_demo_window(void);
/* 协作让出(当前任务重新入队并切换) */
void utsm_sched_yield(void);
/* 睡眠 ms 毫秒(wake_deadline 到期后由 tick 唤醒) */
void utsm_sched_sleep_ms(u32 ms);
/* 任务退出(trampoline 在 entry 返回后自动调用;不返回) */
void utsm_sched_task_exit(void) __attribute__((noreturn));
/* DRR fault 回调:杀掉指定任务(crypto erase + FAULTED→ZOMBIE)。
* 若 fault 任务是当前任务(tick/异常上下文)则立即切换走且不返回。 */
void utsm_sched_fault_task(u32 task_slot);
/* task_kill(ROADMAP Phase7 验收项):crypto erase(key_epoch++)+
* 摘链 + ZOMBIE。对 RUNNING(当前)任务返回 ERR_STATE。 */
int utsm_sched_task_kill(u32 task_slot);
/* 当前运行任务 slot */
u32 utsm_sched_current_slot(void);
/* ---- switch.S 汇编符号 ----
* utsm_sched_switch: 保存 prev 的 callee-saved + arch.rsp,载入 next->arch.rsp
* 恢复并 ret。调用后 volatile 视为全部破坏(C 调用约定保证)。 */
void utsm_sched_switch(utsm_sched_tcb *prev, utsm_sched_tcb *next);
void utsm_task_trampoline(void);
/* trampoline 的 C 入口(rbx 传入 task slot) */
void utsm_task_main(u64 slot);
/* ---- selftest 钩子(内部状态观察,仅 test/ 使用) ---- */
int utsm_sched_selftest_runqueue(void);
int utsm_sched_selftest_blockwake(void);
int utsm_sched_debug_ready_count(u32 cpu_id);
#endif /* UTSM_SCHED_EXT_H */