FUCKYOU
This commit is contained in:
@@ -173,8 +173,8 @@ typedef long long du_i64;
|
||||
|
||||
#define DU_RADIUS_NONE 0u
|
||||
#define DU_RADIUS_SM 4u /* 小按钮、标签 */
|
||||
#define DU_RADIUS_MD 8u /* 卡片、输入框 */
|
||||
#define DU_RADIUS_LG 12u /* 大卡片、面板 */
|
||||
#define DU_RADIUS_MD 0u /* 卡片、输入框(性能优化:改为直角) */
|
||||
#define DU_RADIUS_LG 0u /* 大卡片、面板(性能优化:改为直角) */
|
||||
#define DU_RADIUS_XL 16u /* 模态框 */
|
||||
#define DU_RADIUS_FULL 9999u /* 完全圆角(药丸形) */
|
||||
|
||||
@@ -722,9 +722,9 @@ static inline du_u32 du_theme_accent(du_theme t) {
|
||||
/* --- 强调色:霓虹青 (Neon Cyan) --- */
|
||||
#define DP_KATE_ACCENT 0xFF00E5FFu /* --accent: #00e5ff */
|
||||
#define DP_KATE_ACCENT_DIM 0x2E00E5FFu /* --accent-dim: rgba(0,229,255,0.18) */
|
||||
#define DP_KATE_ACCENT_DIM_SOLID 0xFF1A3A4Au /* 不透明近似 */
|
||||
#define DP_KATE_ACCENT_DIM_SOLID 0xFF2A4A5Au /* 不透明近似(提升亮度改善对比度) */
|
||||
#define DP_KATE_PANEL_BORDER 0x5900E5FFu /* --panel-border: rgba(0,229,255,0.35) */
|
||||
#define DP_KATE_PANEL_BORDER_SOLID 0xFF005A6Au /* 不透明近似 */
|
||||
#define DP_KATE_PANEL_BORDER_SOLID 0xFF2A6070u /* 不透明近似(提升亮度) */
|
||||
|
||||
/* --- 辅助色:霓虹绿 (Neon Green) --- */
|
||||
#define DP_KATE_ACCENT2 0xFF39FF14u /* --accent2: #39ff14 */
|
||||
@@ -781,28 +781,12 @@ static inline du_u32 du_theme_accent(du_theme t) {
|
||||
* Winux-Kate 特效函数
|
||||
* =================================================================== */
|
||||
|
||||
/* 绘制扫描线纹理( repeating-linear-gradient 0deg, 3px 周期)
|
||||
* 在指定矩形区域内叠加半透明青色水平细线 */
|
||||
/* 绘制扫描线纹理(已禁用以提升性能)
|
||||
* 原效果:在指定矩形区域内叠加半透明青色水平细线 */
|
||||
static inline void du_kate_scanlines(du_context *ctx, du_i64 x, du_i64 y,
|
||||
du_i64 w, du_i64 h) {
|
||||
for (du_i64 ry = 0; ry < h; ry++) {
|
||||
du_i64 yy = y + ry;
|
||||
if (yy < 0 || (du_u64)yy >= ctx->height) continue; /* 每 3 像素一条线 */
|
||||
du_u32 *line = (du_u32 *)((du_u8 *)ctx->fb + (du_u64)yy * ctx->pitch);
|
||||
for (du_i64 rx = 0; rx < w; rx++) {
|
||||
du_i64 xx = x + rx;
|
||||
if (xx < 0 || (du_u64)xx >= ctx->width) continue;
|
||||
/* 叠加极淡青色(alpha ~0.03 ≈ 8/255)*/
|
||||
du_u32 cur = line[(du_u64)xx];
|
||||
du_u32 b = (cur >> 16) & 0xFF;
|
||||
du_u32 g = (cur >> 8) & 0xFF;
|
||||
du_u32 r = cur & 0xFF;
|
||||
b = (b + 2 < 255) ? b + 2 : 255;
|
||||
g = (g + 4 < 255) ? g + 4 : 255;
|
||||
r = (r + 2 < 255) ? r + 2 : 255;
|
||||
line[(du_u64)xx] = 0xFF000000u | (b << 16) | (g << 8) | r;
|
||||
}
|
||||
}
|
||||
/* 性能优化:禁用扫描线纹理,减少约50%的像素处理开销 */
|
||||
(void)ctx; (void)x; (void)y; (void)w; (void)h;
|
||||
}
|
||||
|
||||
/* 绘制带光晕的矩形边框(box-shadow 效果)
|
||||
|
||||
@@ -121,6 +121,25 @@ struct linux_setup_header {
|
||||
/* General RAM starts after IPC region */
|
||||
#define LINUX_GUEST_RAM_GPA 0x05000000ULL /* 80 MB */
|
||||
|
||||
/* ===== virtio-mmio device GPA layout =====
|
||||
* virtio-mmio 设备放在 GPA 高位 MMIO 区(guest RAM 之上,不占用 e820 RAM)。
|
||||
* guest 通过 cmdline 参数 virtio_mmio.device= 发现这些设备。
|
||||
* 每个设备占 0x200 字节寄存器空间(virtio-mmio 规范要求 4KB 对齐)。
|
||||
*
|
||||
* 这些 GPA 在 EPT 中【故意不映射】,访问时触发 EPT violation,
|
||||
* 由 vmexit handler 路由到 virtio_mmio 后端模拟寄存器读写。
|
||||
*
|
||||
* GPA 选择 0xF4000000 起始(接近 4GB,远离 guest RAM 0x05000000-0x09000000)。 */
|
||||
#define VIRTIO_MMIO_GPA_BASE 0xF4000000ULL
|
||||
#define VIRTIO_MMIO_GPA_STRIDE 0x1000ULL /* 每个设备 4KB */
|
||||
|
||||
#define VIRTIO_MMIO_BLK_GPA (VIRTIO_MMIO_GPA_BASE + 0 * VIRTIO_MMIO_GPA_STRIDE) /* 0xF4000000 */
|
||||
#define VIRTIO_MMIO_NET_GPA (VIRTIO_MMIO_GPA_BASE + 1 * VIRTIO_MMIO_GPA_STRIDE) /* 0xF4001000 */
|
||||
|
||||
/* 判断 GPA 是否落在 virtio-mmio 设备区(含两端) */
|
||||
#define VIRTIO_MMIO_GPA_END (VIRTIO_MMIO_GPA_BASE + 2 * VIRTIO_MMIO_GPA_STRIDE)
|
||||
#define IS_VIRTIO_MMIO_GPA(gpa) ((gpa) >= VIRTIO_MMIO_GPA_BASE && (gpa) < VIRTIO_MMIO_GPA_END)
|
||||
|
||||
/* ===== Linux loader API ===== */
|
||||
|
||||
/* Loaded Linux guest state */
|
||||
@@ -165,9 +184,16 @@ int linux_launch(void);
|
||||
/* Default Linux command line (can be overridden).
|
||||
* nohlt: prevent kernel idle loop from using HLT — only the exec daemon's
|
||||
* explicit ioctl(PARK) HLT should trigger VM-Exit park, so that
|
||||
* linux_launch() returns only after the daemon is ready. */
|
||||
* linux_launch() returns only after the daemon is ready.
|
||||
* noapic/nolapic/nosmp: UTSM VMM 只模拟 legacy PIC(8259) + PIT(8254),
|
||||
* 不提供 LAPIC/IOAPIC;guest 走 XT-PIC 模式,IRQ vector = 0x30+irq。
|
||||
* virtio_mmio.device=: 向 guest 声明 virtio-mmio 设备(blk@0xF4000000 IRQ5,
|
||||
* net@0xF4001000 IRQ6),需 CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y。 */
|
||||
#define LINUX_DEFAULT_CMDLINE \
|
||||
"console=ttyS0,115200 earlyprintk=serial nokaslr " \
|
||||
"no_timer_check loglevel=7 nohlt idle=poll"
|
||||
"no_timer_check loglevel=7 nohlt idle=poll " \
|
||||
"noapic nolapic nosmp " \
|
||||
"virtio_mmio.device=4K@0xF4000000:5 " \
|
||||
"virtio_mmio.device=4K@0xF4001000:6"
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,156 @@
|
||||
#ifndef UTSM_VIRTIO_MMIO_H
|
||||
#define UTSM_VIRTIO_MMIO_H
|
||||
|
||||
/* virtio_mmio.h — UTSM virtio-mmio 设备模拟后端框架。
|
||||
*
|
||||
* 为 Linux guest 提供 virtio-mmio 设备(block + net)。
|
||||
* 设备 GPA 位于 VIRTIO_MMIO_GPA_BASE 起的高位 MMIO 区,EPT 故意不映射,
|
||||
* guest 访问时触发 EPT violation,vmexit handler 调用本模块的
|
||||
* virtio_mmio_read/write 模拟寄存器行为。
|
||||
*
|
||||
* 参考 Virtio Spec 1.1 §4.2 (virtio-mmio)。
|
||||
* guest 通过 cmdline virtio_mmio.device= 参数发现设备(无需 PCI/ACPI)。
|
||||
*/
|
||||
|
||||
#include <utsm/types.h>
|
||||
|
||||
/* virtio-mmio 寄存器偏移(Virtio Spec 1.1 §4.2.2.1,均为 32 位寄存器) */
|
||||
#define VIRTIO_MMIO_MAGIC_VALUE 0x000 /* R "virt" = 0x74726976 */
|
||||
#define VIRTIO_MMIO_VERSION 0x004 /* R 1=legacy, 2=modern */
|
||||
#define VIRTIO_MMIO_DEVICE_ID 0x008 /* R 1=net, 2=blk, 3=console... */
|
||||
#define VIRTIO_MMIO_VENDOR_ID 0x00C /* R */
|
||||
#define VIRTIO_MMIO_DEVICE_FEATURES 0x010 /* R features[31:0] (sel) */
|
||||
#define VIRTIO_MMIO_DEVICE_FEATURES_SEL 0x014 /* W */
|
||||
#define VIRTIO_MMIO_DRIVER_FEATURES 0x020 /* W features[31:0] (sel) */
|
||||
#define VIRTIO_MMIO_DRIVER_FEATURES_SEL 0x024 /* W */
|
||||
#define VIRTIO_MMIO_GUEST_PAGE_SIZE 0x028 /* W legacy only */
|
||||
#define VIRTIO_MMIO_QUEUE_SEL 0x030 /* W */
|
||||
#define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034 /* R */
|
||||
#define VIRTIO_MMIO_QUEUE_NUM 0x038 /* W */
|
||||
#define VIRTIO_MMIO_QUEUE_ALIGN 0x03C /* W legacy only */
|
||||
#define VIRTIO_MMIO_QUEUE_PFN 0x040 /* RW legacy only */
|
||||
#define VIRTIO_MMIO_QUEUE_READY 0x044 /* RW modern */
|
||||
#define VIRTIO_MMIO_QUEUE_NOTIFY 0x050 /* W */
|
||||
#define VIRTIO_MMIO_INTERRUPT_STATUS 0x060 /* R */
|
||||
#define VIRTIO_MMIO_INTERRUPT_ACK 0x064 /* W */
|
||||
#define VIRTIO_MMIO_STATUS 0x070 /* RW */
|
||||
#define VIRTIO_MMIO_QUEUE_DESC_LOW 0x080 /* W modern */
|
||||
#define VIRTIO_MMIO_QUEUE_DESC_HIGH 0x084 /* W modern */
|
||||
#define VIRTIO_MMIO_QUEUE_DRIVER_LOW 0x090 /* W modern */
|
||||
#define VIRTIO_MMIO_QUEUE_DRIVER_HIGH 0x094 /* W modern */
|
||||
#define VIRTIO_MMIO_QUEUE_DEVICE_LOW 0x0A0 /* W modern */
|
||||
#define VIRTIO_MMIO_QUEUE_DEVICE_HIGH 0x0A4 /* W modern */
|
||||
#define VIRTIO_MMIO_CONFIG_GENERATION 0x0FC /* R modern */
|
||||
#define VIRTIO_MMIO_CONFIG 0x100 /* RW device-specific config */
|
||||
|
||||
/* device IDs */
|
||||
#define VIRTIO_ID_NET 1
|
||||
#define VIRTIO_ID_BLOCK 2
|
||||
#define VIRTIO_ID_CONSOLE 3
|
||||
|
||||
/* device status bits */
|
||||
#define VIRTIO_STATUS_ACKNOWLEDGE 1
|
||||
#define VIRTIO_STATUS_DRIVER 2
|
||||
#define VIRTIO_STATUS_DRIVER_OK 4
|
||||
#define VIRTIO_STATUS_FEATURES_OK 8
|
||||
#define VIRTIO_STATUS_FAILED 128
|
||||
|
||||
/* 通用 feature bits */
|
||||
#define VIRTIO_F_VERSION_1 32 /* modern 设备必须提供(bit32=高32位word bit0) */
|
||||
|
||||
/* ===== 后端框架 API ===== */
|
||||
|
||||
/* 初始化 virtio-mmio 后端框架(注册 block + net 设备)。
|
||||
* 在 linux_loader_init 之后、linux_launch 之前调用。 */
|
||||
void virtio_mmio_init(void);
|
||||
|
||||
/* 处理一次 virtio-mmio 寄存器读/写(由 vmexit EPT violation 调用)。
|
||||
* gpa : 触发访问的 GPA(落在某设备 4KB 寄存器区)
|
||||
* width : 访问宽度(字节),通常为 4
|
||||
* value : 写操作的数据
|
||||
* 返回读操作的数据(写操作返回 0)。 */
|
||||
u64 virtio_mmio_read(u64 gpa, int width);
|
||||
void virtio_mmio_write(u64 gpa, u64 value, int width);
|
||||
|
||||
/* 后端驱动注册接口(virtio_blk.c / virtio_net.c 调用) */
|
||||
struct virtio_backend {
|
||||
u32 device_id; /* VIRTIO_ID_* */
|
||||
u64 gpa_base; /* 该设备的 MMIO GPA 起始 */
|
||||
u32 irq; /* guest ISA IRQ 号(cmdline virtio_mmio.device=:IRQ,
|
||||
* legacy PIC 下 vector = 0x30 + irq;0 = 不注入中断) */
|
||||
u32 num_queues; /* 队列数(blk=1, net=2) */
|
||||
u32 queue_size; /* 每队列描述符数 */
|
||||
u64 device_features; /* device 提供的 feature 位 */
|
||||
u32 config_len; /* config 空间长度(从 0x100 起) */
|
||||
|
||||
/* 读取 device config 空间(offset 相对 0x100)。返回 32 位值。 */
|
||||
u32 (*read_config)(u32 offset, int width);
|
||||
/* 通知:guest 写入 QUEUE_NOTIFY,后端处理该队列的请求。 */
|
||||
void (*queue_notify)(u32 queue_idx);
|
||||
/* 复位设备。 */
|
||||
void (*reset)(void);
|
||||
};
|
||||
|
||||
/* 注册一个后端设备(内部使用,按 gpa_base 排序查找)。 */
|
||||
int virtio_mmio_register(struct virtio_backend *dev);
|
||||
|
||||
/* 提供 guest GPA→host 虚拟地址转换(后端访问 virtqueue/描述符用)。
|
||||
* 通过 EPT 翻译 GPA 到 HPA,再加 HHDM offset 得到 host 虚拟地址。
|
||||
* 返回 NULL 表示 GPA 未映射。 */
|
||||
void *virtio_gpa_to_host(u64 gpa);
|
||||
|
||||
/* ===== virtqueue 结构(Virtio Spec 1.1 §2.6 split ring) ===== */
|
||||
|
||||
/* 描述符:16 字节 */
|
||||
struct virtq_desc {
|
||||
u64 addr; /* GPA of data buffer */
|
||||
u32 len; /* data length */
|
||||
u16 flags; /* VIRTQ_DESC_F_* */
|
||||
u16 next; /* next descriptor if F_NEXT */
|
||||
} __attribute__((packed));
|
||||
|
||||
#define VIRTQ_DESC_F_NEXT 1
|
||||
#define VIRTQ_DESC_F_WRITE 2
|
||||
#define VIRTQ_DESC_F_INDIRECT 4
|
||||
|
||||
/* avail ring(driver → device) */
|
||||
struct virtq_avail {
|
||||
u16 flags;
|
||||
u16 idx;
|
||||
u16 ring[1]; /* queue_size entries */
|
||||
} __attribute__((packed));
|
||||
|
||||
/* used ring 元素 */
|
||||
struct virtq_used_elem {
|
||||
u32 id; /* descriptor chain head index */
|
||||
u32 len; /* bytes written (device→driver) */
|
||||
} __attribute__((packed));
|
||||
|
||||
/* used ring(device → driver) */
|
||||
struct virtq_used {
|
||||
u16 flags;
|
||||
u16 idx;
|
||||
struct virtq_used_elem ring[1];
|
||||
} __attribute__((packed));
|
||||
|
||||
/* ===== 队列状态访问 API(后端 queue_notify 用) =====
|
||||
*
|
||||
* 后端在其 queue_notify(queue_idx) 回调中需要:
|
||||
* 1. 读 avail ring 取请求描述符链
|
||||
* 2. 处理请求(读/写 guest 数据 buffer)
|
||||
* 3. 写 used ring 回执
|
||||
* 以下函数按 device_id + queue_idx 定位队列,操作 guest 内存。 */
|
||||
|
||||
/* 取队列的 desc/avail/used 表 host 地址 + 队列大小。
|
||||
* 返回 0 成功(指针填充),负值失败(队列未 ready/未映射)。 */
|
||||
int virtio_queue_get_ptrs(u32 device_id, u32 queue_idx,
|
||||
struct virtq_desc **desc_out,
|
||||
struct virtq_avail **avail_out,
|
||||
struct virtq_used **used_out,
|
||||
u32 *queue_num_out);
|
||||
|
||||
/* 更新 used ring idx(后端处理完一批请求后调用,让 guest 看到新回执)。
|
||||
* 由后端在写 used ring 元素后调用,内部做内存屏障。 */
|
||||
void virtio_queue_bump_used(struct virtq_used *used, u16 new_idx);
|
||||
|
||||
#endif /* UTSM_VIRTIO_MMIO_H */
|
||||
@@ -169,8 +169,10 @@
|
||||
/* ===== Pin-based controls ===== */
|
||||
#define PIN_EXT_INTERRUPT_EXITING (1ULL << 0)
|
||||
#define PIN_NMI_EXITING (1ULL << 3)
|
||||
#define PIN_VMX_PREEMPTION_TIMER (1ULL << 6)
|
||||
|
||||
/* ===== Primary processor-based controls ===== */
|
||||
#define CPU_BASED_INTR_WINDOW_EXITING (1ULL << 2)
|
||||
#define CPU_BASED_HLT_EXITING (1ULL << 7)
|
||||
#define CPU_BASED_INVLPG_EXITING (1ULL << 9)
|
||||
#define CPU_BASED_MWAIT_EXITING (1ULL << 10)
|
||||
@@ -208,6 +210,7 @@
|
||||
#define EXIT_EXTERNAL_INTERRUPT 1
|
||||
#define EXIT_TRIPLE_FAULT 2
|
||||
#define EXIT_INIT_SIGNAL 3
|
||||
#define EXIT_INTERRUPT_WINDOW 7
|
||||
#define EXIT_CPUID 10
|
||||
#define EXIT_INVD 13
|
||||
#define EXIT_RDMSR 31
|
||||
@@ -232,8 +235,13 @@
|
||||
#define EXIT_INVLPG 14
|
||||
#define EXIT_EPT_VIOLATION 48
|
||||
#define EXIT_EPT_MISCONFIG 49
|
||||
#define EXIT_VMX_PREEMPTION_TIMER 52
|
||||
#define EXIT_APIC_ACCESS 44
|
||||
|
||||
/* ===== VM-entry interruption-information field 编码 ===== */
|
||||
#define VM_ENTRY_INTR_INFO_VALID 0x80000000ULL
|
||||
#define VM_ENTRY_INTR_TYPE_HW_IRQ 0 /* external interrupt (bits 10:8) */
|
||||
|
||||
/* ===== EPT memory types ===== */
|
||||
#define EPT_MEMORY_TYPE_UC 0ULL
|
||||
#define EPT_MEMORY_TYPE_WC 1ULL
|
||||
@@ -265,4 +273,16 @@ int vmx_vmresume(void);
|
||||
u64 vmx_read_msr(u32 msr);
|
||||
u64 vmx_get_host_cr3(void);
|
||||
|
||||
/* ===== 虚拟中断注入(vmexit.c 实现) ===== */
|
||||
/* 向 guest 队列注入一个 ISA IRQ 向量(legacy PIC:vector = 0x30 + irq)。
|
||||
* 仅排队;实际在下一次 vmresume 前(guest RFLAGS.IF=1 且无阻塞时)注入,
|
||||
* 否则 arm interrupt-window exiting,待 guest 可接收时注入。 */
|
||||
void vmx_guest_queue_irq(u32 vector);
|
||||
|
||||
/* VMX preemption timer:返回 1ms 对应的 timer 计数值(按 IA32_VMX_BASIC
|
||||
* bits[55:48] 的 scale 换算 TSC 频率)。 */
|
||||
u64 vmx_preemption_quantum_1ms(void);
|
||||
/* 检查 CPU 是否支持 VMX preemption timer。 */
|
||||
int vmx_preemption_timer_supported(void);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user