将 .py 和 .pyi 后缀名改为了 .vp 和 .vpi 后缀名
This commit is contained in:
@@ -1,31 +1,30 @@
|
|||||||
{
|
{
|
||||||
"name": "Gargantua",
|
"name": "Gargantua",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"source_dir": "./",
|
"source_dir": "./",
|
||||||
"temp_dir": "./temp",
|
"build_dir": "./.tpv_build",
|
||||||
"output_dir": "./output",
|
"compiler": {
|
||||||
"compiler": {
|
"cmd": "llc",
|
||||||
"cmd": "llc",
|
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=static", "-O2"]
|
||||||
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=static", "-O2"]
|
},
|
||||||
},
|
"linker": {
|
||||||
"linker": {
|
"cmd": "ld.lld.exe",
|
||||||
"cmd": "ld.lld.exe",
|
"flags": [
|
||||||
"flags": [
|
"-m", "elf_x86_64",
|
||||||
"-m", "elf_x86_64",
|
"-T", "linker.ld",
|
||||||
"-T", "linker.ld",
|
"--oformat", "elf64-x86-64",
|
||||||
"--oformat", "elf64-x86-64",
|
"--strip-all"
|
||||||
"--strip-all"
|
],
|
||||||
],
|
"output": "gargantua.elf"
|
||||||
"output": "gargantua.elf"
|
},
|
||||||
},
|
"includes": ["../.."],
|
||||||
"includes": ["../.."],
|
"target": {
|
||||||
"target": {
|
"triple": "x86_64-none-elf",
|
||||||
"triple": "x86_64-none-elf",
|
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
},
|
||||||
},
|
"options": {
|
||||||
"options": {
|
"slice_level": 3,
|
||||||
"slice_level": 3,
|
"target": "llvm",
|
||||||
"target": "llvm",
|
"strict_mode": true
|
||||||
"strict_mode": true
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,31 +1,30 @@
|
|||||||
{
|
{
|
||||||
"name": "HelloWorld",
|
"name": "HelloWorld",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"source_dir": "./",
|
"source_dir": "./",
|
||||||
"temp_dir": "./temp",
|
"build_dir": "./.tpv_build",
|
||||||
"output_dir": "./output",
|
"compiler": {
|
||||||
"compiler": {
|
"cmd": "llc",
|
||||||
"cmd": "llc",
|
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=static", "-O2"]
|
||||||
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=static", "-O2"]
|
},
|
||||||
},
|
"linker": {
|
||||||
"linker": {
|
"cmd": "ld.lld.exe",
|
||||||
"cmd": "ld.lld.exe",
|
"flags": [
|
||||||
"flags": [
|
"-m", "elf_x86_64",
|
||||||
"-m", "elf_x86_64",
|
"-T", "linker.ld",
|
||||||
"-T", "linker.ld",
|
"--oformat", "elf64-x86-64",
|
||||||
"--oformat", "elf64-x86-64",
|
"--strip-all"
|
||||||
"--strip-all"
|
],
|
||||||
],
|
"output": "helloworld.elf"
|
||||||
"output": "helloworld.elf"
|
},
|
||||||
},
|
"includes": ["../.."],
|
||||||
"includes": ["../.."],
|
"target": {
|
||||||
"target": {
|
"triple": "x86_64-none-elf",
|
||||||
"triple": "x86_64-none-elf",
|
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
},
|
||||||
},
|
"options": {
|
||||||
"options": {
|
"slice_level": 3,
|
||||||
"slice_level": 3,
|
"target": "llvm",
|
||||||
"target": "llvm",
|
"strict_mode": true
|
||||||
"strict_mode": true
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,31 +1,30 @@
|
|||||||
{
|
{
|
||||||
"name": "Scene3D",
|
"name": "Scene3D",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"source_dir": "./",
|
"source_dir": "./",
|
||||||
"temp_dir": "./temp",
|
"build_dir": "./.tpv_build",
|
||||||
"output_dir": "./output",
|
"compiler": {
|
||||||
"compiler": {
|
"cmd": "llc",
|
||||||
"cmd": "llc",
|
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=static", "-O2"]
|
||||||
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=static", "-O2"]
|
},
|
||||||
},
|
"linker": {
|
||||||
"linker": {
|
"cmd": "ld.lld.exe",
|
||||||
"cmd": "ld.lld.exe",
|
"flags": [
|
||||||
"flags": [
|
"-m", "elf_x86_64",
|
||||||
"-m", "elf_x86_64",
|
"-T", "linker.ld",
|
||||||
"-T", "linker.ld",
|
"--oformat", "elf64-x86-64",
|
||||||
"--oformat", "elf64-x86-64",
|
"--strip-all"
|
||||||
"--strip-all"
|
],
|
||||||
],
|
"output": "scene3d.elf"
|
||||||
"output": "scene3d.elf"
|
},
|
||||||
},
|
"includes": ["../.."],
|
||||||
"includes": ["../.."],
|
"target": {
|
||||||
"target": {
|
"triple": "x86_64-none-elf",
|
||||||
"triple": "x86_64-none-elf",
|
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
},
|
||||||
},
|
"options": {
|
||||||
"options": {
|
"slice_level": 3,
|
||||||
"slice_level": 3,
|
"target": "llvm",
|
||||||
"target": "llvm",
|
"strict_mode": true
|
||||||
"strict_mode": true
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,31 +1,30 @@
|
|||||||
{
|
{
|
||||||
"name": "Terminal",
|
"name": "Terminal",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"source_dir": "./",
|
"source_dir": "./",
|
||||||
"temp_dir": "./temp",
|
"build_dir": "./.tpv_build",
|
||||||
"output_dir": "./output",
|
"compiler": {
|
||||||
"compiler": {
|
"cmd": "llc",
|
||||||
"cmd": "llc",
|
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=static", "-O2"]
|
||||||
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=static", "-O2"]
|
},
|
||||||
},
|
"linker": {
|
||||||
"linker": {
|
"cmd": "ld.lld.exe",
|
||||||
"cmd": "ld.lld.exe",
|
"flags": [
|
||||||
"flags": [
|
"-m", "elf_x86_64",
|
||||||
"-m", "elf_x86_64",
|
"-T", "linker.ld",
|
||||||
"-T", "linker.ld",
|
"--oformat", "elf64-x86-64",
|
||||||
"--oformat", "elf64-x86-64",
|
"--strip-all"
|
||||||
"--strip-all"
|
],
|
||||||
],
|
"output": "terminal.elf"
|
||||||
"output": "terminal.elf"
|
},
|
||||||
},
|
"includes": ["../.."],
|
||||||
"includes": ["../.."],
|
"target": {
|
||||||
"target": {
|
"triple": "x86_64-none-elf",
|
||||||
"triple": "x86_64-none-elf",
|
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
},
|
||||||
},
|
"options": {
|
||||||
"options": {
|
"slice_level": 3,
|
||||||
"slice_level": 3,
|
"target": "llvm",
|
||||||
"target": "llvm",
|
"strict_mode": true
|
||||||
"strict_mode": true
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,34 +1,33 @@
|
|||||||
{
|
{
|
||||||
"name": "SerialLogger",
|
"name": "SerialLogger",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"source_dir": "./",
|
"source_dir": "./",
|
||||||
"temp_dir": "./temp",
|
"build_dir": "./.tpv_build",
|
||||||
"output_dir": "./output",
|
"compiler": {
|
||||||
"compiler": {
|
"cmd": "llc",
|
||||||
"cmd": "llc",
|
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=pic", "-O2"]
|
||||||
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=pic", "-O2"]
|
},
|
||||||
},
|
"linker": {
|
||||||
"linker": {
|
"cmd": "ld.lld.exe",
|
||||||
"cmd": "ld.lld.exe",
|
"flags": [
|
||||||
"flags": [
|
"-m", "elf_x86_64",
|
||||||
"-m", "elf_x86_64",
|
"-T", "linker.ld",
|
||||||
"-T", "linker.ld",
|
"--oformat", "elf64-x86-64",
|
||||||
"--oformat", "elf64-x86-64",
|
"-shared",
|
||||||
"-shared",
|
"-z", "notext",
|
||||||
"-z", "notext",
|
"--no-relax",
|
||||||
"--no-relax",
|
"--strip-all"
|
||||||
"--strip-all"
|
],
|
||||||
],
|
"output": "slog.so"
|
||||||
"output": "slog.so"
|
},
|
||||||
},
|
"includes": ["../.."],
|
||||||
"includes": ["../.."],
|
"target": {
|
||||||
"target": {
|
"triple": "x86_64-none-elf",
|
||||||
"triple": "x86_64-none-elf",
|
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
},
|
||||||
},
|
"options": {
|
||||||
"options": {
|
"slice_level": 3,
|
||||||
"slice_level": 3,
|
"target": "llvm",
|
||||||
"target": "llvm",
|
"strict_mode": true
|
||||||
"strict_mode": true
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,34 +1,33 @@
|
|||||||
{
|
{
|
||||||
"name": "VPUI64",
|
"name": "VPUI64",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"source_dir": "./",
|
"source_dir": "./",
|
||||||
"temp_dir": "./temp",
|
"build_dir": "./.tpv_build",
|
||||||
"output_dir": "./output",
|
"compiler": {
|
||||||
"compiler": {
|
"cmd": "llc",
|
||||||
"cmd": "llc",
|
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=pic", "-O2"]
|
||||||
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=pic", "-O2"]
|
},
|
||||||
},
|
"linker": {
|
||||||
"linker": {
|
"cmd": "ld.lld.exe",
|
||||||
"cmd": "ld.lld.exe",
|
"flags": [
|
||||||
"flags": [
|
"-m", "elf_x86_64",
|
||||||
"-m", "elf_x86_64",
|
"-T", "linker.ld",
|
||||||
"-T", "linker.ld",
|
"--oformat", "elf64-x86-64",
|
||||||
"--oformat", "elf64-x86-64",
|
"-shared",
|
||||||
"-shared",
|
"-z", "notext",
|
||||||
"-z", "notext",
|
"--no-relax",
|
||||||
"--no-relax",
|
"--strip-all"
|
||||||
"--strip-all"
|
],
|
||||||
],
|
"output": "vpui64.so"
|
||||||
"output": "vpui64.so"
|
},
|
||||||
},
|
"includes": ["../.."],
|
||||||
"includes": ["../.."],
|
"target": {
|
||||||
"target": {
|
"triple": "x86_64-none-elf",
|
||||||
"triple": "x86_64-none-elf",
|
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
},
|
||||||
},
|
"options": {
|
||||||
"options": {
|
"slice_level": 3,
|
||||||
"slice_level": 3,
|
"target": "llvm",
|
||||||
"target": "llvm",
|
"strict_mode": true
|
||||||
"strict_mode": true
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
385
VKernel/Kernel/drivers/devfs/devfs copy.vp
Normal file
385
VKernel/Kernel/drivers/devfs/devfs copy.vp
Normal file
@@ -0,0 +1,385 @@
|
|||||||
|
import drivers.serial.uart.serial as serial
|
||||||
|
import viperstring as string
|
||||||
|
import t, c
|
||||||
|
|
||||||
|
|
||||||
|
MAX_FILE_DESCRIPTORS: t.CDefine = 64
|
||||||
|
MAX_DEVICE_FILES: t.CDefine = 32
|
||||||
|
MAX_DIRECTORIES: t.CDefine = 16
|
||||||
|
PATH_BUFFER_SIZE: t.CDefine = 256
|
||||||
|
|
||||||
|
directories: list[devfs_directory, MAX_DIRECTORIES] = [0]
|
||||||
|
directory_count: t.CStatic | t.CInt = 0
|
||||||
|
|
||||||
|
files: list[devfs_file, MAX_DEVICE_FILES] = [0]
|
||||||
|
file_count: t.CStatic | t.CInt = 0
|
||||||
|
|
||||||
|
|
||||||
|
class _fd_table:
|
||||||
|
file: devfs_file | t.CPtr
|
||||||
|
flags: t.CInt
|
||||||
|
|
||||||
|
fd_table: list[_fd_table, MAX_FILE_DESCRIPTORS] = [0]
|
||||||
|
|
||||||
|
@t.Object
|
||||||
|
class devfs_directory:
|
||||||
|
name: list[t.CChar, 64]
|
||||||
|
parent: 'devfs_directory' | t.CPtr
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def find(path: t.CConst | str,
|
||||||
|
root_directory: devfs_directory | t.CPtr) -> devfs_directory | t.CPtr:
|
||||||
|
if not path or string.strchr(path, '/') != path: return None
|
||||||
|
if not root_directory: return None
|
||||||
|
|
||||||
|
current_dir: devfs_directory | t.CPtr = root_directory
|
||||||
|
result: list[str, PATH_BUFFER_SIZE]
|
||||||
|
token = string.split(path, "/", result)
|
||||||
|
|
||||||
|
for i in result:
|
||||||
|
found: bool = False
|
||||||
|
for d in range(directory_count):
|
||||||
|
dirp: devfs_directory = c.Addr(directories[d])
|
||||||
|
if dirp.parent == current_dir and string.samestr(dirp.name, i):
|
||||||
|
current_dir = dirp
|
||||||
|
found = True
|
||||||
|
break
|
||||||
|
if not found: return None
|
||||||
|
|
||||||
|
return current_dir
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def find_child(name: t.CConst | str,
|
||||||
|
parent: devfs_directory | t.CPtr) -> devfs_directory | t.CPtr:
|
||||||
|
for d in range(directory_count):
|
||||||
|
dirp: devfs_directory = c.Addr(directories[d])
|
||||||
|
if dirp.parent == parent and string.samestr(dirp.name, name):
|
||||||
|
return dirp
|
||||||
|
return None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def list_subdirs(dir_ptr: devfs_directory | t.CPtr,
|
||||||
|
buffer: str,
|
||||||
|
size: t.CUInt32T,
|
||||||
|
pos: t.CInt) -> t.CInt:
|
||||||
|
for d in range(directory_count):
|
||||||
|
dirp: devfs_directory = c.Addr(directories[d])
|
||||||
|
if dirp.parent == dir_ptr:
|
||||||
|
name_len: t.CInt = string.strlen(dirp.name)
|
||||||
|
if pos + name_len + 1 > size:
|
||||||
|
break
|
||||||
|
string.strcpy(buffer + pos, dirp.name)
|
||||||
|
pos += name_len
|
||||||
|
buffer[pos] = '\n'
|
||||||
|
pos += 1
|
||||||
|
return pos
|
||||||
|
|
||||||
|
@t.Object
|
||||||
|
@t.CVTable
|
||||||
|
class devfs_file:
|
||||||
|
name: list[t.CChar, 64]
|
||||||
|
private_data: t.CVoid | t.CPtr
|
||||||
|
parent_dir: 'devfs_directory' | t.CPtr
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def find_in_dir(file_name: t.CConst | str,
|
||||||
|
dir_ptr: devfs_directory | t.CPtr) -> devfs_file | t.CPtr:
|
||||||
|
for f in range(file_count):
|
||||||
|
fp: devfs_file | t.CPtr = c.Addr(files[f])
|
||||||
|
if fp.parent_dir == dir_ptr and string.samestr(fp.name, file_name):
|
||||||
|
return fp
|
||||||
|
return None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def list_in_dir(dir_ptr: devfs_directory | t.CPtr,
|
||||||
|
buffer: str,
|
||||||
|
size: t.CUInt32T,
|
||||||
|
pos: t.CInt) -> t.CInt:
|
||||||
|
for f in range(file_count):
|
||||||
|
filep: devfs_file | t.CPtr = c.Addr(files[f])
|
||||||
|
if filep.parent_dir == dir_ptr:
|
||||||
|
name_len: t.CInt = string.strlen(filep.name)
|
||||||
|
if pos + name_len + 1 > size:
|
||||||
|
break
|
||||||
|
string.strcpy(buffer + pos, filep.name)
|
||||||
|
pos += name_len
|
||||||
|
buffer[pos] = '\n'
|
||||||
|
pos += 1
|
||||||
|
return pos
|
||||||
|
|
||||||
|
def open(self, path: t.CConst | str, flags: t.CInt) -> t.CInt:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def close(self, fd: t.CInt) -> t.CInt:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def read(self, fd: t.CInt, buffer: t.CVoid | t.CPtr, size: t.CUInt32T) -> t.CInt:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def write(self, fd: t.CInt, buffer: t.CConst | t.CVoid | t.CPtr, size: t.CUInt32T) -> t.CInt:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def ioctl(self, fd: t.CInt, request: t.CInt, arg: t.CVoid | t.CPtr) -> t.CInt:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
@t.Object
|
||||||
|
class _DevFSObject:
|
||||||
|
root_directory: devfs_directory | t.CPtr
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
global directory_count, file_count
|
||||||
|
self.root_directory = None
|
||||||
|
directory_count = 0
|
||||||
|
file_count = 0
|
||||||
|
string.memset(c.Addr(directories), 0, devfs_directory.__sizeof__() * MAX_DIRECTORIES)
|
||||||
|
string.memset(c.Addr(files), 0, devfs_file.__sizeof__() * MAX_DEVICE_FILES)
|
||||||
|
string.memset(c.Addr(fd_table), 0, _fd_table.__sizeof__() * MAX_FILE_DESCRIPTORS)
|
||||||
|
|
||||||
|
def create_single_dir(self, parent: devfs_directory | t.CPtr,
|
||||||
|
dir_name: t.CConst | str) -> devfs_directory | t.CPtr:
|
||||||
|
global directory_count
|
||||||
|
if not parent or not dir_name: return None
|
||||||
|
if directory_count >= MAX_DIRECTORIES: return None
|
||||||
|
if string.strlen(dir_name) >= 64: return None
|
||||||
|
|
||||||
|
new_dir: devfs_directory | t.CPtr = c.Addr(directories[directory_count])
|
||||||
|
directory_count += 1
|
||||||
|
|
||||||
|
string.strcpy(new_dir.name, dir_name)
|
||||||
|
new_dir.parent = parent
|
||||||
|
|
||||||
|
return new_dir
|
||||||
|
|
||||||
|
def find_or_create_directory(self, path: t.CConst | str) -> devfs_directory | t.CPtr:
|
||||||
|
global directory_count
|
||||||
|
if not path or string.samestr(path, "/"): return None
|
||||||
|
|
||||||
|
if not self.root_directory:
|
||||||
|
self.root_directory = c.Addr(directories[directory_count])
|
||||||
|
directory_count += 1
|
||||||
|
string.strcpy(self.root_directory.name, "")
|
||||||
|
self.root_directory.parent = None
|
||||||
|
|
||||||
|
current: devfs_directory | t.CPtr = self.root_directory
|
||||||
|
buf: list[t.CChar, PATH_BUFFER_SIZE]
|
||||||
|
string.memset(c.Addr(buf), 0, PATH_BUFFER_SIZE)
|
||||||
|
buf_idx: t.CInt = 0
|
||||||
|
p: t.CInt = 0
|
||||||
|
if path[p] == '/':
|
||||||
|
p += 1
|
||||||
|
while path[p] != '\0':
|
||||||
|
if path[p] == '/':
|
||||||
|
if buf_idx > 0:
|
||||||
|
found_child: devfs_directory | t.CPtr = devfs_directory.find_child(buf, current)
|
||||||
|
if not found_child:
|
||||||
|
found_child = self.create_single_dir(current, buf)
|
||||||
|
if not found_child: return None
|
||||||
|
current = found_child
|
||||||
|
string.memset(c.Addr(buf), 0, PATH_BUFFER_SIZE)
|
||||||
|
buf_idx = 0
|
||||||
|
p += 1
|
||||||
|
else:
|
||||||
|
buf[buf_idx] = path[p]
|
||||||
|
buf_idx += 1
|
||||||
|
p += 1
|
||||||
|
if buf_idx > 0:
|
||||||
|
found_child: devfs_directory | t.CPtr = devfs_directory.find_child(buf, current)
|
||||||
|
if not found_child:
|
||||||
|
found_child = self.create_single_dir(current, buf)
|
||||||
|
if not found_child: return None
|
||||||
|
current = found_child
|
||||||
|
|
||||||
|
return current
|
||||||
|
|
||||||
|
def init(self) -> t.CInt:
|
||||||
|
self.create_directory("/dev")
|
||||||
|
self.create_directory("/dev/input")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def create_directory(self, path: t.CConst | str) -> t.CInt:
|
||||||
|
dir_ptr: devfs_directory | t.CPtr = self.find_or_create_directory(path)
|
||||||
|
return 0 if dir_ptr else -1
|
||||||
|
|
||||||
|
def create_file(self, path: t.CConst | str,
|
||||||
|
private_data: t.CVoid | t.CPtr) -> t.CInt:
|
||||||
|
global file_count
|
||||||
|
path_copy: list[t.CChar, PATH_BUFFER_SIZE]
|
||||||
|
string.memset(c.Addr(path_copy), 0, PATH_BUFFER_SIZE)
|
||||||
|
string.strcpy(path_copy, path)
|
||||||
|
|
||||||
|
last_slash: str | t.CPtr = string.strrchr(path_copy, '/')
|
||||||
|
|
||||||
|
if not last_slash: return -1
|
||||||
|
|
||||||
|
last_slash[0] = '\0'
|
||||||
|
dir_path = path_copy
|
||||||
|
file_name: str | t.CPtr = last_slash + 1
|
||||||
|
|
||||||
|
dir_ptr: devfs_directory | t.CPtr = self.find_or_create_directory(dir_path)
|
||||||
|
if not dir_ptr: return -1
|
||||||
|
|
||||||
|
if devfs_file.find_in_dir(file_name, dir_ptr):
|
||||||
|
return -1
|
||||||
|
|
||||||
|
if file_count >= MAX_DEVICE_FILES: return -1
|
||||||
|
|
||||||
|
new_file: devfs_file | t.CPtr = c.Addr(files[file_count])
|
||||||
|
file_count += 1
|
||||||
|
|
||||||
|
string.strcpy(new_file.name, file_name)
|
||||||
|
new_file.private_data = private_data
|
||||||
|
new_file.parent_dir = dir_ptr
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def open(self, path: t.CConst | str, flags: t.CInt) -> t.CInt:
|
||||||
|
path_copy: list[t.CChar, PATH_BUFFER_SIZE]
|
||||||
|
string.memset(c.Addr(path_copy), 0, PATH_BUFFER_SIZE)
|
||||||
|
string.strcpy(path_copy, path)
|
||||||
|
|
||||||
|
last_slash: str | t.CPtr = string.strrchr(path_copy, '/')
|
||||||
|
|
||||||
|
if not last_slash: return -1
|
||||||
|
|
||||||
|
last_slash[0] = '\0'
|
||||||
|
dir_path = path_copy
|
||||||
|
file_name: str | t.CPtr = last_slash + 1
|
||||||
|
|
||||||
|
dir_ptr: devfs_directory | t.CPtr = devfs_directory.find(dir_path, self.root_directory)
|
||||||
|
if not dir_ptr: return -1
|
||||||
|
|
||||||
|
file_ptr: devfs_file | t.CPtr = devfs_file.find_in_dir(file_name, dir_ptr)
|
||||||
|
if not file_ptr: return -1
|
||||||
|
|
||||||
|
if not file_ptr.open:
|
||||||
|
return -1
|
||||||
|
|
||||||
|
fd: t.CInt = -1
|
||||||
|
for i in range(MAX_FILE_DESCRIPTORS):
|
||||||
|
if not fd_table[i].file:
|
||||||
|
fd = i
|
||||||
|
break
|
||||||
|
|
||||||
|
if fd == -1: return -1
|
||||||
|
|
||||||
|
ret: t.CInt = file_ptr.open(path, flags)
|
||||||
|
if ret != 0: return ret
|
||||||
|
|
||||||
|
fd_table[fd].file = file_ptr
|
||||||
|
fd_table[fd].flags = flags
|
||||||
|
return fd
|
||||||
|
|
||||||
|
def close(self, fd: t.CInt) -> t.CInt:
|
||||||
|
if fd < 0 or fd >= MAX_FILE_DESCRIPTORS or not fd_table[fd].file:
|
||||||
|
return -1
|
||||||
|
file_ptr: devfs_file | t.CPtr = fd_table[fd].file
|
||||||
|
if file_ptr and file_ptr.close:
|
||||||
|
file_ptr.close(fd)
|
||||||
|
fd_table[fd].file = None
|
||||||
|
fd_table[fd].flags = 0
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def read(self, fd: t.CInt, buffer: t.CVoid | t.CPtr, size: t.CUInt32T) -> t.CInt:
|
||||||
|
if fd < 0 or fd >= MAX_FILE_DESCRIPTORS or not fd_table[fd].file:
|
||||||
|
return -1
|
||||||
|
file_ptr: devfs_file | t.CPtr = fd_table[fd].file
|
||||||
|
if file_ptr and file_ptr.read:
|
||||||
|
return file_ptr.read(fd, buffer, size)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def write(self, fd: t.CInt, buffer: t.CConst | t.CVoid | t.CPtr, size: t.CUInt32T) -> t.CInt:
|
||||||
|
if fd < 0 or fd >= MAX_FILE_DESCRIPTORS or not fd_table[fd].file:
|
||||||
|
return -1
|
||||||
|
file_ptr: devfs_file | t.CPtr = fd_table[fd].file
|
||||||
|
if file_ptr and file_ptr.write:
|
||||||
|
return file_ptr.write(fd, buffer, size)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def ioctl(self, fd: t.CInt, cmd: t.CUInt32T, arg: t.CVoid | t.CPtr) -> t.CInt:
|
||||||
|
if fd < 0 or fd >= MAX_FILE_DESCRIPTORS or not fd_table[fd].file:
|
||||||
|
return -1
|
||||||
|
file_ptr: devfs_file | t.CPtr = fd_table[fd].file
|
||||||
|
if file_ptr and file_ptr.ioctl:
|
||||||
|
return file_ptr.ioctl(fd, cmd, arg)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def list_directory(self, path: t.CConst | str,
|
||||||
|
buffer: str,
|
||||||
|
size: t.CUInt32T) -> t.CInt:
|
||||||
|
dir_ptr: devfs_directory | t.CPtr = devfs_directory.find(path, self.root_directory)
|
||||||
|
if not dir_ptr or not buffer or size == 0: return -1
|
||||||
|
|
||||||
|
pos: t.CInt = devfs_directory.list_subdirs(dir_ptr, buffer, size, 0)
|
||||||
|
pos = devfs_file.list_in_dir(dir_ptr, buffer, size, pos)
|
||||||
|
|
||||||
|
return pos
|
||||||
|
|
||||||
|
DevFSObject: _DevFSObject | t.CPtr
|
||||||
|
_DevFSObject_instance: _DevFSObject
|
||||||
|
|
||||||
|
|
||||||
|
def devfs_init() -> t.CInt:
|
||||||
|
global DevFSObject, _DevFSObject_instance
|
||||||
|
DevFSObject = c.Addr(_DevFSObject_instance)
|
||||||
|
_DevFSObject_instance.__init__()
|
||||||
|
DevFSObject.init()
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def devfs_create_directory(path: t.CConst | str) -> t.CInt:
|
||||||
|
return DevFSObject.create_directory(path)
|
||||||
|
|
||||||
|
def devfs_create_file(path: t.CConst | str,
|
||||||
|
private_data: t.CVoid | t.CPtr) -> t.CInt:
|
||||||
|
return DevFSObject.create_file(path, private_data)
|
||||||
|
|
||||||
|
def devfs_open(path: t.CConst | str, flags: t.CInt) -> t.CInt:
|
||||||
|
return DevFSObject.open(path, flags)
|
||||||
|
|
||||||
|
def devfs_close(fd: t.CInt) -> t.CInt:
|
||||||
|
return DevFSObject.close(fd)
|
||||||
|
|
||||||
|
def devfs_read(fd: t.CInt, buffer: t.CVoid | t.CPtr, size: t.CUInt32T) -> t.CInt:
|
||||||
|
return DevFSObject.read(fd, buffer, size)
|
||||||
|
|
||||||
|
def devfs_write(fd: t.CInt, buffer: t.CConst | t.CVoid | t.CPtr, size: t.CUInt32T) -> t.CInt:
|
||||||
|
return DevFSObject.write(fd, buffer, size)
|
||||||
|
|
||||||
|
def devfs_ioctl(fd: t.CInt, cmd: t.CUInt32T, arg: t.CVoid | t.CPtr) -> t.CInt:
|
||||||
|
return DevFSObject.ioctl(fd, cmd, arg)
|
||||||
|
|
||||||
|
def devfs_list_directory(path: t.CConst | str,
|
||||||
|
buffer: str,
|
||||||
|
size: t.CUInt32T) -> t.CInt:
|
||||||
|
return DevFSObject.list_directory(path, buffer, size)
|
||||||
|
|
||||||
|
serial0_file: devfs_file
|
||||||
|
|
||||||
|
def serial0_open(self: t.CVoid | t.CPtr, path: t.CConst | str, flags: t.CInt) -> t.CInt:
|
||||||
|
serial.puts("[serial0] open: ")
|
||||||
|
serial.puts(path)
|
||||||
|
serial.puts("\n")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def serial0_close(self: t.CVoid | t.CPtr, fd: t.CInt) -> t.CInt:
|
||||||
|
serial.puts("[serial0] close\n")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def serial0_read(self: t.CVoid | t.CPtr, fd: t.CInt, buffer: t.CVoid | t.CPtr, size: t.CUInt32T) -> t.CInt:
|
||||||
|
serial.puts("[serial0] read\n")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def serial0_write(self: t.CVoid | t.CPtr, fd: t.CInt, buffer: t.CConst | t.CVoid | t.CPtr, size: t.CUInt32T) -> t.CInt:
|
||||||
|
serial.puts("[serial0] write\n")
|
||||||
|
serial.puts(str(buffer))
|
||||||
|
serial.puts("\n")
|
||||||
|
return size
|
||||||
|
|
||||||
|
def devfs_register_serial0() -> t.CInt:
|
||||||
|
global serial0_file
|
||||||
|
serial0_file = devfs_file()
|
||||||
|
serial0_file.open = serial0_open
|
||||||
|
serial0_file.close = serial0_close
|
||||||
|
serial0_file.read = serial0_read
|
||||||
|
serial0_file.write = serial0_write
|
||||||
|
serial0_file.ioctl = None
|
||||||
|
return devfs_create_file("/dev/serial0", serial0_file)
|
||||||
@@ -19,60 +19,60 @@ class idt_entry:
|
|||||||
reserved1: t.CUInt32T
|
reserved1: t.CUInt32T
|
||||||
idt: t.CArray[idt_entry, 256] = []
|
idt: t.CArray[idt_entry, 256] = []
|
||||||
|
|
||||||
irq_handler_t: t.CTypedef | t.Callable[[], t.CInt]
|
irq_handler_t: t.CTypedef = t.Callable[[], t.CInt]
|
||||||
|
|
||||||
def isr0() -> t.CExtern | t.CVoid | t.State: pass
|
def isr0() -> t.State: pass
|
||||||
def isr1() -> t.CExtern | t.CVoid | t.State: pass
|
def isr1() -> t.State: pass
|
||||||
def isr2() -> t.CExtern | t.CVoid | t.State: pass
|
def isr2() -> t.State: pass
|
||||||
def isr3() -> t.CExtern | t.CVoid | t.State: pass
|
def isr3() -> t.State: pass
|
||||||
def isr4() -> t.CExtern | t.CVoid | t.State: pass
|
def isr4() -> t.State: pass
|
||||||
def isr5() -> t.CExtern | t.CVoid | t.State: pass
|
def isr5() -> t.State: pass
|
||||||
def isr6() -> t.CExtern | t.CVoid | t.State: pass
|
def isr6() -> t.State: pass
|
||||||
def isr7() -> t.CExtern | t.CVoid | t.State: pass
|
def isr7() -> t.State: pass
|
||||||
def isr8() -> t.CExtern | t.CVoid | t.State: pass
|
def isr8() -> t.State: pass
|
||||||
def isr9() -> t.CExtern | t.CVoid | t.State: pass
|
def isr9() -> t.State: pass
|
||||||
def isr10() -> t.CExtern | t.CVoid | t.State: pass
|
def isr10() -> t.State: pass
|
||||||
def isr11() -> t.CExtern | t.CVoid | t.State: pass
|
def isr11() -> t.State: pass
|
||||||
def isr12() -> t.CExtern | t.CVoid | t.State: pass
|
def isr12() -> t.State: pass
|
||||||
def isr13() -> t.CExtern | t.CVoid | t.State: pass
|
def isr13() -> t.State: pass
|
||||||
def isr14() -> t.CExtern | t.CVoid | t.State: pass
|
def isr14() -> t.State: pass
|
||||||
def isr15() -> t.CExtern | t.CVoid | t.State: pass
|
def isr15() -> t.State: pass
|
||||||
def isr16() -> t.CExtern | t.CVoid | t.State: pass
|
def isr16() -> t.State: pass
|
||||||
def isr17() -> t.CExtern | t.CVoid | t.State: pass
|
def isr17() -> t.State: pass
|
||||||
def isr18() -> t.CExtern | t.CVoid | t.State: pass
|
def isr18() -> t.State: pass
|
||||||
def isr19() -> t.CExtern | t.CVoid | t.State: pass
|
def isr19() -> t.State: pass
|
||||||
def isr20() -> t.CExtern | t.CVoid | t.State: pass
|
def isr20() -> t.State: pass
|
||||||
def isr21() -> t.CExtern | t.CVoid | t.State: pass
|
def isr21() -> t.State: pass
|
||||||
def isr22() -> t.CExtern | t.CVoid | t.State: pass
|
def isr22() -> t.State: pass
|
||||||
def isr23() -> t.CExtern | t.CVoid | t.State: pass
|
def isr23() -> t.State: pass
|
||||||
def isr24() -> t.CExtern | t.CVoid | t.State: pass
|
def isr24() -> t.State: pass
|
||||||
def isr25() -> t.CExtern | t.CVoid | t.State: pass
|
def isr25() -> t.State: pass
|
||||||
def isr26() -> t.CExtern | t.CVoid | t.State: pass
|
def isr26() -> t.State: pass
|
||||||
def isr27() -> t.CExtern | t.CVoid | t.State: pass
|
def isr27() -> t.State: pass
|
||||||
def isr28() -> t.CExtern | t.CVoid | t.State: pass
|
def isr28() -> t.State: pass
|
||||||
def isr29() -> t.CExtern | t.CVoid | t.State: pass
|
def isr29() -> t.State: pass
|
||||||
def isr30() -> t.CExtern | t.CVoid | t.State: pass
|
def isr30() -> t.State: pass
|
||||||
def isr31() -> t.CExtern | t.CVoid | t.State: pass
|
def isr31() -> t.State: pass
|
||||||
def isr32() -> t.CExtern | t.CVoid | t.State: pass
|
def isr32() -> t.State: pass
|
||||||
def isr33() -> t.CExtern | t.CVoid | t.State: pass
|
def isr33() -> t.State: pass
|
||||||
def isr34() -> t.CExtern | t.CVoid | t.State: pass
|
def isr34() -> t.State: pass
|
||||||
def isr35() -> t.CExtern | t.CVoid | t.State: pass
|
def isr35() -> t.State: pass
|
||||||
def isr36() -> t.CExtern | t.CVoid | t.State: pass
|
def isr36() -> t.State: pass
|
||||||
def isr37() -> t.CExtern | t.CVoid | t.State: pass
|
def isr37() -> t.State: pass
|
||||||
def isr38() -> t.CExtern | t.CVoid | t.State: pass
|
def isr38() -> t.State: pass
|
||||||
def isr39() -> t.CExtern | t.CVoid | t.State: pass
|
def isr39() -> t.State: pass
|
||||||
def isr40() -> t.CExtern | t.CVoid | t.State: pass
|
def isr40() -> t.State: pass
|
||||||
def isr41() -> t.CExtern | t.CVoid | t.State: pass
|
def isr41() -> t.State: pass
|
||||||
def isr42() -> t.CExtern | t.CVoid | t.State: pass
|
def isr42() -> t.State: pass
|
||||||
def isr43() -> t.CExtern | t.CVoid | t.State: pass
|
def isr43() -> t.State: pass
|
||||||
def isr44() -> t.CExtern | t.CVoid | t.State: pass
|
def isr44() -> t.State: pass
|
||||||
def isr45() -> t.CExtern | t.CVoid | t.State: pass
|
def isr45() -> t.State: pass
|
||||||
def isr46() -> t.CExtern | t.CVoid | t.State: pass
|
def isr46() -> t.State: pass
|
||||||
def isr47() -> t.CExtern | t.CVoid | t.State: pass
|
def isr47() -> t.State: pass
|
||||||
|
|
||||||
def isr80() -> t.CExtern | t.CVoid | t.State: pass
|
def isr80() -> t.State: pass
|
||||||
|
|
||||||
def isr_default() -> t.CExtern | t.CVoid | t.State: pass
|
def isr_default() -> t.State: pass
|
||||||
|
|
||||||
def setGate(num: int, base: t.CUInt64T, sel: t.CUInt16T, flags: t.CUInt8T):
|
def setGate(num: int, base: t.CUInt64T, sel: t.CUInt16T, flags: t.CUInt8T):
|
||||||
global idt
|
global idt
|
||||||
@@ -1,31 +1,30 @@
|
|||||||
{
|
{
|
||||||
"name": "Kernel",
|
"name": "Kernel",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"source_dir": "./Kernel",
|
"source_dir": "./Kernel",
|
||||||
"temp_dir": "./temp",
|
"build_dir": "./.tpv_build",
|
||||||
"output_dir": "./output",
|
"compiler": {
|
||||||
"compiler": {
|
"cmd": "llc",
|
||||||
"cmd": "llc",
|
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=static", "-O2"]
|
||||||
"flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=static", "-O2"]
|
},
|
||||||
},
|
"linker": {
|
||||||
"linker": {
|
"cmd": "ld.lld.exe",
|
||||||
"cmd": "ld.lld.exe",
|
"flags": [
|
||||||
"flags": [
|
"-m", "elf_x86_64",
|
||||||
"-m", "elf_x86_64",
|
"-T", "linker.ld",
|
||||||
"-T", "linker.ld",
|
"--oformat", "binary",
|
||||||
"--oformat", "binary",
|
"--strip-all"
|
||||||
"--strip-all"
|
],
|
||||||
],
|
"output": "kernel.bin"
|
||||||
"output": "kernel.bin"
|
},
|
||||||
},
|
"includes": ["../../includes"],
|
||||||
"includes": ["../../includes"],
|
"target": {
|
||||||
"target": {
|
"triple": "x86_64-none-elf",
|
||||||
"triple": "x86_64-none-elf",
|
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
"datalayout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
},
|
||||||
},
|
"options": {
|
||||||
"options": {
|
"slice_level": 3,
|
||||||
"slice_level": 3,
|
"target": "llvm",
|
||||||
"target": "llvm",
|
"strict_mode": true
|
||||||
"strict_mode": true
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user