清理了 t.CVoid

This commit is contained in:
TermiNexus committed 2026-09-16 16:07:04 +08:00
1 parent 6a54373c26
commit 2a54e2bafb
19 files changed
+199 -200

No files matched your search

+5 -5
View File
@@ -35,7 +35,7 @@ class V3:
z: t.CFloat64T
def __new__() -> 'V3' | t.CPtr:
return t.CVoid(uint64(_v3_pool.alloc(24)), t.CPtr)
return uint64(_v3_pool.alloc(24))
def __init__(self, x: t.CFloat64T, y: t.CFloat64T, z: t.CFloat64T):
self.x = x
@@ -94,25 +94,25 @@ def smoothstep(a: t.CFloat64T, b: t.CFloat64T, x: t.CFloat64T) -> t.CFloat64T:
def setup_camera():
global CAM, FWD, RIGHT, UP
e: t.CFloat64T = CAM_ELEV * 3.14159265358979323846 / 180.0
CAM = t.CVoid(c.Addr(_g_cam), t.CPtr)
CAM = c.Addr(_g_cam)
CAM.x = CAM_DIST * vm.cos(e)
CAM.y = CAM_DIST * vm.sin(e)
CAM.z = 0.0
tmp0: V3 | t.CPtr = V3(0.0, 0.0, 0.0)
FWD = t.CVoid(c.Addr(_g_fwd), t.CPtr)
FWD = c.Addr(_g_fwd)
tmp1: V3 | t.CPtr = tmp0 - CAM
n1: V3 | t.CPtr = tmp1.nrm()
FWD.x = n1.x
FWD.y = n1.y
FWD.z = n1.z
tmp2: V3 | t.CPtr = V3(0.0, 1.0, 0.0)
RIGHT = t.CVoid(c.Addr(_g_right), t.CPtr)
RIGHT = c.Addr(_g_right)
tmp3: V3 | t.CPtr = FWD.cross(tmp2)
tmp4: V3 | t.CPtr = tmp3.nrm()
RIGHT.x = tmp4.x
RIGHT.y = tmp4.y
RIGHT.z = tmp4.z
UP = t.CVoid(c.Addr(_g_up), t.CPtr)
UP = c.Addr(_g_up)
tmp5: V3 | t.CPtr = RIGHT.cross(FWD)
UP.x = tmp5.x
UP.y = tmp5.y
+2 -2
View File
@@ -20,7 +20,7 @@ _canvas_ptr: vpui.FBCanvas | t.CPtr
_s3d_ptr: gfx.Scene3D | t.CPtr
_time_val: float = float(0.0)
def _render_thread(arg: t.CPtr) -> t.CVoid:
def _render_thread(arg: t.CPtr):
root: vpui.Tk | t.CPtr = _root_ptr
canvas: vpui.FBCanvas | t.CPtr = _canvas_ptr
s3d: gfx.Scene3D | t.CPtr = _s3d_ptr
@@ -41,7 +41,7 @@ def _start() -> int | t.CExport:
canvas: vpui.FBCanvas = vpui.FBCanvas(master, SCENE_W, SCENE_H)
root.pack(0, vpui.PACK_TOP, vpui.FILL_BOTH, 1, 0, 0)
zbuf: float | t.CPtr = t.CVoid(c.Addr(_zbuf_mem), t.CPtr)
zbuf: float | t.CPtr = c.Addr(_zbuf_mem)
string.memset(zbuf, 0, SCENE_W * SCENE_H * 8)
fb: UINT32PTR = c.Addr(_fb_mem)
+2 -2
View File
@@ -1,12 +1,12 @@
import vpsdk.syscall as syscall
import t, c
def log_info(msg: t.CConst | t.CChar | t.CPtr) -> t.CVoid | t.CExport:
export def log_info(msg: t.CConst | str):
syscall._syscall1(uint64(syscall.SERIAL_PUTS), uint64("[SerialLogger] "))
syscall._syscall1(uint64(syscall.SERIAL_PUTS), uint64(msg))
syscall._syscall1(uint64(syscall.SERIAL_PUTS), uint64("\n"))
def log_warn(msg: t.CConst | t.CChar | t.CPtr) -> t.CVoid | t.CExport:
export def log_warn(msg: t.CConst | str):
syscall._syscall1(uint64(syscall.SERIAL_PUTS), uint64("[SerialLogger:WARN] "))
syscall._syscall1(uint64(syscall.SERIAL_PUTS), uint64(msg))
syscall._syscall1(uint64(syscall.SERIAL_PUTS), uint64("\n"))
+7 -7
View File
@@ -7,16 +7,16 @@ def color_rgb(r: uint8, g: uint8, b: uint8) -> uint32:
return uint32(r) | (uint32(g) << 8) | (uint32(b) << 16)
def get_winbuf(win_id: int) -> UINT32PTR:
return t.CVoid(syscall._syscall2(uint64(syscall.GET_WINBUF), uint64(win_id), 0), t.CPtr)
return syscall._syscall2(uint64(syscall.GET_WINBUF), uint64(win_id), 0)
def win_flush(win_id: int) -> t.CVoid:
def win_flush(win_id: int):
syscall._syscall2(uint64(syscall.WIN_FLUSH), uint64(win_id), 0)
def draw_pixel(buf: UINT32PTR, bw: int, x: int, y: int, color: uint32) -> t.CVoid | t.CExport:
export def draw_pixel(buf: UINT32PTR, bw: int, x: int, y: int, color: uint32):
if x < 0 or y < 0: return
buf[y * bw + x] = color
def draw_line(buf: UINT32PTR, bw: int, x0: int, y0: int, x1: int, y1: int, color: uint32) -> t.CVoid | t.CExport:
export def draw_line(buf: UINT32PTR, bw: int, x0: int, y0: int, x1: int, y1: int, color: uint32):
dx: int = x1 - x0
dy: int = y1 - y0
sx: int = 1
@@ -41,13 +41,13 @@ def draw_line(buf: UINT32PTR, bw: int, x0: int, y0: int, x1: int, y1: int, color
err += dx
y0 += sy
def draw_rect(buf: UINT32PTR, bw: int, rx: int, ry: int, rw: int, rh: int, color: uint32) -> t.CVoid | t.CExport:
export def draw_rect(buf: UINT32PTR, bw: int, rx: int, ry: int, rw: int, rh: int, color: uint32):
draw_line(buf, bw, rx, ry, rx + rw - 1, ry, color)
draw_line(buf, bw, rx + rw - 1, ry, rx + rw - 1, ry + rh - 1, color)
draw_line(buf, bw, rx + rw - 1, ry + rh - 1, rx, ry + rh - 1, color)
draw_line(buf, bw, rx, ry + rh - 1, rx, ry, color)
def fill_rect(buf: UINT32PTR, bw: int, rx: int, ry: int, rw: int, rh: int, color: uint32) -> t.CVoid | t.CExport:
export def fill_rect(buf: UINT32PTR, bw: int, rx: int, ry: int, rw: int, rh: int, color: uint32):
if rx < 0: rw += rx; rx = 0
if ry < 0: rh += ry; ry = 0
if rw <= 0 or rh <= 0: return
@@ -59,7 +59,7 @@ def fill_rect(buf: UINT32PTR, bw: int, rx: int, ry: int, rw: int, rh: int, color
px += 1
py += 1
def draw_circle(buf: UINT32PTR, bw: int, cx: int, cy: int, r: int, color: uint32) -> t.CVoid | t.CExport:
export def draw_circle(buf: UINT32PTR, bw: int, cx: int, cy: int, r: int, color: uint32):
x: int = r
y: int = 0
d: int = 1 - r
+1 -1
View File
@@ -487,7 +487,7 @@ class mouse_device(devfs_file):
uint8(buffer, t.CPtr)[0] = pkt.buttons
# 完整包需要 1(buttons) + 4(x) + 4(y) = 9 字节,否则越界写
if size >= 9:
buf: uint32 | t.CPtr = t.CVoid(uint64(buffer) + 1, t.CPtr)
buf: uint32 | t.CPtr = t.CPtr(uint64(buffer) + 1)
int32(buf, t.CPtr)[0] = mouse.get_x()
int32(buf, t.CPtr)[1] = mouse.get_y()
return 9
@@ -116,7 +116,7 @@ def example_main() -> int:
fp3: types.fileobj | t.CPtr = fs.open("/test_dir_1/file1.txt", types.FA_OPEN_EXISTING | types.FA_READ)
if fp3 is not None:
buf: t.CArray[uint8, 256]
read_bytes: uint32 = fs.read(fp3, t.CVoid(c.Addr(buf[0]), t.CPtr), 256)
read_bytes: uint32 = fs.read(fp3, c.Addr(buf[0]), 256)
print(f"读取字节数: {read_bytes}")
print(f"文件内容: {t.CChar(c.Addr(buf[0]), t.CPtr)}")
@@ -125,7 +125,7 @@ def example_main() -> int:
pos: uint32 = fs.tell(fp3)
print(f"seek 到位置 5, 当前位置: {pos}")
read_bytes2: uint32 = fs.read(fp3, t.CVoid(c.Addr(buf[0]), t.CPtr), 256)
read_bytes2: uint32 = fs.read(fp3, c.Addr(buf[0]), 256)
print(f"从位置 5 读取: {t.CChar(c.Addr(buf[0]), t.CPtr)}")
# 获取文件大小
@@ -141,7 +141,7 @@ def example_main() -> int:
k: int
for k in range(1024):
large_data[k] = uint8(ord('A') + (k % 26))
written3: uint32 = fs.write(fp4, t.CVoid(c.Addr(large_data[0]), t.CPtr), 1024)
written3: uint32 = fs.write(fp4, c.Addr(large_data[0]), 1024)
print(f"创建大文件, 写入: {written3} 字节")
fs.close(fp4)
print()
+2 -2
View File
@@ -343,7 +343,7 @@ class _VGAScreenDriver:
self.ClearScreen(self.BgColor)
# 检测硬件颜色格式 - 优化测试逻辑,避免误判
def DetectColorFormat(self) -> t.CStatic | t.CVoid:
def DetectColorFormat(self):
if self.fb is None: return
fb: t.CUnsignedChar | t.CPtr = t.CUnsignedChar(self.fb, t.CPtr)
testX: int = 0
@@ -360,7 +360,7 @@ class _VGAScreenDriver:
b: t.CUnsignedChar = fb[offset + 0]
g: t.CUnsignedChar = fb[offset + 1]
r: t.CUnsignedChar = fb[offset + 2]
# t.CVoid(fb[offset + 3]) # 忽略Alpha
# t\.CVoid(fb[offset + 3]) # 忽略Alpha
# 恢复原始像素
c.Set(c.Deref(uint32(fb + offset, t.CPtr)), OriginalPixel)
# 判定颜色格式
+32 -32
View File
@@ -133,10 +133,10 @@ def load_elf(path: t.CConst | str, do_map: int = 1) -> t.CPtr:
# [DIAG] read_len 实际值 + call 后 RAX 快照:区分"call 返回错"(rl=0 rax=0)
# vs "store 后 RAX 被覆盖"(rl=0 rax=64)
_rax_v2: uint64 = 0
# 读 RAX 未声明输入:至少须声明 CLOBBER_RAX,让编译器知道本块不保留
# RAX(此前只声明 ~{memory},编译器可假设 RAX 存活 → 读到的值不保证是
# 紧邻 call 的返回值)。N16。(本块为 [DIAG] 探针,问题定位后建议删除。)
c.Asm(f"""mov {c.AsmOut(_rax_v2, t.ASM_DESCR.OUTPUT_REG)}, rax""",
# 读 RAX 未声明输入:至少须声明 CLOBBER_RAX,让编译器知道本块不保留
# RAX(此前只声明 ~{memory},编译器可假设 RAX 存活 → 读到的值不保证是
# 紧邻 call 的返回值)。N16。(本块为 [DIAG] 探针,问题定位后建议删除。)
c.Asm(f"""mov {c.AsmOut(_rax_v2, t.ASM_DESCR.OUTPUT_REG)}, rax""",
op=[t.ASM_DESCR.CLOBBER_MEMORY, t.ASM_DESCR.CLOBBER_RAX])
_dbrl: t.CArray[t.CChar, 96]
viperlib.snprintf(c.Addr(_dbrl), 96, "[elf] rl=%lu rax=0x%lx\n", read_len, _rax_v2)
@@ -254,7 +254,7 @@ def load_elf(path: t.CConst | str, do_map: int = 1) -> t.CPtr:
return None
phys_base_aligned: uint64 = (uint64(raw_alloc) + uint64(0xFFF)) & ~uint64(0xFFF)
phys_base: t.CPtr = t.CVoid(phys_base_aligned, t.CPtr)
phys_base: t.CPtr = t.CPtr(phys_base_aligned)
string.memset(phys_base, 0, total_pages * 0x1000)
@@ -265,14 +265,14 @@ def load_elf(path: t.CConst | str, do_map: int = 1) -> t.CPtr:
filesz: uint64 = phdr_bufs[pi].p_filesz
memsz: uint64 = phdr_bufs[pi].p_memsz
dest_off: uint64 = vaddr - lowest_vaddr
dest: t.CPtr = t.CVoid(uint64(phys_base) + dest_off, t.CPtr)
dest: t.CPtr = t.CPtr(uint64(phys_base) + dest_off)
if filesz > 0:
fat32.seek(fp, uint32(file_off))
fat32.read(fp, dest, uint32(filesz))
if memsz > filesz:
bss_start: t.CPtr = t.CVoid(uint64(dest) + filesz, t.CPtr)
bss_start: t.CPtr = t.CPtr(uint64(dest) + filesz)
bss_len: uint64 = memsz - filesz
string.memset(bss_start, 0, bss_len)
@@ -296,7 +296,7 @@ def load_elf(path: t.CConst | str, do_map: int = 1) -> t.CPtr:
page_flags: uint64 = paging.PTE_PRESENT | paging.PTE_WRITABLE | paging.PTE_USER
paging.MapPage(virt_addr, phys_addr, page_flags)
entry_addr: t.CPtr = t.CVoid(entry_point, t.CPtr)
entry_addr: t.CPtr = t.CPtr(entry_point)
return entry_addr
@@ -530,7 +530,7 @@ def _resolve_symbol(name: t.CConst | t.CChar | t.CPtr) -> t.CPtr:
if c.Deref(cmp_name + i) != c.Deref("serial_puts" + i):
match = 0
if match:
return t.CVoid(c.Addr(serial.puts), t.CPtr)
return c.Addr(serial.puts)
return None
_so_strtab: t.CPtr
@@ -629,7 +629,7 @@ def load_so(path: t.CConst | str) -> t.CPtr:
return None
phys_base_aligned: uint64 = (uint64(raw_alloc) + 0xFFF) & ~uint64(0xFFF)
phys_base: t.CPtr = t.CVoid(phys_base_aligned, t.CPtr)
phys_base: t.CPtr = t.CPtr(phys_base_aligned)
string.memset(phys_base, 0, total_pages * 0x1000)
for pi in range(phnum):
@@ -639,12 +639,12 @@ def load_so(path: t.CConst | str) -> t.CPtr:
filesz: uint64 = phdr_bufs[pi].p_filesz
memsz: uint64 = phdr_bufs[pi].p_memsz
dest_off: uint64 = vaddr - lowest_vaddr
dest: t.CPtr = t.CVoid(uint64(phys_base) + dest_off, t.CPtr)
dest: t.CPtr = t.CPtr(uint64(phys_base) + dest_off)
if filesz > 0:
fat32.seek(fp, uint32(file_off))
fat32.read(fp, dest, uint32(filesz))
if memsz > filesz:
bss_start: t.CPtr = t.CVoid(uint64(dest) + filesz, t.CPtr)
bss_start: t.CPtr = t.CPtr(uint64(dest) + filesz)
bss_len: uint64 = memsz - filesz
string.memset(bss_start, 0, bss_len)
@@ -693,22 +693,22 @@ def load_so(path: t.CConst | str) -> t.CPtr:
elif dyn_buf[di].d_tag == DT_JMPREL: jmprel_vaddr = dyn_buf[di].d_val
elif dyn_buf[di].d_tag == DT_PLTRELSZ: pltrelsz = dyn_buf[di].d_val
strtab_ptr: t.CPtr = t.CVoid(strtab_vaddr + so_load_addr, t.CPtr)
symtab_ptr: t.CPtr = t.CVoid(symtab_vaddr + so_load_addr, t.CPtr)
strtab_ptr: t.CPtr = t.CPtr(strtab_vaddr + so_load_addr)
symtab_ptr: t.CPtr = t.CPtr(symtab_vaddr + so_load_addr)
if rela_vaddr != 0 and relasz > 0:
rela_count: uint64 = relasz // 24
for ri in range(rela_count):
rela: Elf64_Rela | t.CPtr = t.CVoid(uint64(rela_vaddr) + so_load_addr + ri * 24, t.CPtr)
rela: Elf64_Rela | t.CPtr = t.CPtr(uint64(rela_vaddr) + so_load_addr + ri * 24)
r_type: uint32 = uint32(rela.r_info & 0xFFFFFFFF)
r_sym: uint32 = uint32(rela.r_info >> 32)
target_addr: t.CPtr = t.CVoid(rela.r_offset + so_load_addr, t.CPtr)
target_addr: t.CPtr = t.CPtr(rela.r_offset + so_load_addr)
if r_type == R_X86_64_RELATIVE:
val: uint64 = uint64(rela.r_addend) + so_load_addr
string.memcpy(target_addr, c.Addr(val), 8)
elif r_type == R_X86_64_64 or r_type == R_X86_64_GLOB_DAT or r_type == R_X86_64_JUMP_SLOT:
sym: Elf64_Sym | t.CPtr = t.CVoid(uint64(symtab_ptr) + uint64(r_sym) * syment, t.CPtr)
sym_name: t.CConst | t.CChar | t.CPtr = t.CConst(uint64(strtab_ptr) + sym.st_name, t.CPtr)
sym: Elf64_Sym | t.CPtr = t.CPtr(uint64(symtab_ptr) + uint64(r_sym) * syment)
sym_name: t.CConst | str = t.CPtr(uint64(strtab_ptr) + sym.st_name)
resolved: t.CPtr = _resolve_symbol(sym_name)
if resolved is not None:
val2: uint64 = uint64(resolved) + uint64(rela.r_addend)
@@ -720,13 +720,13 @@ def load_so(path: t.CConst | str) -> t.CPtr:
if jmprel_vaddr != 0 and pltrelsz > 0:
jmprel_count: uint64 = pltrelsz // 24
for ji in range(jmprel_count):
rela2: Elf64_Rela | t.CPtr = t.CVoid(jmprel_vaddr + so_load_addr + ji * 24, t.CPtr)
rela2: Elf64_Rela | t.CPtr = t.CPtr(jmprel_vaddr + so_load_addr + ji * 24)
r_type2: uint32 = uint32(rela2.r_info & 0xFFFFFFFF)
r_sym2: uint32 = uint32(rela2.r_info >> 32)
target2: t.CPtr = t.CVoid(rela2.r_offset + so_load_addr, t.CPtr)
target2: t.CPtr = t.CPtr(rela2.r_offset + so_load_addr)
if r_type2 == R_X86_64_JUMP_SLOT or r_type2 == R_X86_64_GLOB_DAT:
sym2: Elf64_Sym | t.CPtr = t.CVoid(uint64(symtab_ptr) + uint64(r_sym2) * syment, t.CPtr)
sym_name2: t.CConst | t.CChar | t.CPtr = t.CConst(uint64(strtab_ptr) + sym2.st_name, t.CPtr)
sym2: Elf64_Sym | t.CPtr = t.CPtr(uint64(symtab_ptr) + uint64(r_sym2) * syment)
sym_name2: t.CConst | str = t.CPtr(uint64(strtab_ptr) + sym2.st_name)
resolved2: t.CPtr = _resolve_symbol(sym_name2)
if resolved2 is not None:
val4: uint64 = uint64(resolved2) + uint64(rela2.r_addend)
@@ -748,8 +748,8 @@ def load_so(path: t.CConst | str) -> t.CPtr:
_so_syment = syment
_so_sym_count = 0
if hash_vaddr != 0:
hash_ptr: t.CPtr = t.CVoid(hash_vaddr + so_load_addr, t.CPtr)
nchain: uint32 = c.Deref(t.CVoid(uint64(hash_ptr) + 4, t.CPtr))
hash_ptr: t.CPtr = t.CPtr(hash_vaddr + so_load_addr)
nchain: uint32 = c.Deref(t.CPtr(uint64(hash_ptr) + 4))
_so_sym_count = int(nchain)
elif syment > 0 and strtab_vaddr > symtab_vaddr and symtab_vaddr != 0:
sym_tab_size: uint64 = strtab_vaddr - symtab_vaddr
@@ -760,22 +760,22 @@ def load_so(path: t.CConst | str) -> t.CPtr:
serial.puts(cr)
fat32.unlock()
return t.CVoid(base_vaddr, t.CPtr)
return t.CPtr(base_vaddr)
def get_so_symbol(so_base: t.CPtr, name: t.CConst | t.CChar | t.CPtr, so_path: t.CConst | t.CChar | t.CPtr) -> t.CPtr:
def get_so_symbol(so_base: t.CPtr, name: t.CConst | str, so_path: t.CConst | t.CChar | t.CPtr) -> t.CPtr:
if _so_symtab is None or _so_strtab is None or _so_syment == 0:
return None
if name is None:
return None
for symi in range(_so_sym_count):
sb2: Elf64_Sym | t.CPtr = t.CVoid(uint64(_so_symtab) + uint64(symi) * _so_syment, t.CPtr)
sb2: Elf64_Sym | t.CPtr = t.CPtr(uint64(_so_symtab) + uint64(symi) * _so_syment)
if sb2.st_value != 0 and sb2.st_shndx != 0:
sym_name_off2: uint32 = sb2.st_name
cmp_off2: uint32 = sym_name_off2
match2: int = 0
ni2: int = 0
while True:
sc3: t.CChar = c.Deref(t.CVoid(uint64(_so_strtab) + cmp_off2 + ni2, t.CPtr))
sc3: t.CChar = c.Deref(t.CPtr(uint64(_so_strtab) + cmp_off2 + ni2))
nc3: t.CChar = c.Deref(name + ni2)
if sc3 != nc3:
break
@@ -788,7 +788,7 @@ def get_so_symbol(so_base: t.CPtr, name: t.CConst | t.CChar | t.CPtr, so_path: t
is_sha1_2: int = 0
sha1_len_2: uint32 = 0
while True:
dc4: t.CChar = c.Deref(t.CVoid(uint64(_so_strtab) + dot_pos3, t.CPtr))
dc4: t.CChar = c.Deref(t.CPtr(uint64(_so_strtab) + dot_pos3))
if dc4 == 46:
if sha1_len_2 >= 8:
is_sha1_2 = 1
@@ -805,7 +805,7 @@ def get_so_symbol(so_base: t.CPtr, name: t.CConst | t.CChar | t.CPtr, so_path: t
match2 = 1
ni2 = 0
while True:
sc4: t.CChar = c.Deref(t.CVoid(uint64(_so_strtab) + cmp_off2 + ni2, t.CPtr))
sc4: t.CChar = c.Deref(t.CPtr(uint64(_so_strtab) + cmp_off2 + ni2))
nc4: t.CChar = c.Deref(name + ni2)
if sc4 != nc4:
match2 = 0
@@ -816,8 +816,8 @@ def get_so_symbol(so_base: t.CPtr, name: t.CConst | t.CChar | t.CPtr, so_path: t
if match2:
result_addr: uint64 = uint64(so_base) + sb2.st_value
dbg2: t.CArray[t.CChar, 80]
viperlib.snprintf(c.Addr(dbg2), 80, "[so] found '%s' at 0x%lx\n", t.CVoid(uint64(_so_strtab) + sym_name_off2, t.CPtr), result_addr)
viperlib.snprintf(c.Addr(dbg2), 80, "[so] found '%s' at 0x%lx\n", t.CPtr(uint64(_so_strtab) + sym_name_off2), result_addr)
serial.puts(dbg2)
return t.CVoid(result_addr, t.CPtr)
return t.CPtr(result_addr)
serial.puts("[so] symbol not found\n")
return None
+49 -50
View File
@@ -283,43 +283,41 @@ def isrCommonhandler(interrupt: int):
asm.sti()
asm.hlt()
def isr0_handler() -> t.CExport | t.CVoid: isrCommonhandler(0)
def isr1_handler() -> t.CExport | t.CVoid: isrCommonhandler(1)
def isr2_handler() -> t.CExport | t.CVoid: isrCommonhandler(2)
def isr3_handler() -> t.CExport | t.CVoid: isrCommonhandler(3)
def isr4_handler() -> t.CExport | t.CVoid: isrCommonhandler(4)
def isr5_handler() -> t.CExport | t.CVoid: isrCommonhandler(5)
def isr6_handler() -> t.CExport | t.CVoid: isrCommonhandler(6)
def isr7_handler() -> t.CExport | t.CVoid: isrCommonhandler(7)
def isr8_handler() -> t.CExport | t.CVoid: isrCommonhandler(8)
def isr9_handler() -> t.CExport | t.CVoid: isrCommonhandler(9)
def isr10_handler() -> t.CExport | t.CVoid: isrCommonhandler(10)
def isr11_handler() -> t.CExport | t.CVoid: isrCommonhandler(11)
def isr12_handler() -> t.CExport | t.CVoid: isrCommonhandler(12)
def isr13_handler() -> t.CExport | t.CVoid:
isrCommonhandler(13)
def isr14_handler() -> t.CExport | t.CVoid: isrCommonhandler(14)
def isr15_handler() -> t.CExport | t.CVoid: isrCommonhandler(15)
def isr16_handler() -> t.CExport | t.CVoid: isrCommonhandler(16)
def isr17_handler() -> t.CExport | t.CVoid: isrCommonhandler(17)
def isr18_handler() -> t.CExport | t.CVoid: isrCommonhandler(18)
def isr19_handler() -> t.CExport | t.CVoid: isrCommonhandler(19)
def isr20_handler() -> t.CExport | t.CVoid: isrCommonhandler(20)
def isr21_handler() -> t.CExport | t.CVoid: isrCommonhandler(21)
def isr22_handler() -> t.CExport | t.CVoid: isrCommonhandler(22)
def isr23_handler() -> t.CExport | t.CVoid: isrCommonhandler(23)
def isr24_handler() -> t.CExport | t.CVoid: isrCommonhandler(24)
def isr25_handler() -> t.CExport | t.CVoid: isrCommonhandler(25)
def isr26_handler() -> t.CExport | t.CVoid: isrCommonhandler(26)
def isr27_handler() -> t.CExport | t.CVoid: isrCommonhandler(27)
def isr28_handler() -> t.CExport | t.CVoid: isrCommonhandler(28)
def isr29_handler() -> t.CExport | t.CVoid: isrCommonhandler(29)
def isr30_handler() -> t.CExport | t.CVoid: isrCommonhandler(30)
def isr31_handler() -> t.CExport | t.CVoid: isrCommonhandler(31)
def isr32_handler() -> t.CExport | t.CVoid:
timer.timer_handler()
export def isr0_handler(): isrCommonhandler(0)
export def isr1_handler(): isrCommonhandler(1)
export def isr2_handler(): isrCommonhandler(2)
export def isr3_handler(): isrCommonhandler(3)
export def isr4_handler(): isrCommonhandler(4)
export def isr5_handler(): isrCommonhandler(5)
export def isr6_handler(): isrCommonhandler(6)
export def isr7_handler(): isrCommonhandler(7)
export def isr8_handler(): isrCommonhandler(8)
export def isr9_handler(): isrCommonhandler(9)
export def isr10_handler(): isrCommonhandler(10)
export def isr11_handler(): isrCommonhandler(11)
export def isr12_handler(): isrCommonhandler(12)
export def isr13_handler(): isrCommonhandler(13)
export def isr14_handler(): isrCommonhandler(14)
export def isr15_handler(): isrCommonhandler(15)
export def isr16_handler(): isrCommonhandler(16)
export def isr17_handler(): isrCommonhandler(17)
export def isr18_handler(): isrCommonhandler(18)
export def isr19_handler(): isrCommonhandler(19)
export def isr20_handler(): isrCommonhandler(20)
export def isr21_handler(): isrCommonhandler(21)
export def isr22_handler(): isrCommonhandler(22)
export def isr23_handler(): isrCommonhandler(23)
export def isr24_handler(): isrCommonhandler(24)
export def isr25_handler(): isrCommonhandler(25)
export def isr26_handler(): isrCommonhandler(26)
export def isr27_handler(): isrCommonhandler(27)
export def isr28_handler(): isrCommonhandler(28)
export def isr29_handler(): isrCommonhandler(29)
export def isr30_handler(): isrCommonhandler(30)
export def isr31_handler(): isrCommonhandler(31)
export def isr32_handler(): timer.timer_handler()
def isr33_handler() -> t.CExport | t.CVoid:
export def isr33_handler():
handler: irq_handler_t = irqGetHandler(1)
if handler:
c.Asm(f"""call {c.AsmInp(handler, t.ASM_DESCR.REG_ANY)}""",
@@ -331,7 +329,7 @@ def isr33_handler() -> t.CExport | t.CVoid:
pic.eoi(1)
apic.eoi()
def isr34_handler() -> t.CExport | t.CVoid:
export def isr34_handler():
handler2: irq_handler_t = irqGetHandler(2)
if handler2:
c.Asm(f"""call {c.AsmInp(handler2, t.ASM_DESCR.REG_ANY)}""",
@@ -343,7 +341,7 @@ def isr34_handler() -> t.CExport | t.CVoid:
pic.eoi(2)
apic.eoi()
def isr35_handler() -> t.CExport | t.CVoid:
export def isr35_handler():
handler3: irq_handler_t = irqGetHandler(3)
if handler3:
c.Asm(f"""call {c.AsmInp(handler3, t.ASM_DESCR.REG_ANY)}""",
@@ -355,7 +353,7 @@ def isr35_handler() -> t.CExport | t.CVoid:
pic.eoi(3)
apic.eoi()
def isr36_handler() -> t.CExport | t.CVoid:
export def isr36_handler():
handler4: irq_handler_t = irqGetHandler(4)
if handler4:
c.Asm(f"""call {c.AsmInp(handler4, t.ASM_DESCR.REG_ANY)}""",
@@ -367,7 +365,7 @@ def isr36_handler() -> t.CExport | t.CVoid:
pic.eoi(4)
apic.eoi()
def isr37_handler() -> t.CExport | t.CVoid:
export def isr37_handler():
handler5: irq_handler_t = irqGetHandler(5)
if handler5:
c.Asm(f"""call {c.AsmInp(handler5, t.ASM_DESCR.REG_ANY)}""",
@@ -379,7 +377,7 @@ def isr37_handler() -> t.CExport | t.CVoid:
pic.eoi(5)
apic.eoi()
def isr38_handler() -> t.CExport | t.CVoid:
export def isr38_handler():
handler6: irq_handler_t = irqGetHandler(6)
if handler6:
c.Asm(f"""call {c.AsmInp(handler6, t.ASM_DESCR.REG_ANY)}""",
@@ -391,7 +389,7 @@ def isr38_handler() -> t.CExport | t.CVoid:
pic.eoi(6)
apic.eoi()
def isr39_handler() -> t.CExport | t.CVoid:
export def isr39_handler():
if pic.isSpurious(7):
return
handler7: irq_handler_t = irqGetHandler(7)
@@ -405,7 +403,7 @@ def isr39_handler() -> t.CExport | t.CVoid:
pic.eoi(7)
apic.eoi()
def isr40_handler() -> t.CExport | t.CVoid:
export def isr40_handler():
handler8: irq_handler_t = irqGetHandler(8)
if handler8:
c.Asm(f"""call {c.AsmInp(handler8, t.ASM_DESCR.REG_ANY)}""",
@@ -417,7 +415,7 @@ def isr40_handler() -> t.CExport | t.CVoid:
pic.eoi(8)
apic.eoi()
def isr41_handler() -> t.CExport | t.CVoid:
export def isr41_handler():
handler9: irq_handler_t = irqGetHandler(9)
if handler9:
c.Asm(f"""call {c.AsmInp(handler9, t.ASM_DESCR.REG_ANY)}""",
@@ -429,7 +427,7 @@ def isr41_handler() -> t.CExport | t.CVoid:
pic.eoi(9)
apic.eoi()
def isr42_handler() -> t.CExport | t.CVoid:
export def isr42_handler():
handler10: irq_handler_t = irqGetHandler(10)
if handler10:
c.Asm(f"""call {c.AsmInp(handler10, t.ASM_DESCR.REG_ANY)}""",
@@ -441,7 +439,7 @@ def isr42_handler() -> t.CExport | t.CVoid:
pic.eoi(10)
apic.eoi()
def isr43_handler() -> t.CExport | t.CVoid:
export def isr43_handler():
handler11: irq_handler_t = irqGetHandler(11)
if handler11:
c.Asm(f"""call {c.AsmInp(handler11, t.ASM_DESCR.REG_ANY)}""",
@@ -452,7 +450,8 @@ def isr43_handler() -> t.CExport | t.CVoid:
t.ASM_DESCR.CLOBBER_R10, t.ASM_DESCR.CLOBBER_R11])
pic.eoi(11)
apic.eoi()
def isr44_handler() -> t.CExport | t.CVoid:
export def isr44_handler():
handler: irq_handler_t = irqGetHandler(12)
if handler:
c.Asm(f"""call {c.AsmInp(handler, t.ASM_DESCR.REG_ANY)}""",
@@ -464,15 +463,15 @@ def isr44_handler() -> t.CExport | t.CVoid:
pic.eoi(12)
apic.eoi()
def isr45_handler() -> t.CExport | t.CVoid:
export def isr45_handler():
pic.eoi(13)
apic.eoi()
def isr46_handler() -> t.CExport | t.CVoid:
export def isr46_handler():
pic.eoi(14)
apic.eoi()
def isr47_handler() -> t.CExport | t.CVoid:
export def isr47_handler():
if pic.isSpurious(15):
return
pic.eoi(15)
+41 -41
View File
@@ -85,7 +85,7 @@ def _fd_alloc(p: process.Process | t.CPtr) -> int:
def _fd_free(p: process.Process | t.CPtr, fd: int):
if fd >= 0 and fd < process.PROC_MAX_FDS:
p.fd_used[fd] = 0
p.fd_table[fd] = t.CVoid(0, t.CPtr)
p.fd_table[fd] = t.CPtr(0)
def _dir_alloc(p: process.Process | t.CPtr) -> int:
for i in range(process.PROC_MAX_DIRS):
@@ -97,7 +97,7 @@ def _dir_alloc(p: process.Process | t.CPtr) -> int:
def _dir_free(p: process.Process | t.CPtr, dd: int):
if dd >= 0 and dd < process.PROC_MAX_DIRS:
p.dir_used[dd] = 0
p.dir_table[dd] = t.CVoid(0, t.CPtr)
p.dir_table[dd] = t.CPtr(0)
def CREATE_WINDOW(x: int, y: int, w: int, h: int, title: t.CConst | t.CChar | t.CPtr, style: int) -> int:
desktop.set_app_pid(process.current())
@@ -116,17 +116,17 @@ def WAIT_WINDOW(win_id: int) -> int:
sched.Scheduler.try_reschedule()
return 0
def SERIAL_PUTS(str_ptr: t.CPtr) -> int:
s: t.CConst | t.CChar | t.CPtr = t.CVoid(str_ptr, t.CPtr)
def SERIAL_PUTS(str_ptr: str) -> int:
s: t.CConst | str = str_ptr
serial.puts(s)
return 0
_loaded_so_base: t.CPtr = None
_loaded_so_path: t.CArray[t.CChar, 64]
def LOAD_SO(path_ptr: t.CPtr) -> uint64:
def LOAD_SO(path_ptr: str) -> uint64:
global _loaded_so_base
path: t.CConst | t.CChar | t.CPtr = t.CVoid(path_ptr, t.CPtr)
path: t.CConst | str = path_ptr
serial.puts("[so] loading: ")
serial.puts(path)
serial.puts("\n")
@@ -141,9 +141,9 @@ def LOAD_SO(path_ptr: t.CPtr) -> uint64:
return uint64(base)
return 0
def SO_CALL1(sym_name_ptr: t.CPtr, arg1: t.CPtr) -> int:
def SO_CALL1(sym_name_ptr: str, arg1: t.CPtr) -> int:
if _loaded_so_base is None: return -1
sym_name: t.CConst | t.CChar | t.CPtr = t.CVoid(sym_name_ptr, t.CPtr)
sym_name: t.CConst | str = t.CPtr(sym_name_ptr)
fn: t.CPtr = elf.get_so_symbol(_loaded_so_base, sym_name, c.Addr(_loaded_so_path[0]))
if fn is None:
serial.puts("[so] symbol not found\n")
@@ -172,9 +172,9 @@ def SET_CURSOR(win_id: int, cursor_t: int) -> int:
desktop.set_cursor_type(win_id, cursor_t)
return 0
def OPEN(path_ptr: t.CPtr, mode: uint32) -> int:
def OPEN(path_ptr: str, mode: uint32) -> int:
p: process.Process | t.CPtr = _current_proc()
path: t.CConst | t.CChar | t.CPtr = t.CVoid(path_ptr, t.CPtr)
path: t.CConst | str = path_ptr
fat32.lock()
fp: t.CPtr = fat32.open(path, uint8(mode))
if not fp:
@@ -262,23 +262,23 @@ def fsize(fd: int) -> uint32:
fat32.unlock()
return sz
def MKDIR(path_ptr: t.CPtr) -> int:
path: t.CConst | t.CChar | t.CPtr = t.CVoid(path_ptr, t.CPtr)
def MKDIR(path_ptr: str) -> int:
path: t.CConst | str = path_ptr
fat32.lock()
r: int = int(fat32.mkdir(path))
fat32.unlock()
return r
def REMOVE(path_ptr: t.CPtr) -> int:
path: t.CConst | t.CChar | t.CPtr = t.CVoid(path_ptr, t.CPtr)
def REMOVE(path_ptr: str) -> int:
path: t.CConst | str = path_ptr
fat32.lock()
r: int = int(fat32.remove(path))
fat32.unlock()
return r
def OPENdir(path_ptr: t.CPtr) -> int:
def OPENdir(path_ptr: str) -> int:
p: process.Process | t.CPtr = _current_proc()
path: t.CConst | t.CChar | t.CPtr = t.CVoid(path_ptr, t.CPtr)
path: t.CConst | str = path_ptr
dd: int = _dir_alloc(p)
if dd < 0:
return -1
@@ -289,7 +289,7 @@ def OPENdir(path_ptr: t.CPtr) -> int:
if res != 0:
_dir_free(p, dd)
return -1
p.dir_table[dd] = t.CVoid(uint64(dp), t.CPtr)
p.dir_table[dd] = t.CPtr(uint64(dp))
return dd
def READdir(dd: int, info_ptr: t.CPtr) -> int:
@@ -318,16 +318,16 @@ def CLOSEdir(dd: int) -> int:
_dir_free(p, dd)
return 0
def STAT(path_ptr: t.CPtr, info_ptr: t.CPtr) -> int:
path: t.CConst | t.CChar | t.CPtr = t.CVoid(path_ptr, t.CPtr)
def STAT(path_ptr: str, info_ptr: t.CPtr) -> int:
path: t.CConst | str = path_ptr
info: fat32_types.fileinfo | t.CPtr = info_ptr
fat32.lock()
r: int = int(fat32.stat(path, info))
fat32.unlock()
return r
def SPAWN(path_ptr: t.CPtr, blocking: int) -> int:
path: t.CConst | t.CChar | t.CPtr = t.CVoid(path_ptr, t.CPtr)
def SPAWN(path_ptr: str, blocking: int) -> int:
path: t.CConst | str = path_ptr
pid: int = elf.spawn_elf(path)
if pid < 0:
return pid
@@ -358,28 +358,28 @@ def MMAP(size: uint64) -> uint64:
def MUNMAP(ptr: uint64, size: uint64) -> int:
return 0
def syscall_entry() -> t.CExtern | t.CVoid | t.State: pass
extern def syscall_entry(): pass
def syscall_handler(num: uint64, arg1: uint64, arg2: uint64, arg3: uint64, arg4: uint64, arg5: uint64, arg6: uint64) -> t.CExport | uint64:
n: int = int(num)
if n == CREATE_WINDOW:
title_ptr: t.CPtr = t.CVoid(arg5, t.CPtr)
title_ptr: str = str(arg5)
return uint64(CREATE_WINDOW(int(arg1), int(arg2), int(arg3), int(arg4), title_ptr, int(arg6)))
elif n == DRAW_TEXT:
text_ptr: t.CPtr = t.CVoid(arg4, t.CPtr)
text_ptr: str = str(arg4)
return uint64(DRAW_TEXT(int(arg1), int(arg2), int(arg3), text_ptr, uint32(arg5)))
elif n == EXIT:
return uint64(EXIT(int(arg1)))
elif n == OPEN:
path_ptr: t.CPtr = t.CVoid(arg1, t.CPtr)
path_ptr: str = str(arg1)
return uint64(OPEN(path_ptr, uint32(arg2)))
elif n == CLOSE:
return uint64(CLOSE(int(arg1)))
elif n == READ:
buf_ptr: t.CPtr = t.CVoid(arg2, t.CPtr)
buf_ptr: t.CPtr = t.CPtr(arg2)
return uint64(READ(int(arg1), buf_ptr, uint32(arg3)))
elif n == WRITE:
buf_ptr: t.CPtr = t.CVoid(arg2, t.CPtr)
buf_ptr: t.CPtr = t.CPtr(arg2)
return uint64(WRITE(int(arg1), buf_ptr, uint32(arg3)))
elif n == SEEK:
return uint64(SEEK(int(arg1), uint32(arg2)))
@@ -388,22 +388,22 @@ def syscall_handler(num: uint64, arg1: uint64, arg2: uint64, arg3: uint64, arg4:
elif n == SIZE:
return uint64(fsize(int(arg1)))
elif n == MKDIR:
path_ptr: t.CPtr = t.CVoid(arg1, t.CPtr)
path_ptr: str = str(arg1)
return uint64(MKDIR(path_ptr))
elif n == REMOVE:
path_ptr: t.CPtr = t.CVoid(arg1, t.CPtr)
path_ptr: str = str(arg1)
return uint64(REMOVE(path_ptr))
elif n == OPENDIR:
path_ptr: t.CPtr = t.CVoid(arg1, t.CPtr)
path_ptr: str = str(arg1)
return uint64(OPENdir(path_ptr))
elif n == READDIR:
info_ptr: t.CPtr = t.CVoid(arg2, t.CPtr)
info_ptr: t.CPtr = t.CPtr(arg2)
return uint64(READdir(int(arg1), info_ptr))
elif n == CLOSEDIR:
return uint64(CLOSEdir(int(arg1)))
elif n == STAT:
path_ptr: t.CPtr = t.CVoid(arg1, t.CPtr)
info_ptr: t.CPtr = t.CVoid(arg2, t.CPtr)
path_ptr: str = str(arg1)
info_ptr: t.CPtr = t.CPtr(arg2)
return uint64(STAT(path_ptr, info_ptr))
elif n == WAIT_WINDOW:
if int(arg2) == 1:
@@ -413,20 +413,20 @@ def syscall_handler(num: uint64, arg1: uint64, arg2: uint64, arg3: uint64, arg4:
return 0
return uint64(WAIT_WINDOW(int(arg1)))
elif n == SERIAL_PUTS:
str_ptr_sp: t.CPtr = t.CVoid(arg1, t.CPtr)
str_ptr_sp: str = str(arg1)
return uint64(SERIAL_PUTS(str_ptr_sp))
elif n == LOAD_SO:
path_ptr_so: t.CPtr = t.CVoid(arg1, t.CPtr)
path_ptr_so: t.CPtr = t.CPtr(arg1)
return LOAD_SO(path_ptr_so)
elif n == SO_CALL1:
sym_ptr: t.CPtr = t.CVoid(arg1, t.CPtr)
sym_ptr: t.CPtr = t.CPtr(arg1)
return uint64(SO_CALL1(sym_ptr, t.CPtr(arg2)))
elif n == GET_WINBUF:
return GET_WINBUF(int(arg1))
elif n == WIN_FLUSH:
return uint64(WIN_FLUSH(int(arg1)))
elif n == POLL_EVENT:
buf_ptr_ev: t.CPtr = t.CVoid(arg1, t.CPtr)
buf_ptr_ev: t.CPtr = t.CPtr(arg1)
caller_pid_ev: int = process.current()
return uint64(desktop.poll_event(buf_ptr_ev, caller_pid_ev))
elif n == SET_CURSOR:
@@ -436,7 +436,7 @@ def syscall_handler(num: uint64, arg1: uint64, arg2: uint64, arg3: uint64, arg4:
sched.Scheduler.try_reschedule()
return 0
elif n == SET_TITLE:
title_ptr_st: t.CPtr = t.CVoid(arg2, t.CPtr)
title_ptr_st: t.CPtr = t.CPtr(arg2)
return uint64(desktop.set_title(int(arg1), title_ptr_st))
elif n == SET_GEOMETRY:
return uint64(desktop.set_geometry(int(arg1), int(arg2), int(arg3), int(arg4), int(arg5)))
@@ -445,15 +445,15 @@ def syscall_handler(num: uint64, arg1: uint64, arg2: uint64, arg3: uint64, arg4:
elif n == GET_WIN_SIZE:
return uint64(desktop.get_size(int(arg1)))
elif n == SPAWN:
path_ptr_sp: t.CPtr = t.CVoid(arg1, t.CPtr)
path_ptr_sp: t.CPtr = t.CPtr(arg1)
return uint64(SPAWN(path_ptr_sp, int(arg2)))
elif n == MMAP:
return MMAP(arg1)
elif n == MUNMAP:
return uint64(MUNMAP(arg1, arg2))
elif n == THREAD_CREATE:
func_ptr: t.CPtr = t.CVoid(arg1, t.CPtr)
arg_ptr: t.CPtr = t.CVoid(arg2, t.CPtr)
func_ptr: t.CPtr = t.CPtr(arg1)
arg_ptr: t.CPtr = t.CPtr(arg2)
cur_pid: int = process.current()
th: sched.Thread | t.CPtr = sched.Scheduler.create_thread(func_ptr, arg_ptr, cur_pid)
if th is None: return uint64(0xFFFFFFFFFFFFFFFF)
+19 -19
View File
@@ -103,7 +103,7 @@ class _BuddySystemObject:
self.buddy.used_memory = 0
self.buddy.free_memory = size
self.buddy.start_addr = start_addr
self.buddy.end_addr = t.CVoid(uint64(start_addr) + size, t.CPtr)
self.buddy.end_addr = t.CPtr(uint64(start_addr) + size)
remaining: uint64 = size
cur_addr: uint64 = uint64(start_addr)
# [DBG] buddy 初始化循环进度(用后移除)
@@ -254,7 +254,7 @@ class _BuddySystemObject:
return block
# 释放内存块
def free_block(self, block: memory_block | t.CPtr) -> t.CStatic | t.CVoid:
def free_block(self, block: memory_block | t.CPtr):
# 标记块为空闲
block.state = BLOCK_FREE
# 更新内存统计
@@ -345,13 +345,13 @@ class _SlabAllocator:
page.next = None
page.prev = None
data_start: uint64 = uint64(block) + d_off
page.free_head = t.CVoid(data_start, t.CPtr)
page.free_head = t.CPtr(data_start)
for i in range(1, total):
cur: t.CPtr = t.CVoid(data_start + uint64(i - 1) * aligned_size, t.CPtr)
nxt: t.CPtr = t.CVoid(data_start + uint64(i) * aligned_size, t.CPtr)
cur: t.CPtr = t.CPtr(data_start + uint64(i - 1) * aligned_size)
nxt: t.CPtr = t.CPtr(data_start + uint64(i) * aligned_size)
_slab_write_ptr(cur, nxt)
last: t.CPtr = t.CVoid(data_start + uint64(total - 1) * aligned_size, t.CPtr)
_slab_write_ptr(last, t.CVoid(0, t.CPtr))
last: t.CPtr = t.CPtr(data_start + uint64(total - 1) * aligned_size)
_slab_write_ptr(last, t.CPtr(0))
return page
def alloc(self, size_class: int) -> t.CPtr:
@@ -413,18 +413,18 @@ def malloc(size: uint64) -> t.CPtr | t.CExport:
user_ptr: uint64 = (uint64(block) + hdr + 4095) & ~uint64(4095)
real_hdr: uint64 = user_ptr - 8
c.Asm(f"""mov rax, {c.AsmInp(block, t.ASM_DESCR.REG_ANY)}
mov [{c.AsmInp(t.CVoid(real_hdr, t.CPtr), t.ASM_DESCR.REG_ANY)}], rax""",
mov [{c.AsmInp(t.CPtr(real_hdr), t.ASM_DESCR.REG_ANY)}], rax""",
op=[t.ASM_DESCR.CLOBBER_RAX, t.ASM_DESCR.CLOBBER_MEMORY])
viperlib.snprintf(c.Addr(_dbm), 120, "[mm] malloc ret user_ptr=0x%lx\n", user_ptr)
serial.puts(_dbm)
return t.CVoid(user_ptr, t.CPtr)
return t.CPtr(user_ptr)
total2: uint64 = size + hdr
total2 = align_4k(total2)
order2: int = get_order(total2)
if order2 > MAX_ORDER: return None
block2: memory_block | t.CPtr = BuddySystemObject.allocate_block(total2)
if not block2: return None
return t.CVoid(uint64(block2) + hdr, t.CPtr)
return t.CPtr(uint64(block2) + hdr)
def malloc_direct(size: uint64) -> t.CPtr | t.CExport:
@@ -436,7 +436,7 @@ def malloc_direct(size: uint64) -> t.CPtr | t.CExport:
if order > MAX_ORDER: return None
block: memory_block | t.CPtr = BuddySystemObject.allocate_block(total)
if not block: return None
return t.CVoid(uint64(block) + hdr, t.CPtr)
return t.CPtr(uint64(block) + hdr)
def free(ptr: t.CPtr) -> t.CExport:
@@ -448,7 +448,7 @@ def free(ptr: t.CPtr) -> t.CExport:
if (uint64(ptr) & 0xFFF) == 0:
real_hdr: uint64 = uint64(ptr) - 8
block: memory_block | t.CPtr
c.Asm(f"""mov rax, [{c.AsmInp(t.CVoid(real_hdr, t.CPtr), t.ASM_DESCR.REG_ANY)}]
c.Asm(f"""mov rax, [{c.AsmInp(t.CPtr(real_hdr), t.ASM_DESCR.REG_ANY)}]
mov {c.AsmOut(block, t.ASM_DESCR.OUTPUT_REG)}, rax""",
op=[t.ASM_DESCR.CLOBBER_MEMORY, t.ASM_DESCR.CLOBBER_RAX])
BuddySystemObject.free_block(block)
@@ -476,7 +476,7 @@ def realloc(ptr: t.CPtr, size: uint64) -> t.CPtr | t.CExport:
elif (uint64(ptr) & 0xFFF) == 0:
real_hdr_r: uint64 = uint64(ptr) - 8
block_r: memory_block | t.CPtr
c.Asm(f"""mov rax, [{c.AsmInp(t.CVoid(real_hdr_r, t.CPtr), t.ASM_DESCR.REG_ANY)}]
c.Asm(f"""mov rax, [{c.AsmInp(t.CPtr(real_hdr_r), t.ASM_DESCR.REG_ANY)}]
mov {c.AsmOut(block_r, t.ASM_DESCR.OUTPUT_REG)}, rax""",
op=[t.ASM_DESCR.CLOBBER_MEMORY, t.ASM_DESCR.CLOBBER_RAX])
old_size = block_r.size - 4096
@@ -490,7 +490,7 @@ def realloc(ptr: t.CPtr, size: uint64) -> t.CPtr | t.CExport:
# 回收内存区域链表
def free_memory_regions() -> t.CStatic | t.CVoid:
def free_memory_regions():
global memory_regions
current: memory_region | t.CPtr = memory_regions
while current:
@@ -530,13 +530,13 @@ def init(MemmapAddr: uint64, MemmapSize: uint64, MemmapDescSize: uint64, FbAddr:
i: uint64
# [DBG] 转储全部 memmap 描述符,定位 4GB 伪可用区的来源(用后移除)
for i in range(num_entries):
entry: bootinfo.memory_map_entry | t.CPtr = t.CVoid(MemmapAddr + i * MemmapDescSize, t.CPtr)
entry: bootinfo.memory_map_entry | t.CPtr = t.CPtr(MemmapAddr + i * MemmapDescSize)
_dbgd: t.CArray[t.CChar, 100]
viperlib.snprintf(c.Addr(_dbgd), 100, "[mm] d[%lu] t=%lu start=0x%lx np=%lu\n",
i, uint64(entry.type), entry.physical_start, entry.num_pages)
serial.puts(c.Addr(_dbgd))
for i in range(num_entries):
entry: bootinfo.memory_map_entry | t.CPtr = t.CVoid(MemmapAddr + i * MemmapDescSize, t.CPtr)
entry: bootinfo.memory_map_entry | t.CPtr = t.CPtr(MemmapAddr + i * MemmapDescSize)
etype: uint64 = entry.type
start: uint64 = align_4k(entry.physical_start)
np: uint64 = entry.num_pages
@@ -576,7 +576,7 @@ def init(MemmapAddr: uint64, MemmapSize: uint64, MemmapDescSize: uint64, FbAddr:
serial.puts(cr4)
if best_start != 0:
if max_memory >= min_blk:
start_addr = t.CVoid(best_start, t.CPtr)
start_addr = t.CPtr(best_start)
size = max_memory
if start_addr is None:
# [DBG] fallback:打印 detect_memory_size 与 CMOS 原始值(用后移除)
@@ -591,7 +591,7 @@ def init(MemmapAddr: uint64, MemmapSize: uint64, MemmapDescSize: uint64, FbAddr:
size = align_4k(size)
# 起始地址 4MB(内核之后),避免超出物理 RAM
# 旧值 0x10000000 在 256MB QEMU 中超出物理 RAM 边界
start_addr = t.CVoid(align_4k(0x400000), t.CPtr)
start_addr = t.CPtr(align_4k(0x400000))
if size > 0x400000:
size = size - 0x400000
size = align_4k(size)
@@ -752,7 +752,7 @@ def vm_free(VirtAddr: uint64):
paging.UnMapPage(page_virt)
# 释放物理内存
free(t.CVoid(current.PhysAddr, t.CPtr))
free(t.CPtr(current.PhysAddr))
if prev:
prev.next = current.next
else:
+2 -2
View File
@@ -63,7 +63,7 @@ def AllocPage() -> t.CPtr:
global AllocatedPages, pt_pool_used, pml4, pdp, pd, pt
if pt_pool_raw is None: return None
if pt_pool_used >= uint64(PT_POOL_PAGES): return None
page: t.CPtr = t.CVoid(pt_pool_start + pt_pool_used * uint64(4096), t.CPtr)
page: t.CPtr = t.CPtr(pt_pool_start + pt_pool_used * uint64(4096))
pt_pool_used = pt_pool_used + uint64(1)
# rep stosb 向 [rdi] 写 4096 字节:必须声明 CLOBBER_MEMORY,否则优化器
# 无法得知本块改写了内存,可能把其前后的内存读写重排/消除(N8)。
@@ -139,7 +139,7 @@ def MapPage(VirtAddr: uint64, PhysAddr: uint64, flags: uint64):
pt.entries[PtIndex] = PhysAddr | flags | PTE_PRESENT
c.Asm(f"invlpg [{c.AsmInp(VirtAddr, t.ASM_DESCR.REG_ANY)}]")
def MapLargePage(VirtAddr: uint64, PhysAddr: uint64, flags: uint64) -> t.CVoid:
def MapLargePage(VirtAddr: uint64, PhysAddr: uint64, flags: uint64):
global pml4, pdp, pd, pt
VirtAddr = VirtAddr & ~uint64(0x1FFFFF)
PhysAddr = PhysAddr & ~uint64(0x1FFFFF)
+6 -6
View File
@@ -55,14 +55,14 @@ class Process:
if fp:
fat32.close(fp)
self.fd_used[i] = 0
self.fd_table[i] = t.CVoid(0, t.CPtr)
self.fd_table[i] = None
for i in range(PROC_MAX_DIRS):
if self.dir_used[i]:
dp: t.CPtr = self.dir_table[i]
if dp:
fat32.closedir(dp)
self.dir_used[i] = 0
self.dir_table[i] = t.CVoid(0, t.CPtr)
self.dir_table[i] = None
m: ProcessManager | t.CPtr = _proc_mgr_ptr
if m.current_pid == self.pid:
m.current_pid = 0
@@ -120,10 +120,10 @@ class ProcessManager:
p.threads[j] = -1
for j in range(PROC_MAX_FDS):
p.fd_used[j] = 0
p.fd_table[j] = t.CVoid(0, t.CPtr)
p.fd_table[j] = None
for j in range(PROC_MAX_DIRS):
p.dir_used[j] = 0
p.dir_table[j] = t.CVoid(0, t.CPtr)
p.dir_table[j] = None
c.Asm(f"""mov {c.AsmOut(p.pml4_root, t.ASM_DESCR.OUTPUT_REG)}, cr3""",
op=[t.ASM_DESCR.CLOBBER_MEMORY])
@@ -186,10 +186,10 @@ class ProcessManager:
p.threads[j] = -1
for j in range(PROC_MAX_FDS):
p.fd_used[j] = 0
p.fd_table[j] = t.CVoid(0, t.CPtr)
p.fd_table[j] = None
for j in range(PROC_MAX_DIRS):
p.dir_used[j] = 0
p.dir_table[j] = t.CVoid(0, t.CPtr)
p.dir_table[j] = None
ks: t.CPtr = mm.malloc(KERN_STACK_SIZE)
# [DIAG] 定位跨模块 malloc 返回值(mm 成功但调用方收到 None)
_dbg_ks: t.CArray[t.CChar, 64]
+12 -12
View File
@@ -452,7 +452,7 @@ def _fill_rect(buf: UINT32PTR, bw: int, bh: int, rx: int, ry: int, rw: int, rh:
_row_buf[i] = color
row_bytes: int = rw * 4
for py in range(ry, ry + rh):
string.memcpy(t.CVoid(uint64(buf) + (py * bw + rx) * 4, t.CPtr), _row_buf, row_bytes)
string.memcpy(t.CPtr(uint64(buf) + (py * bw + rx) * 4), _row_buf, row_bytes)
def _alpha_blend(bg: uint32, fg: uint32, alpha: int) -> uint32:
a: int = alpha
@@ -1310,7 +1310,7 @@ def _render():
py_bg: int = _dirty_y_min
while py_bg <= _dirty_y_max:
if _dirty_rows[py_bg]:
string.memcpy(t.CVoid(uint64(back) + py_bg * row_bytes, t.CPtr), _bg_row_buf, row_bytes)
string.memcpy(t.CPtr(uint64(back) + py_bg * row_bytes), _bg_row_buf, row_bytes)
py_bg += 1
t1: uint64 = timer.timer_get_ticks()
_perf_t_bg += (t1 - t0)
@@ -1353,7 +1353,7 @@ def _render():
while py_fb <= _dirty_y_max and _dirty_rows[py_fb]:
py_fb += 1
run_bytes: int = (py_fb - run_start) * row_bytes
string.memcpy(t.CVoid(uint64(_fb) + run_start * pitch, t.CPtr), t.CVoid(uint64(back) + run_start * row_bytes, t.CPtr), run_bytes)
string.memcpy(t.CPtr(uint64(_fb) + run_start * pitch), t.CPtr(uint64(back) + run_start * row_bytes), run_bytes)
else:
py_fb += 1
t5: uint64 = timer.timer_get_ticks()
@@ -2375,7 +2375,7 @@ def _draw_app_window(back: UINT32PTR, win: AppWindow | t.CPtr):
fb_stride: int = win.fb_w
fbh: int = win.fb_h
if fb_stride <= 0 or fbh <= 0:
win_fb = t.CVoid(0, t.CPtr)
win_fb = None
if win_fb:
draw_rows: int = ch
if draw_rows > fbh: draw_rows = fbh
@@ -2402,7 +2402,7 @@ def _draw_app_window(back: UINT32PTR, win: AppWindow | t.CPtr):
if actual_w <= 0: continue
src_off: int = row * fb_stride + src_x
if src_off + actual_w > fb_total: continue
string.memcpy(t.CVoid(uint64(back) + (dst_y * w + dst_x) * 4, t.CPtr), t.CVoid(uint64(win_fb) + src_off * 4, t.CPtr), actual_w * 4)
string.memcpy(t.CPtr(uint64(back) + (dst_y * w + dst_x) * 4), t.CPtr(uint64(win_fb) + src_off * 4), actual_w * 4)
else:
copy_w: int = fb_stride - 1
if copy_w > ww - 1: copy_w = ww - 1
@@ -2438,7 +2438,7 @@ def _draw_app_window(back: UINT32PTR, win: AppWindow | t.CPtr):
if actual_w2 <= 0: continue
src_off2: int = row * fb_stride + src_x2
if src_off2 + actual_w2 > fb_total: continue
string.memcpy(t.CVoid(uint64(back) + (dst_y * w + dst_x3) * 4, t.CPtr), t.CVoid(uint64(win_fb) + src_off2 * 4, t.CPtr), actual_w2 * 4)
string.memcpy(t.CPtr(uint64(back) + (dst_y * w + dst_x3) * 4), t.CPtr(uint64(win_fb) + src_off2 * 4), actual_w2 * 4)
btn_w: int = CLOSE_BTN_SIZE
btn_h: int = CLOSE_BTN_SIZE
@@ -2508,7 +2508,7 @@ def create(x: int, y: int, w: int, h: int, title: t.CConst | t.CChar | t.CPtr, s
aw.app_cursor_type = 0
aw.fb_w = 0
aw.fb_h = 0
aw.old_fb = t.CVoid(0, t.CPtr)
aw.old_fb = None
aw.ping_pending = 0
aw.no_resp = 0
aw.no_resp_sec = 0
@@ -2557,12 +2557,12 @@ def is_active(win_id: int) -> int:
return _wins[win_id].active
def get_fb(win_id: int) -> UINT32PTR:
if win_id < 0 or win_id >= _win_count: return t.CVoid(0, t.CPtr)
if win_id < 0 or win_id >= _win_count: return None
aw: AppWindow | t.CPtr = c.Addr(_wins[win_id])
if not aw.active: return t.CVoid(0, t.CPtr)
if not aw.active: return None
if aw.old_fb:
mm.free(aw.old_fb)
aw.old_fb = t.CVoid(0, t.CPtr)
aw.old_fb = None
if aw.resize_w != 0 and (aw.fb_w != aw.resize_w or aw.fb_h != aw.resize_h):
target_w: int = aw.resize_w
target_h: int = aw.resize_h
@@ -2595,7 +2595,7 @@ def get_fb(win_id: int) -> UINT32PTR:
for ri_gf in range(cph_gf):
rb_gf: int = old_fbw_gf
if rb_gf > target_w: rb_gf = target_w
string.memcpy(t.CVoid(uint64(aw.fb) + ri_gf * target_w * 4, t.CPtr), t.CVoid(uint64(old_fb_gf) + ri_gf * old_fbw_gf * 4, t.CPtr), rb_gf * 4)
string.memcpy(t.CPtr(uint64(aw.fb) + ri_gf * target_w * 4), t.CPtr(uint64(old_fb_gf) + ri_gf * old_fbw_gf * 4), rb_gf * 4)
if aw.old_fb:
mm.free(aw.old_fb)
aw.old_fb = old_fb_gf
@@ -2674,7 +2674,7 @@ def flush(win_id: int):
if not aw.active: return
if aw.old_fb:
mm.free(aw.old_fb)
aw.old_fb = t.CVoid(0, t.CPtr)
aw.old_fb = None
if aw.ping_pending:
aw.ping_pending = 0
if aw.no_resp:
+2 -2
View File
@@ -1,10 +1,10 @@
import t, c
from . import syscall as syscall
def exit(code: int) -> t.CVoid:
def exit(code: int):
syscall._syscall1(uint64(syscall.EXIT), uint64(code))
def yield_cpu() -> t.CVoid:
def yield_cpu():
syscall._syscall2(uint64(syscall.WAIT_WINDOW), uint64(0), uint64(2))
def spawn(path: t.CConst | t.CChar | t.CPtr, blocking: int = 0) -> int:
+3 -3
View File
@@ -10,7 +10,7 @@ import viperlib
# syscall 输出到串口;exit 走 EXIT syscall 通知内核销毁本进程窗口。
# ============================================================
def printf(fmt: t.CConst | str, *args) -> int | t.CExport:
export def printf(fmt: t.CConst | str, *args) -> int:
"""格式化输出到串口(SERIAL_PUTS syscall),返回输出字节数"""
if fmt is None:
return 0
@@ -19,12 +19,12 @@ def printf(fmt: t.CConst | str, *args) -> int | t.CExport:
_syscall._syscall1(uint64(_syscall.SERIAL_PUTS), uint64(c.Addr(buf)))
return n
def exit(status: int) -> t.CVoid | t.CExport:
export def exit(status: int):
"""终止当前进程(EXIT syscall:销毁本进程窗口)"""
_syscall._syscall1(uint64(_syscall.EXIT), uint64(status))
def fflush(stream: t.CConst | t.CPtr) -> int | t.CExport:
export def fflush(stream: t.CConst | t.CPtr) -> int:
"""刷新输出流:串口/控制台输出都是直写,无缓冲可刷,空操作返回 0
覆盖 libc fflush 的裸机缺失(includes/memhub.vp 的诊断/终止路径 call @fflush);
+4 -4
View File
@@ -24,15 +24,15 @@ def malloc(size: t.CSizeT) -> t.CPtr | t.CExport:
total: t.CSizeT = hdr_size + size
ptr: uint64 = _sc._syscall1(uint64(_sc.SYSCALL_MMAP), uint64(total))
if ptr == 0: return None
hdr: _heap_hdr | t.CPtr = t.CVoid(ptr, t.CPtr)
hdr: _heap_hdr | t.CPtr = t.CPtr(ptr)
hdr.magic = HEAP_BLOCK_MAGIC
hdr.size = uint32(size)
return t.CVoid(ptr + hdr_size, t.CPtr)
return t.CPtr(ptr + hdr_size)
def free(ptr: t.CPtr) -> t.CExport:
if ptr is None: return
hdr_size: t.CSizeT = _heap_hdr.__sizeof__()
hdr: _heap_hdr | t.CPtr = t.CVoid(uint64(ptr) - hdr_size, t.CPtr)
hdr: _heap_hdr | t.CPtr = t.CPtr(uint64(ptr) - hdr_size)
if hdr.magic != HEAP_BLOCK_MAGIC: return
def calloc(nmemb: t.CSizeT, size: t.CSizeT) -> t.CPtr | t.CExport:
@@ -48,7 +48,7 @@ def realloc(ptr: t.CPtr, size: t.CSizeT) -> t.CPtr | t.CExport:
free(ptr)
return None
hdr_size: t.CSizeT = _heap_hdr.__sizeof__()
hdr: _heap_hdr | t.CPtr = t.CVoid(uint64(ptr) - hdr_size, t.CPtr)
hdr: _heap_hdr | t.CPtr = t.CPtr(uint64(ptr) - hdr_size)
if hdr.magic != HEAP_BLOCK_MAGIC: return None
old_size: t.CSizeT = hdr.size
new_ptr: t.CPtr = malloc(size)
+2 -2
View File
@@ -54,10 +54,10 @@ _g_layout_init: int
_hex_tbl: t.CArray[t.CChar, 17] = "0123456789ABCDEF"
_hex_buf: t.CArray[t.CChar, 20] = "0000000000000000000"
def _serial_puts(s: t.CConst | t.CChar | t.CPtr) -> t.CVoid:
def _serial_puts(s: t.CConst | t.CChar | t.CPtr):
_syscall._syscall1(uint64(_syscall.SERIAL_PUTS), uint64(s))
def _ptr_to_hex(val: uint64, buf: t.CPtr) -> t.CVoid:
def _ptr_to_hex(val: uint64, buf: t.CPtr):
buf[0] = 48
buf[1] = 120
i: int = 15
+5 -5
View File
@@ -57,15 +57,15 @@ def draw_text(win_id: int, x: int, y: int, text: t.CConst | t.CChar | t.CPtr, co
return int(syscall._syscall5(uint64(syscall.DRAW_TEXT), uint64(win_id), uint64(x), uint64(y), uint64(text), uint64(color)))
def get_winbuf(win_id: int) -> UINT32PTR:
return t.CVoid(syscall._syscall2(uint64(syscall.GET_WINBUF), uint64(win_id), 0), t.CPtr)
return t.CPtr(syscall._syscall2(uint64(syscall.GET_WINBUF), uint64(win_id), 0))
def get_win_size(win_id: int) -> int:
return int(syscall._syscall2(uint64(syscall.GET_WIN_SIZE), uint64(win_id), 0))
def flush(win_id: int) -> t.CVoid:
def flush(win_id: int):
syscall._syscall2(uint64(syscall.WIN_FLUSH), uint64(win_id), 0)
def mainloop(win_id: int) -> t.CVoid:
def mainloop(win_id: int):
syscall._syscall1(uint64(syscall.WAIT_WINDOW), uint64(win_id))
def poll_event(evt: InputEvent | t.CPtr) -> int:
@@ -74,10 +74,10 @@ def poll_event(evt: InputEvent | t.CPtr) -> int:
def is_active(win_id: int) -> int:
return int(syscall._syscall2(uint64(syscall.WAIT_WINDOW), uint64(win_id), 1))
def set_cursor_type(win_id: int, cursor_t: int) -> t.CVoid:
def set_cursor_type(win_id: int, cursor_t: int):
syscall._syscall2(uint64(syscall.SET_CURSOR), uint64(win_id), uint64(cursor_t))
def set_title(win_id: int, title: t.CConst | t.CChar | t.CPtr) -> int:
def set_title(win_id: int, title: t.CConst | str) -> int:
return int(syscall._syscall2(uint64(syscall.SET_TITLE), uint64(win_id), uint64(title)))
def set_geometry(win_id: int, x: int, y: int, w: int, h: int) -> int: