\ No newline at end of file
diff --git a/polyhal/addr/index.html b/polyhal/addr/index.html
new file mode 100644
index 0000000..2f36a05
--- /dev/null
+++ b/polyhal/addr/index.html
@@ -0,0 +1 @@
+polyhal::addr - Rust
\ No newline at end of file
diff --git a/polyhal/addr/sidebar-items.js b/polyhal/addr/sidebar-items.js
new file mode 100644
index 0000000..f064274
--- /dev/null
+++ b/polyhal/addr/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"struct":["PhysAddr","PhysPage","VirtAddr","VirtPage"]};
\ No newline at end of file
diff --git a/polyhal/addr/struct.PhysAddr.html b/polyhal/addr/struct.PhysAddr.html
new file mode 100644
index 0000000..dd58d62
--- /dev/null
+++ b/polyhal/addr/struct.PhysAddr.html
@@ -0,0 +1,20 @@
+PhysAddr in polyhal::addr - Rust
\ No newline at end of file
diff --git a/polyhal/addr/struct.PhysPage.html b/polyhal/addr/struct.PhysPage.html
new file mode 100644
index 0000000..049731a
--- /dev/null
+++ b/polyhal/addr/struct.PhysPage.html
@@ -0,0 +1,20 @@
+PhysPage in polyhal::addr - Rust
\ No newline at end of file
diff --git a/polyhal/addr/struct.VirtAddr.html b/polyhal/addr/struct.VirtAddr.html
new file mode 100644
index 0000000..af3f934
--- /dev/null
+++ b/polyhal/addr/struct.VirtAddr.html
@@ -0,0 +1,21 @@
+VirtAddr in polyhal::addr - Rust
\ No newline at end of file
diff --git a/polyhal/addr/struct.VirtPage.html b/polyhal/addr/struct.VirtPage.html
new file mode 100644
index 0000000..128f4c7
--- /dev/null
+++ b/polyhal/addr/struct.VirtPage.html
@@ -0,0 +1,21 @@
+VirtPage in polyhal::addr - Rust
\ No newline at end of file
diff --git a/polyhal/all.html b/polyhal/all.html
new file mode 100644
index 0000000..f724c80
--- /dev/null
+++ b/polyhal/all.html
@@ -0,0 +1 @@
+List of all items in this crate
\ No newline at end of file
diff --git a/polyhal/attr.arch_entry.html b/polyhal/attr.arch_entry.html
new file mode 100644
index 0000000..24f9900
--- /dev/null
+++ b/polyhal/attr.arch_entry.html
@@ -0,0 +1 @@
+arch_entry in polyhal - Rust
\ No newline at end of file
diff --git a/polyhal/attr.arch_interrupt.html b/polyhal/attr.arch_interrupt.html
new file mode 100644
index 0000000..bba945a
--- /dev/null
+++ b/polyhal/attr.arch_interrupt.html
@@ -0,0 +1 @@
+arch_interrupt in polyhal - Rust
\ No newline at end of file
diff --git a/polyhal/boot/constant.STACK_SIZE.html b/polyhal/boot/constant.STACK_SIZE.html
new file mode 100644
index 0000000..4720d6b
--- /dev/null
+++ b/polyhal/boot/constant.STACK_SIZE.html
@@ -0,0 +1,3 @@
+STACK_SIZE in polyhal::boot - Rust
Boot Stack Size.
+TODO: reduce the boot stack size. Map stack in boot step.
+
\ No newline at end of file
diff --git a/polyhal/boot/fn.boot_page_table.html b/polyhal/boot/fn.boot_page_table.html
new file mode 100644
index 0000000..eba4784
--- /dev/null
+++ b/polyhal/boot/fn.boot_page_table.html
@@ -0,0 +1,2 @@
+boot_page_table in polyhal::boot - Rust
\ No newline at end of file
diff --git a/polyhal/boot/index.html b/polyhal/boot/index.html
new file mode 100644
index 0000000..52b12e6
--- /dev/null
+++ b/polyhal/boot/index.html
@@ -0,0 +1,3 @@
+polyhal::boot - Rust
\ No newline at end of file
diff --git a/polyhal/boot/sidebar-items.js b/polyhal/boot/sidebar-items.js
new file mode 100644
index 0000000..85bda9b
--- /dev/null
+++ b/polyhal/boot/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"constant":["STACK_SIZE"],"fn":["boot_page_table"]};
\ No newline at end of file
diff --git a/polyhal/common/fn.get_cpu_num.html b/polyhal/common/fn.get_cpu_num.html
new file mode 100644
index 0000000..3e49ba5
--- /dev/null
+++ b/polyhal/common/fn.get_cpu_num.html
@@ -0,0 +1,2 @@
+get_cpu_num in polyhal::common - Rust
\ No newline at end of file
diff --git a/polyhal/common/fn.get_fdt.html b/polyhal/common/fn.get_fdt.html
new file mode 100644
index 0000000..7ebd6b9
--- /dev/null
+++ b/polyhal/common/fn.get_fdt.html
@@ -0,0 +1,2 @@
+get_fdt in polyhal::common - Rust
\ No newline at end of file
diff --git a/polyhal/common/fn.get_mem_areas.html b/polyhal/common/fn.get_mem_areas.html
new file mode 100644
index 0000000..6f53f01
--- /dev/null
+++ b/polyhal/common/fn.get_mem_areas.html
@@ -0,0 +1,2 @@
+get_mem_areas in polyhal::common - Rust
Get the memory area, this function should be called after initialization
+
\ No newline at end of file
diff --git a/polyhal/common/fn.init.html b/polyhal/common/fn.init.html
new file mode 100644
index 0000000..7a1ea80
--- /dev/null
+++ b/polyhal/common/fn.init.html
@@ -0,0 +1,3 @@
+init in polyhal::common - Rust
Init arch with page allocator, like log crate
+Please initialize the allocator before calling this function.
+
\ No newline at end of file
diff --git a/polyhal/common/index.html b/polyhal/common/index.html
new file mode 100644
index 0000000..ad27b6a
--- /dev/null
+++ b/polyhal/common/index.html
@@ -0,0 +1,2 @@
+polyhal::common - Rust
Init arch with page allocator, like log crate
+Please initialize the allocator before calling this function.
\ No newline at end of file
diff --git a/polyhal/common/sidebar-items.js b/polyhal/common/sidebar-items.js
new file mode 100644
index 0000000..98d62dd
--- /dev/null
+++ b/polyhal/common/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"fn":["get_cpu_num","get_fdt","get_mem_areas","init"],"trait":["PageAlloc"]};
\ No newline at end of file
diff --git a/polyhal/common/trait.PageAlloc.html b/polyhal/common/trait.PageAlloc.html
new file mode 100644
index 0000000..75ed771
--- /dev/null
+++ b/polyhal/common/trait.PageAlloc.html
@@ -0,0 +1,8 @@
+PageAlloc in polyhal::common - Rust
+
+
+
\ No newline at end of file
diff --git a/polyhal/consts/constant.MULTI_CORE_AREA.html b/polyhal/consts/constant.MULTI_CORE_AREA.html
new file mode 100644
index 0000000..3d7abe9
--- /dev/null
+++ b/polyhal/consts/constant.MULTI_CORE_AREA.html
@@ -0,0 +1,7 @@
+MULTI_CORE_AREA in polyhal::consts - Rust
Every core has a unique area of memory.
+Just using pagetable to map multi core area.
+Area size: 0x100_0000 (16MBytes)
+
First Area is 0xFFFF_FFC2_0000_0000
+Next Area is 0xFFFF_FFC2_0100_0000
+Others Same as This, so it will support 16 * 16 = 256 cores (Only auxiliary Harts).
+
\ No newline at end of file
diff --git a/polyhal/consts/constant.MULTI_CORE_AREA_SIZE.html b/polyhal/consts/constant.MULTI_CORE_AREA_SIZE.html
new file mode 100644
index 0000000..329a8ae
--- /dev/null
+++ b/polyhal/consts/constant.MULTI_CORE_AREA_SIZE.html
@@ -0,0 +1 @@
+MULTI_CORE_AREA_SIZE in polyhal::consts - Rust
\ No newline at end of file
diff --git a/polyhal/consts/constant.VIRT_ADDR_START.html b/polyhal/consts/constant.VIRT_ADDR_START.html
new file mode 100644
index 0000000..c507e73
--- /dev/null
+++ b/polyhal/consts/constant.VIRT_ADDR_START.html
@@ -0,0 +1,2 @@
+VIRT_ADDR_START in polyhal::consts - Rust
\ No newline at end of file
diff --git a/polyhal/consts/index.html b/polyhal/consts/index.html
new file mode 100644
index 0000000..178eb19
--- /dev/null
+++ b/polyhal/consts/index.html
@@ -0,0 +1,4 @@
+polyhal::consts - Rust
\ No newline at end of file
diff --git a/polyhal/consts/sidebar-items.js b/polyhal/consts/sidebar-items.js
new file mode 100644
index 0000000..27d8ce5
--- /dev/null
+++ b/polyhal/consts/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"constant":["MULTI_CORE_AREA","MULTI_CORE_AREA_SIZE","VIRT_ADDR_START"]};
\ No newline at end of file
diff --git a/polyhal/debug_console/index.html b/polyhal/debug_console/index.html
new file mode 100644
index 0000000..561f1b7
--- /dev/null
+++ b/polyhal/debug_console/index.html
@@ -0,0 +1,8 @@
+polyhal::debug_console - Rust
\ No newline at end of file
diff --git a/polyhal/debug_console/sidebar-items.js b/polyhal/debug_console/sidebar-items.js
new file mode 100644
index 0000000..8ca1933
--- /dev/null
+++ b/polyhal/debug_console/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"struct":["DebugConsole"]};
\ No newline at end of file
diff --git a/polyhal/debug_console/struct.DebugConsole.html b/polyhal/debug_console/struct.DebugConsole.html
new file mode 100644
index 0000000..3383e41
--- /dev/null
+++ b/polyhal/debug_console/struct.DebugConsole.html
@@ -0,0 +1,14 @@
+DebugConsole in polyhal::debug_console - Rust
\ No newline at end of file
diff --git a/polyhal/enum.MappingSize.html b/polyhal/enum.MappingSize.html
new file mode 100644
index 0000000..686e4dc
--- /dev/null
+++ b/polyhal/enum.MappingSize.html
@@ -0,0 +1,16 @@
+MappingSize in polyhal - Rust
\ No newline at end of file
diff --git a/polyhal/index.html b/polyhal/index.html
new file mode 100644
index 0000000..749ac02
--- /dev/null
+++ b/polyhal/index.html
@@ -0,0 +1,100 @@
+polyhal - Rust
This crate provides a [TrapFrame], you can operate it through index with [TrapFrameArgs].
+
If you are using kernel task. You should to enable feature kcontext.
+Then you can use kernel task context structure [KContext], and manipulate it with [KContextArgs].
+
You can switch kcontext through [context_switch_pt] or [context_switch]
+
There are also some consts.
+
[VIRT_ADDR_START]: This is a higher half kernel offset address.
+[USER_VADDR_END]: End of the user address range.
+[PAGE_SIZE]: The size of the page.
+
You can get some device information using the functions below.
+[get_mem_areas]: Get the avaliable memorys.
+[get_fdt]: Get the Fdt structure(fdt is a rust dtb operation crate).
+[get_cpu_num]: Get the number of cpus.
+
TIPS: You should have finished [init] before using [get_mem_areas] and [get_fdt].
\ No newline at end of file
diff --git a/polyhal/instruction/index.html b/polyhal/instruction/index.html
new file mode 100644
index 0000000..37b5673
--- /dev/null
+++ b/polyhal/instruction/index.html
@@ -0,0 +1,4 @@
+polyhal::instruction - Rust
\ No newline at end of file
diff --git a/polyhal/instruction/sidebar-items.js b/polyhal/instruction/sidebar-items.js
new file mode 100644
index 0000000..11e2ee0
--- /dev/null
+++ b/polyhal/instruction/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"struct":["Instruction"]};
\ No newline at end of file
diff --git a/polyhal/instruction/struct.Instruction.html b/polyhal/instruction/struct.Instruction.html
new file mode 100644
index 0000000..dc3c050
--- /dev/null
+++ b/polyhal/instruction/struct.Instruction.html
@@ -0,0 +1,14 @@
+Instruction in polyhal::instruction - Rust
\ No newline at end of file
diff --git a/polyhal/irq/index.html b/polyhal/irq/index.html
new file mode 100644
index 0000000..ad06c1b
--- /dev/null
+++ b/polyhal/irq/index.html
@@ -0,0 +1,25 @@
+polyhal::irq - Rust
\ No newline at end of file
diff --git a/polyhal/irq/sidebar-items.js b/polyhal/irq/sidebar-items.js
new file mode 100644
index 0000000..d9006ce
--- /dev/null
+++ b/polyhal/irq/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"struct":["IRQ","IRQVector"]};
\ No newline at end of file
diff --git a/polyhal/irq/struct.IRQ.html b/polyhal/irq/struct.IRQ.html
new file mode 100644
index 0000000..f920f57
--- /dev/null
+++ b/polyhal/irq/struct.IRQ.html
@@ -0,0 +1,17 @@
+IRQ in polyhal::irq - Rust
\ No newline at end of file
diff --git a/polyhal/irq/struct.IRQVector.html b/polyhal/irq/struct.IRQVector.html
new file mode 100644
index 0000000..c6b3fb7
--- /dev/null
+++ b/polyhal/irq/struct.IRQVector.html
@@ -0,0 +1,15 @@
+IRQVector in polyhal::irq - Rust
\ No newline at end of file
diff --git a/polyhal/kcontext/enum.KContextArgs.html b/polyhal/kcontext/enum.KContextArgs.html
new file mode 100644
index 0000000..3d8ce1d
--- /dev/null
+++ b/polyhal/kcontext/enum.KContextArgs.html
@@ -0,0 +1,41 @@
+KContextArgs in polyhal::kcontext - Rust
\ No newline at end of file
diff --git a/polyhal/kcontext/fn.context_switch.html b/polyhal/kcontext/fn.context_switch.html
new file mode 100644
index 0000000..283263f
--- /dev/null
+++ b/polyhal/kcontext/fn.context_switch.html
@@ -0,0 +1,6 @@
+context_switch in polyhal::kcontext - Rust
Save the context of current task and switch to new task.
+
\ No newline at end of file
diff --git a/polyhal/kcontext/fn.context_switch_pt.html b/polyhal/kcontext/fn.context_switch_pt.html
new file mode 100644
index 0000000..c04ac83
--- /dev/null
+++ b/polyhal/kcontext/fn.context_switch_pt.html
@@ -0,0 +1,7 @@
+context_switch_pt in polyhal::kcontext - Rust
Save the context of current task and switch to new task.
+
\ No newline at end of file
diff --git a/polyhal/kcontext/fn.read_current_tp.html b/polyhal/kcontext/fn.read_current_tp.html
new file mode 100644
index 0000000..aa709be
--- /dev/null
+++ b/polyhal/kcontext/fn.read_current_tp.html
@@ -0,0 +1 @@
+read_current_tp in polyhal::kcontext - Rust
\ No newline at end of file
diff --git a/polyhal/kcontext/index.html b/polyhal/kcontext/index.html
new file mode 100644
index 0000000..785ce7c
--- /dev/null
+++ b/polyhal/kcontext/index.html
@@ -0,0 +1,2 @@
+polyhal::kcontext - Rust
\ No newline at end of file
diff --git a/polyhal/kcontext/sidebar-items.js b/polyhal/kcontext/sidebar-items.js
new file mode 100644
index 0000000..f12b2ee
--- /dev/null
+++ b/polyhal/kcontext/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"enum":["KContextArgs"],"fn":["context_switch","context_switch_pt","read_current_tp"],"struct":["KContext"]};
\ No newline at end of file
diff --git a/polyhal/kcontext/struct.KContext.html b/polyhal/kcontext/struct.KContext.html
new file mode 100644
index 0000000..7999a24
--- /dev/null
+++ b/polyhal/kcontext/struct.KContext.html
@@ -0,0 +1,35 @@
+KContext in polyhal::kcontext - Rust
+
+
+
\ No newline at end of file
diff --git a/polyhal/macro.pub_use_arch.html b/polyhal/macro.pub_use_arch.html
new file mode 100644
index 0000000..5e8ae28
--- /dev/null
+++ b/polyhal/macro.pub_use_arch.html
@@ -0,0 +1,3 @@
+pub_use_arch in polyhal - Rust
\ No newline at end of file
diff --git a/polyhal/macros/index.html b/polyhal/macros/index.html
new file mode 100644
index 0000000..60dc327
--- /dev/null
+++ b/polyhal/macros/index.html
@@ -0,0 +1 @@
+polyhal::macros - Rust
+
+
+
\ No newline at end of file
diff --git a/polyhal/macros/macro.pub_use_arch.html b/polyhal/macros/macro.pub_use_arch.html
new file mode 100644
index 0000000..c659e40
--- /dev/null
+++ b/polyhal/macros/macro.pub_use_arch.html
@@ -0,0 +1,3 @@
+pub_use_arch in polyhal::macros - Rust
\ No newline at end of file
diff --git a/polyhal/macros/sidebar-items.js b/polyhal/macros/sidebar-items.js
new file mode 100644
index 0000000..9dfccbe
--- /dev/null
+++ b/polyhal/macros/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"macro":["pub_use_arch"]};
\ No newline at end of file
diff --git a/polyhal/mem/index.html b/polyhal/mem/index.html
new file mode 100644
index 0000000..8b30c29
--- /dev/null
+++ b/polyhal/mem/index.html
@@ -0,0 +1 @@
+polyhal::mem - Rust
\ No newline at end of file
diff --git a/polyhal/mem/sidebar-items.js b/polyhal/mem/sidebar-items.js
new file mode 100644
index 0000000..39051f8
--- /dev/null
+++ b/polyhal/mem/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"struct":["Barrier"]};
\ No newline at end of file
diff --git a/polyhal/mem/struct.Barrier.html b/polyhal/mem/struct.Barrier.html
new file mode 100644
index 0000000..63ca1d4
--- /dev/null
+++ b/polyhal/mem/struct.Barrier.html
@@ -0,0 +1,15 @@
+Barrier in polyhal::mem - Rust
This struct has two functions.
+Barrier::complete_sync: ensures the correct sequencing of instructions
+Barrier::ordering_sync: ensures the visibility and consistency of memory operations
\ No newline at end of file
diff --git a/polyhal/multicore/fn.boot_core.html b/polyhal/multicore/fn.boot_core.html
new file mode 100644
index 0000000..2ac8109
--- /dev/null
+++ b/polyhal/multicore/fn.boot_core.html
@@ -0,0 +1 @@
+boot_core in polyhal::multicore - Rust
\ No newline at end of file
diff --git a/polyhal/multicore/index.html b/polyhal/multicore/index.html
new file mode 100644
index 0000000..8250ee0
--- /dev/null
+++ b/polyhal/multicore/index.html
@@ -0,0 +1,10 @@
+polyhal::multicore - Rust
You can use this function to use the multicore operation
+
Boot other calls after the multicore
+If you use this function call, you should call it after arch::init(..);
+This function will allocate the stack and map it for itself.
+
+
Multicore::boot_all();
+
Here will have more functionality about multicore in the future.
\ No newline at end of file
diff --git a/polyhal/multicore/sidebar-items.js b/polyhal/multicore/sidebar-items.js
new file mode 100644
index 0000000..b448093
--- /dev/null
+++ b/polyhal/multicore/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"fn":["boot_core"],"struct":["CpuCore","MultiCore"]};
\ No newline at end of file
diff --git a/polyhal/multicore/struct.CpuCore.html b/polyhal/multicore/struct.CpuCore.html
new file mode 100644
index 0000000..c9184bf
--- /dev/null
+++ b/polyhal/multicore/struct.CpuCore.html
@@ -0,0 +1,11 @@
+CpuCore in polyhal::multicore - Rust
\ No newline at end of file
diff --git a/polyhal/multicore/struct.MultiCore.html b/polyhal/multicore/struct.MultiCore.html
new file mode 100644
index 0000000..6583bc1
--- /dev/null
+++ b/polyhal/multicore/struct.MultiCore.html
@@ -0,0 +1,13 @@
+MultiCore in polyhal::multicore - Rust
\ No newline at end of file
diff --git a/polyhal/pagetable/constant.PAGE_SIZE.html b/polyhal/pagetable/constant.PAGE_SIZE.html
new file mode 100644
index 0000000..11236b8
--- /dev/null
+++ b/polyhal/pagetable/constant.PAGE_SIZE.html
@@ -0,0 +1,2 @@
+PAGE_SIZE in polyhal::pagetable - Rust
\ No newline at end of file
diff --git a/polyhal/pagetable/constant.USER_VADDR_END.html b/polyhal/pagetable/constant.USER_VADDR_END.html
new file mode 100644
index 0000000..e69300d
--- /dev/null
+++ b/polyhal/pagetable/constant.USER_VADDR_END.html
@@ -0,0 +1,2 @@
+USER_VADDR_END in polyhal::pagetable - Rust
\ No newline at end of file
diff --git a/polyhal/pagetable/enum.MappingSize.html b/polyhal/pagetable/enum.MappingSize.html
new file mode 100644
index 0000000..d53fd8d
--- /dev/null
+++ b/polyhal/pagetable/enum.MappingSize.html
@@ -0,0 +1,16 @@
+MappingSize in polyhal::pagetable - Rust
\ No newline at end of file
diff --git a/polyhal/pagetable/index.html b/polyhal/pagetable/index.html
new file mode 100644
index 0000000..05f5647
--- /dev/null
+++ b/polyhal/pagetable/index.html
@@ -0,0 +1,3 @@
+polyhal::pagetable - Rust
\ No newline at end of file
diff --git a/polyhal/pagetable/sidebar-items.js b/polyhal/pagetable/sidebar-items.js
new file mode 100644
index 0000000..13fd71f
--- /dev/null
+++ b/polyhal/pagetable/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"constant":["PAGE_SIZE","USER_VADDR_END"],"enum":["MappingSize"],"struct":["MappingFlags","PTEFlags","PageTable","PageTableWrapper","TLB"]};
\ No newline at end of file
diff --git a/polyhal/pagetable/struct.MappingFlags.html b/polyhal/pagetable/struct.MappingFlags.html
new file mode 100644
index 0000000..d7ed552
--- /dev/null
+++ b/polyhal/pagetable/struct.MappingFlags.html
@@ -0,0 +1,91 @@
+MappingFlags in polyhal::pagetable - Rust
This method is like iter, except only yields bits in contained named flags.
+Any unknown bits, or bits not corresponding to a contained flag will not be yielded.
\ No newline at end of file
diff --git a/polyhal/pagetable/struct.PTEFlags.html b/polyhal/pagetable/struct.PTEFlags.html
new file mode 100644
index 0000000..2481dc7
--- /dev/null
+++ b/polyhal/pagetable/struct.PTEFlags.html
@@ -0,0 +1,76 @@
+PTEFlags in polyhal::pagetable - Rust
This method is like iter, except only yields bits in contained named flags.
+Any unknown bits, or bits not corresponding to a contained flag will not be yielded.
\ No newline at end of file
diff --git a/polyhal/pagetable/struct.PageTable.html b/polyhal/pagetable/struct.PageTable.html
new file mode 100644
index 0000000..e11a599
--- /dev/null
+++ b/polyhal/pagetable/struct.PageTable.html
@@ -0,0 +1,57 @@
+PageTable in polyhal::pagetable - Rust
This is just the page table defination.
+The implementation of the page table in the specific architecture mod.
+Such as:
+x86_64/page_table.rs
+riscv64/page_table/sv39.rs
+aarch64/page_table.rs
+loongarch64/page_table.rs
Mapping a page to specific virtual page (user space address).
+
Ensure that PageTable is which you want to map.
+vpn: Virtual page will be mapped.
+ppn: Physical page.
+flags: Mapping flags, include Read, Write, Execute and so on.
+size: MappingSize. Just support 4KB page currently.
Mapping a page to specific address(kernel space address).
+
TODO: This method is not implemented.
+TIPS: If we mapped to kernel, the page will be shared between different pagetable.
+
Ensure that PageTable is which you want to map.
+vpn: Virtual page will be mapped.
+ppn: Physical page.
+flags: Mapping flags, include Read, Write, Execute and so on.
+size: MappingSize. Just support 4KB page currently.
\ No newline at end of file
diff --git a/polyhal/pagetable/struct.PageTableWrapper.html b/polyhal/pagetable/struct.PageTableWrapper.html
new file mode 100644
index 0000000..6c2b5a6
--- /dev/null
+++ b/polyhal/pagetable/struct.PageTableWrapper.html
@@ -0,0 +1,59 @@
+PageTableWrapper in polyhal::pagetable - Rust
Mapping a page to specific virtual page (user space address).
+
Ensure that PageTable is which you want to map.
+vpn: Virtual page will be mapped.
+ppn: Physical page.
+flags: Mapping flags, include Read, Write, Execute and so on.
+size: MappingSize. Just support 4KB page currently.
Mapping a page to specific address(kernel space address).
+
TODO: This method is not implemented.
+TIPS: If we mapped to kernel, the page will be shared between different pagetable.
+
Ensure that PageTable is which you want to map.
+vpn: Virtual page will be mapped.
+ppn: Physical page.
+flags: Mapping flags, include Read, Write, Execute and so on.
+size: MappingSize. Just support 4KB page currently.
\ No newline at end of file
diff --git a/polyhal/pagetable/struct.TLB.html b/polyhal/pagetable/struct.TLB.html
new file mode 100644
index 0000000..1b9a11e
--- /dev/null
+++ b/polyhal/pagetable/struct.TLB.html
@@ -0,0 +1,27 @@
+TLB in polyhal::pagetable - Rust
\ No newline at end of file
diff --git a/polyhal/percpu/attr.def_percpu.html b/polyhal/percpu/attr.def_percpu.html
new file mode 100644
index 0000000..9236e49
--- /dev/null
+++ b/polyhal/percpu/attr.def_percpu.html
@@ -0,0 +1,4 @@
+def_percpu in polyhal::percpu - Rust
\ No newline at end of file
diff --git a/polyhal/percpu/fn.get_local_thread_pointer.html b/polyhal/percpu/fn.get_local_thread_pointer.html
new file mode 100644
index 0000000..f8b1c7e
--- /dev/null
+++ b/polyhal/percpu/fn.get_local_thread_pointer.html
@@ -0,0 +1,2 @@
+get_local_thread_pointer in polyhal::percpu - Rust
Read the architecture-specific thread pointer register on the current CPU.
+
\ No newline at end of file
diff --git a/polyhal/percpu/fn.percpu_area_init.html b/polyhal/percpu/fn.percpu_area_init.html
new file mode 100644
index 0000000..9ec1204
--- /dev/null
+++ b/polyhal/percpu/fn.percpu_area_init.html
@@ -0,0 +1,3 @@
+percpu_area_init in polyhal::percpu - Rust
Returns the base address of the per-CPU data area on the given CPU.
+
if cpu_id is 0, it returns the base address of all per-CPU data areas.
+
\ No newline at end of file
diff --git a/polyhal/percpu/fn.set_local_thread_pointer.html b/polyhal/percpu/fn.set_local_thread_pointer.html
new file mode 100644
index 0000000..844fd30
--- /dev/null
+++ b/polyhal/percpu/fn.set_local_thread_pointer.html
@@ -0,0 +1,4 @@
+set_local_thread_pointer in polyhal::percpu - Rust
Set the architecture-specific thread pointer register to the per-CPU data
+area base on the current CPU.
+
cpu_id indicates which per-CPU data area to use.
+
\ No newline at end of file
diff --git a/polyhal/percpu/index.html b/polyhal/percpu/index.html
new file mode 100644
index 0000000..c808fae
--- /dev/null
+++ b/polyhal/percpu/index.html
@@ -0,0 +1,3 @@
+polyhal::percpu - Rust
\ No newline at end of file
diff --git a/polyhal/percpu/sidebar-items.js b/polyhal/percpu/sidebar-items.js
new file mode 100644
index 0000000..69ff160
--- /dev/null
+++ b/polyhal/percpu/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"attr":["def_percpu"],"fn":["get_local_thread_pointer","percpu_area_init","set_local_thread_pointer"]};
\ No newline at end of file
diff --git a/polyhal/sidebar-items.js b/polyhal/sidebar-items.js
new file mode 100644
index 0000000..b0861c3
--- /dev/null
+++ b/polyhal/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"attr":["arch_entry","arch_interrupt"],"enum":["MappingSize"],"macro":["pub_use_arch"],"mod":["addr","boot","common","consts","debug_console","instruction","irq","kcontext","macros","mem","multicore","pagetable","percpu","time","timer","trap","trapframe","utils"],"struct":["MappingFlags","PageTable","PageTableWrapper"]};
\ No newline at end of file
diff --git a/polyhal/struct.MappingFlags.html b/polyhal/struct.MappingFlags.html
new file mode 100644
index 0000000..3c340d2
--- /dev/null
+++ b/polyhal/struct.MappingFlags.html
@@ -0,0 +1,91 @@
+MappingFlags in polyhal - Rust
This method is like iter, except only yields bits in contained named flags.
+Any unknown bits, or bits not corresponding to a contained flag will not be yielded.
\ No newline at end of file
diff --git a/polyhal/struct.PageTable.html b/polyhal/struct.PageTable.html
new file mode 100644
index 0000000..d403b91
--- /dev/null
+++ b/polyhal/struct.PageTable.html
@@ -0,0 +1,57 @@
+PageTable in polyhal - Rust
This is just the page table defination.
+The implementation of the page table in the specific architecture mod.
+Such as:
+x86_64/page_table.rs
+riscv64/page_table/sv39.rs
+aarch64/page_table.rs
+loongarch64/page_table.rs
Mapping a page to specific virtual page (user space address).
+
Ensure that PageTable is which you want to map.
+vpn: Virtual page will be mapped.
+ppn: Physical page.
+flags: Mapping flags, include Read, Write, Execute and so on.
+size: MappingSize. Just support 4KB page currently.
Mapping a page to specific address(kernel space address).
+
TODO: This method is not implemented.
+TIPS: If we mapped to kernel, the page will be shared between different pagetable.
+
Ensure that PageTable is which you want to map.
+vpn: Virtual page will be mapped.
+ppn: Physical page.
+flags: Mapping flags, include Read, Write, Execute and so on.
+size: MappingSize. Just support 4KB page currently.
\ No newline at end of file
diff --git a/polyhal/struct.PageTableWrapper.html b/polyhal/struct.PageTableWrapper.html
new file mode 100644
index 0000000..a31b365
--- /dev/null
+++ b/polyhal/struct.PageTableWrapper.html
@@ -0,0 +1,59 @@
+PageTableWrapper in polyhal - Rust
Mapping a page to specific virtual page (user space address).
+
Ensure that PageTable is which you want to map.
+vpn: Virtual page will be mapped.
+ppn: Physical page.
+flags: Mapping flags, include Read, Write, Execute and so on.
+size: MappingSize. Just support 4KB page currently.
Mapping a page to specific address(kernel space address).
+
TODO: This method is not implemented.
+TIPS: If we mapped to kernel, the page will be shared between different pagetable.
+
Ensure that PageTable is which you want to map.
+vpn: Virtual page will be mapped.
+ppn: Physical page.
+flags: Mapping flags, include Read, Write, Execute and so on.
+size: MappingSize. Just support 4KB page currently.
\ No newline at end of file
diff --git a/polyhal/time/index.html b/polyhal/time/index.html
new file mode 100644
index 0000000..de1c6bb
--- /dev/null
+++ b/polyhal/time/index.html
@@ -0,0 +1 @@
+polyhal::time - Rust
\ No newline at end of file
diff --git a/polyhal/time/sidebar-items.js b/polyhal/time/sidebar-items.js
new file mode 100644
index 0000000..523bc91
--- /dev/null
+++ b/polyhal/time/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"struct":["Time"]};
\ No newline at end of file
diff --git a/polyhal/time/struct.Time.html b/polyhal/time/struct.Time.html
new file mode 100644
index 0000000..ea90269
--- /dev/null
+++ b/polyhal/time/struct.Time.html
@@ -0,0 +1,29 @@
+Time in polyhal::time - Rust
\ No newline at end of file
diff --git a/polyhal/timer/fn.init.html b/polyhal/timer/fn.init.html
new file mode 100644
index 0000000..92a8d94
--- /dev/null
+++ b/polyhal/timer/fn.init.html
@@ -0,0 +1 @@
+init in polyhal::timer - Rust
\ No newline at end of file
diff --git a/polyhal/timer/fn.set_next_timeout.html b/polyhal/timer/fn.set_next_timeout.html
new file mode 100644
index 0000000..b43f017
--- /dev/null
+++ b/polyhal/timer/fn.set_next_timeout.html
@@ -0,0 +1 @@
+set_next_timeout in polyhal::timer - Rust
\ No newline at end of file
diff --git a/polyhal/timer/index.html b/polyhal/timer/index.html
new file mode 100644
index 0000000..980ca29
--- /dev/null
+++ b/polyhal/timer/index.html
@@ -0,0 +1,2 @@
+polyhal::timer - Rust
\ No newline at end of file
diff --git a/polyhal/timer/sidebar-items.js b/polyhal/timer/sidebar-items.js
new file mode 100644
index 0000000..4ce0a73
--- /dev/null
+++ b/polyhal/timer/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"fn":["init","set_next_timeout"]};
\ No newline at end of file
diff --git a/polyhal/trap/enum.EscapeReason.html b/polyhal/trap/enum.EscapeReason.html
new file mode 100644
index 0000000..3345c89
--- /dev/null
+++ b/polyhal/trap/enum.EscapeReason.html
@@ -0,0 +1,19 @@
+EscapeReason in polyhal::trap - Rust
\ No newline at end of file
diff --git a/polyhal/trap/enum.TrapType.html b/polyhal/trap/enum.TrapType.html
new file mode 100644
index 0000000..b19cd3a
--- /dev/null
+++ b/polyhal/trap/enum.TrapType.html
@@ -0,0 +1,23 @@
+TrapType in polyhal::trap - Rust
\ No newline at end of file
diff --git a/polyhal/trap/fn.kernelvec.html b/polyhal/trap/fn.kernelvec.html
new file mode 100644
index 0000000..f7e4f78
--- /dev/null
+++ b/polyhal/trap/fn.kernelvec.html
@@ -0,0 +1 @@
+kernelvec in polyhal::trap - Rust
\ No newline at end of file
diff --git a/polyhal/trap/fn.run_user_task.html b/polyhal/trap/fn.run_user_task.html
new file mode 100644
index 0000000..99f9e6f
--- /dev/null
+++ b/polyhal/trap/fn.run_user_task.html
@@ -0,0 +1,2 @@
+run_user_task in polyhal::trap - Rust
\ No newline at end of file
diff --git a/polyhal/trap/fn.run_user_task_forever.html b/polyhal/trap/fn.run_user_task_forever.html
new file mode 100644
index 0000000..3f290e3
--- /dev/null
+++ b/polyhal/trap/fn.run_user_task_forever.html
@@ -0,0 +1,2 @@
+run_user_task_forever in polyhal::trap - Rust
\ No newline at end of file
diff --git a/polyhal/trap/fn.uservec.html b/polyhal/trap/fn.uservec.html
new file mode 100644
index 0000000..cbe68af
--- /dev/null
+++ b/polyhal/trap/fn.uservec.html
@@ -0,0 +1,2 @@
+uservec in polyhal::trap - Rust
\ No newline at end of file
diff --git a/polyhal/trap/index.html b/polyhal/trap/index.html
new file mode 100644
index 0000000..7a312b4
--- /dev/null
+++ b/polyhal/trap/index.html
@@ -0,0 +1,2 @@
+polyhal::trap - Rust
\ No newline at end of file
diff --git a/polyhal/trap/sidebar-items.js b/polyhal/trap/sidebar-items.js
new file mode 100644
index 0000000..e179ec1
--- /dev/null
+++ b/polyhal/trap/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"enum":["EscapeReason","TrapType"],"fn":["kernelvec","run_user_task","run_user_task_forever","uservec"]};
\ No newline at end of file
diff --git a/polyhal/trapframe/constant.TRAPFRAME_SIZE.html b/polyhal/trapframe/constant.TRAPFRAME_SIZE.html
new file mode 100644
index 0000000..f070cfc
--- /dev/null
+++ b/polyhal/trapframe/constant.TRAPFRAME_SIZE.html
@@ -0,0 +1,2 @@
+TRAPFRAME_SIZE in polyhal::trapframe - Rust
\ No newline at end of file
diff --git a/polyhal/trapframe/enum.TrapFrameArgs.html b/polyhal/trapframe/enum.TrapFrameArgs.html
new file mode 100644
index 0000000..12331cd
--- /dev/null
+++ b/polyhal/trapframe/enum.TrapFrameArgs.html
@@ -0,0 +1,23 @@
+TrapFrameArgs in polyhal::trapframe - Rust
\ No newline at end of file
diff --git a/polyhal/trapframe/index.html b/polyhal/trapframe/index.html
new file mode 100644
index 0000000..86680fe
--- /dev/null
+++ b/polyhal/trapframe/index.html
@@ -0,0 +1,2 @@
+polyhal::trapframe - Rust
\ No newline at end of file
diff --git a/polyhal/trapframe/sidebar-items.js b/polyhal/trapframe/sidebar-items.js
new file mode 100644
index 0000000..9337cc9
--- /dev/null
+++ b/polyhal/trapframe/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"constant":["TRAPFRAME_SIZE"],"enum":["TrapFrameArgs"],"struct":["KernelToken","TrapFrame"]};
\ No newline at end of file
diff --git a/polyhal/trapframe/struct.KernelToken.html b/polyhal/trapframe/struct.KernelToken.html
new file mode 100644
index 0000000..f6d62c2
--- /dev/null
+++ b/polyhal/trapframe/struct.KernelToken.html
@@ -0,0 +1,20 @@
+KernelToken in polyhal::trapframe - Rust
\ No newline at end of file
diff --git a/polyhal/trapframe/struct.TrapFrame.html b/polyhal/trapframe/struct.TrapFrame.html
new file mode 100644
index 0000000..369f647
--- /dev/null
+++ b/polyhal/trapframe/struct.TrapFrame.html
@@ -0,0 +1,18 @@
+TrapFrame in polyhal::trapframe - Rust
\ No newline at end of file
diff --git a/polyhal/utils/index.html b/polyhal/utils/index.html
new file mode 100644
index 0000000..5ed4006
--- /dev/null
+++ b/polyhal/utils/index.html
@@ -0,0 +1 @@
+polyhal::utils - Rust
+
+
+
\ No newline at end of file
diff --git a/polyhal/utils/macro.bit.html b/polyhal/utils/macro.bit.html
new file mode 100644
index 0000000..4c7f59f
--- /dev/null
+++ b/polyhal/utils/macro.bit.html
@@ -0,0 +1,7 @@
+bit in polyhal::utils - Rust
+
+
+
\ No newline at end of file
diff --git a/polyhal/utils/sidebar-items.js b/polyhal/utils/sidebar-items.js
new file mode 100644
index 0000000..e046221
--- /dev/null
+++ b/polyhal/utils/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"macro":["bit"],"struct":["LazyInit","MutexNoIrq","MutexNoIrqGuard"]};
\ No newline at end of file
diff --git a/polyhal/utils/struct.LazyInit.html b/polyhal/utils/struct.LazyInit.html
new file mode 100644
index 0000000..a6b9ee0
--- /dev/null
+++ b/polyhal/utils/struct.LazyInit.html
@@ -0,0 +1,17 @@
+LazyInit in polyhal::utils - Rust
\ No newline at end of file
diff --git a/polyhal/utils/struct.MutexNoIrq.html b/polyhal/utils/struct.MutexNoIrq.html
new file mode 100644
index 0000000..a5c09ad
--- /dev/null
+++ b/polyhal/utils/struct.MutexNoIrq.html
@@ -0,0 +1,15 @@
+MutexNoIrq in polyhal::utils - Rust
\ No newline at end of file
diff --git a/polyhal/utils/struct.MutexNoIrqGuard.html b/polyhal/utils/struct.MutexNoIrqGuard.html
new file mode 100644
index 0000000..aae89ad
--- /dev/null
+++ b/polyhal/utils/struct.MutexNoIrqGuard.html
@@ -0,0 +1,16 @@
+MutexNoIrqGuard in polyhal::utils - Rust
\ No newline at end of file
diff --git a/search-index.js b/search-index.js
new file mode 100644
index 0000000..0ddd232
--- /dev/null
+++ b/search-index.js
@@ -0,0 +1,5 @@
+var searchIndex = JSON.parse('{\
+"polyhal":{"doc":"This is a crate to help you supporting multiple platforms.","t":"FGPFFEEEEECXXCCCCCCCCCCCCQCCCCCFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSHKMMHHHHSSSFNNNNNNNNNNNNNFNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNFGPPPNNNNNHHNNNNNNNNHNNNNNNQFNNNNNNNNNFFNHHNNNNNNNNNNNNNNTTTTTTTTTTTFGTSFPFFTTTFTTTTTSTTTTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXHHHFNNNNNNNNNNNNNNNNNNHHPGPPPPPPPPPPPPGPNNNNNNNNNNNNNNNNHHHNNNNNNNNHPPPFPPPPPPSFGONNNNNNNNNNNNNNNOONNNNNNOOOONNONNNNNNNNNOFFFQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN","n":["MappingFlags","MappingSize","Page4KB","PageTable","PageTableWrapper","PhysAddr","PhysPage","Time","VirtAddr","VirtPage","addr","arch_entry","arch_interrupt","boot","common","consts","debug_console","instruction","irq","kcontext","macros","mem","multicore","pagetable","percpu","pub_use_arch","time","timer","trap","trapframe","utils","PhysAddr","PhysPage","VirtAddr","VirtPage","add","add","add","addr","addr","as_num","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","ceil","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","copy_value_from_another","drop_clear","eq","eq","eq","eq","floor","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from_addr","from_addr","get_buffer","get_cstr","get_cstr","get_mut_ptr","get_mut_ptr","get_mut_ref","get_ptr","get_ptr","get_ref","into","into","into","into","new","new","new","new","partial_cmp","partial_cmp","partial_cmp","partial_cmp","pn_index","pn_offest","slice_mut_with_len","slice_mut_with_len","slice_until","slice_with_len","slice_with_len","to_addr","to_addr","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","write_volatile","STACK_SIZE","boot_page_table","PageAlloc","alloc","dealloc","get_cpu_num","get_fdt","get_mem_areas","init","MULTI_CORE_AREA","MULTI_CORE_AREA_SIZE","VIRT_ADDR_START","DebugConsole","borrow","borrow_mut","enabled","flush","from","getchar","into","log","putchar","try_from","try_into","type_id","write_str","Instruction","borrow","borrow_mut","from","hlt","into","shutdown","try_from","try_into","type_id","IRQ","IRQVector","ack","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","fmt","from","from","int_disable","int_enable","int_enabled","into","into","irq_disable","irq_enable","irq_num","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","KContext","KContextArgs","KPC","KSP","KTP","blank","borrow","borrow","borrow_mut","borrow_mut","context_switch","context_switch_pt","fmt","fmt","from","from","index","index_mut","into","into","read_current_tp","try_from","try_from","try_into","try_into","type_id","type_id","pub_use_arch","Barrier","borrow","borrow_mut","complete_sync","from","into","ordering_sync","try_from","try_into","type_id","CpuCore","MultiCore","boot_all","boot_core","boot_core","borrow","borrow","borrow_mut","borrow_mut","from","from","into","into","try_from","try_from","try_into","try_into","type_id","type_id","A","A","ADGVRWX","ADUVRX","ADVRWX","Cache","D","D","Device","G","G","MappingFlags","MappingSize","P","PAGE_SIZE","PTEFlags","Page4KB","PageTable","PageTableWrapper","R","R","RWX","TLB","U","U","URW","URWX","URX","USER_VADDR_END","V","VRWX","W","W","X","X","all","all","all","alloc","bitand","bitand","bitand_assign","bitand_assign","bitor","bitor","bitor_assign","bitor_assign","bits","bits","bits","bits","bits","bitxor","bitxor","bitxor_assign","bitxor_assign","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","change","clone","clone","clone","clone_into","clone_into","clone_into","cmp","cmp","complement","complement","complement","contains","contains","contains","current","deref","difference","difference","difference","drop","empty","empty","empty","eq","eq","extend","extend","flush_all","flush_vaddr","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from_bits","from_bits","from_bits","from_bits_retain","from_bits_retain","from_bits_retain","from_bits_retain","from_bits_retain","from_bits_truncate","from_bits_truncate","from_bits_truncate","from_iter","from_iter","from_name","from_name","from_name","hash","hash","insert","insert","insert","intersection","intersection","intersection","intersects","intersects","intersects","into","into","into","into","into","into","into_iter","into_iter","is_all","is_all","is_all","is_empty","is_empty","is_empty","iter","iter","iter","iter_names","iter_names","iter_names","kernel_pte_entry","map_kernel","map_page","not","not","partial_cmp","partial_cmp","release","remove","remove","remove","restore","set","set","set","sub","sub","sub_assign","sub_assign","symmetric_difference","symmetric_difference","symmetric_difference","to_owned","to_owned","to_owned","toggle","toggle","toggle","translate","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","union","union","union","unmap_page","def_percpu","get_local_thread_pointer","percpu_area_init","set_local_thread_pointer","Time","borrow","borrow_mut","clone","clone_into","fmt","from","from_raw","get_freq","into","now","raw","to_msec","to_nsec","to_owned","to_usec","try_from","try_into","type_id","init","set_next_timeout","Breakpoint","EscapeReason","IRQ","IllegalInstruction","InstructionPageFault","Irq","LoadPageFault","NoReason","StorePageFault","SupervisorExternal","SysCall","SysCall","Timer","Timer","TrapType","Unknown","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","eq","fmt","fmt","from","from","into","into","into","kernelvec","run_user_task","run_user_task_forever","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","uservec","ARG0","ARG1","ARG2","KernelToken","RA","RET","SEPC","SP","SYSCALL","TLS","TRAPFRAME_SIZE","TrapFrame","TrapFrameArgs","a0","args","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","fmt","fmt","from","from","from","from_user","fsx","gp","index","index_mut","into","into","into","new","ra","sepc","sp","sstatus","syscall_ok","to_owned","tp","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","x","LazyInit","MutexNoIrq","MutexNoIrqGuard","bit","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","deref","deref","deref_mut","deref_mut","drop","fmt","force_unlock","from","from","from","get_mut_unchecked","get_unchecked","init_by","into","into","into","into_inner","is_init","is_locked","lock","new","new","try_from","try_from","try_from","try_get","try_into","try_into","try_into","try_lock","type_id","type_id","type_id"],"q":[[0,"polyhal"],[31,"polyhal::addr"],[141,"polyhal::boot"],[143,"polyhal::common"],[150,"polyhal::consts"],[153,"polyhal::debug_console"],[167,"polyhal::instruction"],[177,"polyhal::irq"],[204,"polyhal::kcontext"],[231,"polyhal::macros"],[232,"polyhal::mem"],[242,"polyhal::multicore"],[261,"polyhal::pagetable"],[478,"polyhal::percpu"],[482,"polyhal::time"],[501,"polyhal::timer"],[503,"polyhal::trap"],[547,"polyhal::trapframe"],[601,"polyhal::utils"],[644,"core::cmp"],[645,"core::fmt"],[646,"core::fmt"],[647,"core::option"],[648,"alloc::string"],[649,"core::result"],[650,"core::any"],[651,"fdt"],[652,"alloc::vec"],[653,"log"],[654,"log"],[655,"core::hash"],[656,"bitflags::iter"],[657,"bitflags::iter"],[658,"core::fmt"]],"d":["Mapping flags for page table.","This structure indicates size of the page that will be …","","Page Table","Page Table Wrapper","","","","","","","","","Boot Components.","","Consts components","This is a console for debugging, If you want to use this …","Instruction Module.","IRQ(Interrupt requests queue) module.","Kernel Context module.","","","Multi-core Module.","","Per-cpu module.","","","Timer module.","Define and initialize the trap handler.","Trapframe module.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","Returns the argument unchanged.","","Returns the argument unchanged.","","","","Returns the argument unchanged.","","","","","","","","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","Get n level page table index of the given virtual address","Get n level page table offset of the given virtual address","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Boot Stack Size. TODO: reduce the boot stack size. Map …","Get Boot Page Table.","Page Allocation trait for privoids that page allocation","Allocate a physical page","Release a physical page","Get the number of cpus","Get the fdt","Get the memory area, this function should be called after …","Init arch with page allocator, like log crate Please …","Every core has a unique area of memory. Just using …","","Virtual Address Offset.","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","Platform Instruction [Instruction::ebreak] Intruction …","","","Returns the argument unchanged.","","Calls U::from(self).","Call SBI_SHUTDOWN to close the machine. Exit qemu if you …","","","","","","Acknowledge the irq","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Disable interrupts.","Enable interrupts.","Check if the interrupts was enabled.","Calls U::from(self).","Calls U::from(self).","Disable irq for the given IRQ number.","Enable irq for the given IRQ number.","Get the irq number in this vector","","","","","","","","Kernel Context","Kernel Context Arg Type.","Kernel Program Counter","Kernel Stack Pointer","Kernel Thread Pointer","Create a new blank Kernel Context.","","","","","Context Switch","Context Switch With Page Table","","","Returns the argument unchanged.","Returns the argument unchanged.","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","This is a barrier function.","","","","Returns the argument unchanged.","Calls U::from(self).","","","","","","","Boot all application cores.","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","","","","","","","Accessed Flag","","","","","Cache Flag, indicating that the page will be cached","Dirty Flag, indicating that the page was written","","Device Flag, indicating that the page was used for device …","Global Flag","","Mapping flags for page table.","This structure indicates size of the page that will be …","Persent","The size of the page table.","","","Page Table","Page Table Wrapper","Readable Flag","","Read | Write | Executeable Flags","TLB Operation set. Such as flush_vaddr, flush_all. Just …","User Accessable Flag","","User | Read | Write Flags","User | Read | Write | Executeable Flags","User | Read | Executeable Flags","The max address of the user virtual address.","","","Writeable Flag","","Executeable Flag","","Get a flags value with all known bits set.","Get a flags value with all known bits set.","Get a flags value with all known bits set.","Alloc a new PageTableWrapper with new page table root This …","The bitwise and (&) of the bits in two flags values.","The bitwise and (&) of the bits in two flags values.","The bitwise and (&) of the bits in two flags values.","The bitwise and (&) of the bits in two flags values.","The bitwise or (|) of the bits in two flags values.","The bitwise or (|) of the bits in two flags values.","The bitwise or (|) of the bits in two flags values.","The bitwise or (|) of the bits in two flags values.","Get the underlying bits value.","Get the underlying bits value.","","","Get the underlying bits value.","The bitwise exclusive-or (^) of the bits in two flags …","The bitwise exclusive-or (^) of the bits in two flags …","The bitwise exclusive-or (^) of the bits in two flags …","The bitwise exclusive-or (^) of the bits in two flags …","","","","","","","","","","","","","","","","","","","","","","The bitwise negation (!) of the bits in a flags value, …","The bitwise negation (!) of the bits in a flags value, …","The bitwise negation (!) of the bits in a flags value, …","Whether all set bits in a source flags value are also set …","Whether all set bits in a source flags value are also set …","Whether all set bits in a source flags value are also set …","","","The intersection of a source flags value with the …","The intersection of a source flags value with the …","The intersection of a source flags value with the …","","Get a flags value with all bits unset.","Get a flags value with all bits unset.","Get a flags value with all bits unset.","","","The bitwise or (|) of the bits in each flags value.","The bitwise or (|) of the bits in each flags value.","flush all tlb entry","flush the TLB entry by VirtualAddress just use it directly","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Convert from a bits value.","Convert from a bits value.","Convert from a bits value.","Convert from a bits value exactly.","","Convert from a bits value exactly.","Convert from a bits value exactly.","","Convert from a bits value, unsetting any unknown bits.","Convert from a bits value, unsetting any unknown bits.","Convert from a bits value, unsetting any unknown bits.","The bitwise or (|) of the bits in each flags value.","The bitwise or (|) of the bits in each flags value.","Get a flags value with the bits of a flag with the given …","Get a flags value with the bits of a flag with the given …","Get a flags value with the bits of a flag with the given …","","","The bitwise or (|) of the bits in two flags values.","The bitwise or (|) of the bits in two flags values.","The bitwise or (|) of the bits in two flags values.","The bitwise and (&) of the bits in two flags values.","The bitwise and (&) of the bits in two flags values.","The bitwise and (&) of the bits in two flags values.","Whether any set bits in a source flags value are also set …","Whether any set bits in a source flags value are also set …","Whether any set bits in a source flags value are also set …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","Whether all known bits in this flags value are set.","Whether all known bits in this flags value are set.","Whether all known bits in this flags value are set.","Whether all bits in this flags value are unset.","Whether all bits in this flags value are unset.","Whether all bits in this flags value are unset.","Yield a set of contained flags values.","Yield a set of contained flags values.","Yield a set of contained flags values.","Yield a set of contained named flags values.","Yield a set of contained named flags values.","Yield a set of contained named flags values.","","Mapping a page to specific address(kernel space address).","Mapping a page to specific virtual page (user space …","The bitwise negation (!) of the bits in a flags value, …","The bitwise negation (!) of the bits in a flags value, …","","","Release the page table entry.","The intersection of a source flags value with the …","The intersection of a source flags value with the …","The intersection of a source flags value with the …","","Call insert when value is true or remove when value is …","Call insert when value is true or remove when value is …","Call insert when value is true or remove when value is …","The intersection of a source flags value with the …","The intersection of a source flags value with the …","The intersection of a source flags value with the …","The intersection of a source flags value with the …","The bitwise exclusive-or (^) of the bits in two flags …","The bitwise exclusive-or (^) of the bits in two flags …","The bitwise exclusive-or (^) of the bits in two flags …","","","","The bitwise exclusive-or (^) of the bits in two flags …","The bitwise exclusive-or (^) of the bits in two flags …","The bitwise exclusive-or (^) of the bits in two flags …","Translate a virtual adress to a physical address and …","","","","","","","","","","","","","","","","","","","The bitwise or (|) of the bits in two flags values.","The bitwise or (|) of the bits in two flags values.","The bitwise or (|) of the bits in two flags values.","Unmap a page from specific virtual page (user space …","Defines a per-CPU data structure.","Read the architecture-specific thread pointer register on …","Returns the base address of the per-CPU data area on the …","Set the architecture-specific thread pointer register to …","Time struct and its interface","","","","","","Returns the argument unchanged.","","","Calls U::from(self).","","","","Converts hardware ticks to nanoseconds.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","","Calls U::from(self).","","Return EscapeReson related to interrupt type.","Run user task until interrupt is received.","","","","","","","","","","","","","Kernel Token","","","","","","","The size of the TrapFrame","","Trap Frame Arg Type","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Check if the trapframe was from user.","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","The Mutex Guard.","bit macro will generate the number through a shift value.","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Safety","Safety","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","",""],"i":[0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,4,5,1,4,5,1,3,4,5,1,3,5,4,5,1,3,4,5,1,3,4,5,1,3,1,1,4,5,1,3,5,4,4,5,5,1,1,3,3,4,4,5,5,5,1,1,1,3,3,3,1,3,1,4,5,4,5,5,4,5,5,4,5,1,3,4,5,1,3,4,5,1,3,3,5,4,5,5,4,5,1,3,4,5,1,3,4,5,1,3,4,5,1,3,4,5,1,3,4,5,1,3,4,0,0,0,19,19,0,0,0,0,0,0,0,0,22,22,22,22,22,22,22,22,22,22,22,22,22,0,51,51,51,51,51,51,51,51,51,0,0,27,52,27,52,27,27,27,27,52,27,52,52,52,52,27,52,52,27,27,52,27,52,27,52,27,0,0,29,29,29,28,28,29,28,29,0,0,28,29,28,29,28,28,28,29,0,28,29,28,29,28,29,0,0,53,53,53,53,53,53,53,53,53,0,0,54,0,0,54,55,54,55,54,55,54,55,54,55,54,55,54,55,30,31,31,31,31,30,30,31,30,30,31,0,0,30,0,0,36,0,0,30,31,30,0,30,31,30,30,30,0,31,31,30,31,30,31,30,30,31,32,30,31,30,31,30,31,30,31,30,30,30,31,31,30,31,30,31,56,18,30,36,32,31,56,18,30,36,32,31,18,18,30,31,18,30,31,30,31,30,30,31,30,30,31,18,32,30,30,31,32,30,30,31,30,31,30,31,56,56,18,30,30,30,30,30,36,32,31,31,31,31,31,56,18,30,30,36,32,31,31,30,30,31,30,30,30,31,31,30,30,31,30,31,30,30,31,30,31,30,30,31,30,30,31,30,30,31,56,18,30,36,32,31,30,31,30,30,31,30,30,31,30,30,31,30,30,31,18,18,18,30,31,30,31,18,30,30,31,18,30,30,31,30,31,30,31,30,30,31,18,30,31,30,30,31,18,56,18,30,36,32,31,56,18,30,36,32,31,56,18,30,36,32,31,30,30,31,18,0,0,0,0,0,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,0,0,41,0,42,41,41,41,41,42,41,41,41,42,41,42,0,41,41,42,41,42,41,42,41,42,42,41,42,41,42,41,41,42,0,0,0,41,42,41,42,41,42,41,42,0,45,45,45,0,45,45,45,45,45,45,0,0,0,57,43,57,43,45,57,43,45,43,43,43,45,57,43,45,43,43,57,43,43,57,43,45,43,57,43,57,43,43,43,57,57,43,45,57,43,45,57,43,45,43,0,0,0,0,46,50,47,46,50,47,46,47,46,47,46,46,50,46,50,47,46,46,46,46,50,47,50,46,50,50,46,50,46,50,47,46,46,50,47,50,46,50,47],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[1,2],-1,[]],[[1,1],-1,[]],[[3,2],-1,[]],[4,2],[5,2],[1,2],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[5,5],[4,4],[5,5],[1,1],[3,3],[[-1,-2],6,[],[]],[[-1,-2],6,[],[]],[[-1,-2],6,[],[]],[[-1,-2],6,[],[]],[[4,4],7],[[5,5],7],[[1,1],7],[[3,3],7],[[1,1],6],[1,6],[[4,4],8],[[5,5],8],[[1,1],8],[[3,3],8],[5,5],[[4,9],10],[[4,9],10],[[5,9],10],[[5,9],10],[[1,9],10],[[1,9],10],[[3,9],10],[[3,9],10],[-1,-1,[]],[1,4],[2,5],[3,5],[-1,-1,[]],[2,1],[-1,-1,[]],[4,1],[2,3],[5,3],[-1,-1,[]],[2,1],[2,3],[1,[[12,[11]]]],[4,13],[5,13],[4],[5],[5,-1,[]],[4],[5],[5,-1,[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[2,4],[2,5],[2,1],[2,3],[[4,4],[[14,[7]]]],[[5,5],[[14,[7]]]],[[1,1],[[14,[7]]]],[[3,3],[[14,[7]]]],[[3,2],2],[[5,2],2],[[4,2],[[12,[-1]]],[]],[[5,2],[[12,[-1]]],[]],[5,[[12,[-1]]],[]],[[4,2],[[12,[-1]]],[]],[[5,2],[[12,[-1]]],[]],[1,2],[3,2],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,15,[]],[-1,15,[]],[-1,15,[]],[-1,15,[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,17,[]],[-1,17,[]],[-1,17,[]],[-1,17,[]],[[4,-1],6,[]],0,[[],18],0,[19,1],[[19,1],6],[[],2],[[],[[14,[20]]]],[[],[[21,[[6,[2,2]]]]]],[19,6],0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[[22,23],8],[22,6],[-1,-1,[]],[[],[[14,[11]]]],[-1,-2,[],[]],[[22,24],6],[11,6],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,17,[]],[[22,25],10],0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-1,[]],[[],6],[-1,-2,[],[]],[[],26],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,17,[]],0,0,[27,6],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[27,27],[[-1,-2],6,[],[]],[[27,9],10],[-1,-1,[]],[-1,-1,[]],[[],6],[[],6],[[],8],[-1,-2,[],[]],[-1,-2,[],[]],[2,6],[2,6],[27,2],[-1,-2,[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,17,[]],[-1,17,[]],0,0,0,0,0,[[],28],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[28,28],6],[[28,28,18],6],[[28,9],10],[[29,9],10],[-1,-1,[]],[-1,-1,[]],[[28,29],-1,[]],[[28,29],-1,[]],[-1,-2,[],[]],[-1,-2,[],[]],[[],2],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,17,[]],[-1,17,[]],0,0,[-1,-2,[],[]],[-1,-2,[],[]],[[],6],[-1,-1,[]],[-1,-2,[],[]],[[],6],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,17,[]],0,0,[[],6],[[2,2],6],[[2,2],6],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-1,[]],[-1,-1,[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,17,[]],[-1,17,[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[],30],[[],30],[[],31],[[],32],[[30,30],30],[[31,31],31],[[30,30],6],[[31,31],6],[[30,30],30],[[31,31],31],[[30,30],6],[[31,31],6],[30,33],[30,33],[30,33],[31,33],[31,33],[[30,30],30],[[31,31],31],[[30,30],6],[[31,31],6],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[18,6],[18,18],[30,30],[31,31],[[-1,-2],6,[],[]],[[-1,-2],6,[],[]],[[-1,-2],6,[],[]],[[30,30],7],[[31,31],7],[30,30],[30,30],[31,31],[[30,30],8],[[30,30],8],[[31,31],8],[[],18],[32,-1,[]],[[30,30],30],[[30,30],30],[[31,31],31],[32,6],[[],30],[[],30],[[],31],[[30,30],8],[[31,31],8],[[30,-1],6,[[35,[],[[34,[30]]]]]],[[31,-1],6,[[35,[],[[34,[31]]]]]],[[],6],[5,6],[[18,9],10],[[30,9],10],[[30,9],10],[[30,9],10],[[30,9],10],[[30,9],10],[[36,9],10],[[32,9],10],[[31,9],10],[[31,9],10],[[31,9],10],[[31,9],10],[[31,9],10],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[31,30],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[30,31],[33,[[14,[30]]]],[33,[[14,[30]]]],[33,[[14,[31]]]],[33,30],[33,30],[33,30],[33,31],[33,31],[33,30],[33,30],[33,31],[-1,30,[[35,[],[[34,[30]]]]]],[-1,31,[[35,[],[[34,[31]]]]]],[25,[[14,[30]]]],[25,[[14,[30]]]],[25,[[14,[31]]]],[[30,-1],6,37],[[31,-1],6,37],[[30,30],6],[[30,30],6],[[31,31],6],[[30,30],30],[[30,30],30],[[31,31],31],[[30,30],8],[[30,30],8],[[31,31],8],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[30,-1,[]],[31,-1,[]],[30,8],[30,8],[31,8],[30,8],[30,8],[31,8],[30,[[38,[30]]]],[30,[[38,[30]]]],[31,[[38,[31]]]],[30,[[39,[30]]]],[30,[[39,[30]]]],[31,[[39,[31]]]],[18,4],[[18,3,1,30,36],6],[[18,3,1,30,36],6],[30,30],[31,31],[[30,30],[[14,[7]]]],[[31,31],[[14,[7]]]],[18,6],[[30,30],6],[[30,30],6],[[31,31],6],[18,6],[[30,30,8],6],[[30,30,8],6],[[31,31,8],6],[[30,30],30],[[31,31],31],[[30,30],6],[[31,31],6],[[30,30],30],[[30,30],30],[[31,31],31],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[30,30],6],[[30,30],6],[[31,31],6],[[18,5],[[14,[[6,[4,30]]]]]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,17,[]],[-1,17,[]],[-1,17,[]],[-1,17,[]],[-1,17,[]],[-1,17,[]],[[30,30],30],[[30,30],30],[[31,31],31],[[18,3],6],0,[[],2],[2,2],[2,6],0,[-1,-2,[],[]],[-1,-2,[],[]],[40,40],[[-1,-2],6,[],[]],[[40,9],10],[-1,-1,[]],[2,40],[[],2],[-1,-2,[],[]],[[],40],[40,2],[40,2],[40,2],[-1,-2,[],[]],[40,2],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,17,[]],[[],6],[[],6],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[41,41],[42,42],[[-1,-2],6,[],[]],[[-1,-2],6,[],[]],[[42,42],8],[[41,9],10],[[42,9],10],[-1,-1,[]],[-1,-1,[]],[-1,-2,[],[]],[41,42],[-1,-2,[],[]],[[],6],[43,42],[43,26],[-1,-2,[],[]],[-1,-2,[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,17,[]],[-1,17,[]],[[],6],0,0,0,0,0,0,0,0,0,0,0,0,0,0,[43,[[44,[2]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[43,43],[[-1,-2],6,[],[]],[[43,9],10],[[45,9],10],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[43,8],0,0,[[43,45],-1,[]],[[43,45],-1,[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[],43],0,0,0,0,[43,6],[-1,-2,[],[]],0,[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,17,[]],[-1,17,[]],[-1,17,[]],0,0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[46,[-1]]],-1,[]],[[[47,[-1]]],-1,48],[[[46,[-1]]],-1,[]],[[[47,[-1]]],-1,48],[[[46,[-1]]],6,[]],[[[46,[-1]],9],10,49],[[[50,[-1]]],6,48],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[[[46,[-1]]],-1,[]],[[[46,[-1]]],-1,[]],[[[46,[-1]],-1],6,[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[50,[-1]]],-1,[]],[[[46,[-1]]],8,[]],[[[50,[-1]]],8,48],[[[50,[-1]]],[[47,[-1]]],48],[[],[[46,[-1]]],[]],[-1,[[50,[-1]]],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[[[46,[-1]]],[[14,[-1]]],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[-1,[[16,[-2]]],[],[]],[[[50,[-1]]],[[14,[[47,[-1]]]]],48],[-1,17,[]],[-1,17,[]],[-1,17,[]]],"c":[],"p":[[5,"PhysPage",31],[1,"usize"],[5,"VirtPage",31],[5,"PhysAddr",31],[5,"VirtAddr",31],[1,"tuple"],[6,"Ordering",644],[1,"bool"],[5,"Formatter",645],[8,"Result",645],[1,"u8"],[1,"slice"],[5,"CStr",646],[6,"Option",647],[5,"String",648],[6,"Result",649],[5,"TypeId",650],[5,"PageTable",261],[10,"PageAlloc",143],[5,"Fdt",651],[5,"Vec",652],[5,"DebugConsole",153],[5,"Metadata",653],[5,"Record",653],[1,"str"],[1,"never"],[5,"IRQVector",177],[5,"KContext",204],[6,"KContextArgs",204],[5,"MappingFlags",261],[5,"PTEFlags",261],[5,"PageTableWrapper",261],[1,"u64"],[17,"Item"],[10,"IntoIterator",654],[6,"MappingSize",261],[10,"Hasher",655],[5,"Iter",656],[5,"IterNames",656],[5,"Time",482],[6,"TrapType",503],[6,"EscapeReason",503],[5,"TrapFrame",547],[1,"array"],[6,"TrapFrameArgs",547],[5,"LazyInit",601],[5,"MutexNoIrqGuard",601],[10,"Sized",657],[10,"Debug",645],[5,"MutexNoIrq",601],[5,"Instruction",167],[5,"IRQ",177],[5,"Barrier",232],[5,"MultiCore",242],[5,"CpuCore",242],[5,"TLB",261],[5,"KernelToken",547]],"b":[[35,"impl-Add%3Cusize%3E-for-PhysPage"],[36,"impl-Add-for-PhysPage"],[69,"impl-Display-for-PhysAddr"],[70,"impl-Debug-for-PhysAddr"],[71,"impl-Debug-for-VirtAddr"],[72,"impl-Display-for-VirtAddr"],[73,"impl-Display-for-PhysPage"],[74,"impl-Debug-for-PhysPage"],[75,"impl-Display-for-VirtPage"],[76,"impl-Debug-for-VirtPage"],[79,"impl-From%3Cusize%3E-for-VirtAddr"],[80,"impl-From%3CVirtPage%3E-for-VirtAddr"],[82,"impl-From%3Cusize%3E-for-PhysPage"],[84,"impl-From%3CPhysAddr%3E-for-PhysPage"],[85,"impl-From%3Cusize%3E-for-VirtPage"],[86,"impl-From%3CVirtAddr%3E-for-VirtPage"],[296,"impl-MappingFlags"],[297,"impl-MappingFlags"],[308,"impl-MappingFlags"],[309,"impl-MappingFlags"],[310,"impl-Flags-for-MappingFlags"],[311,"impl-Flags-for-PTEFlags"],[312,"impl-PTEFlags"],[338,"impl-MappingFlags"],[339,"impl-MappingFlags"],[341,"impl-MappingFlags"],[342,"impl-MappingFlags"],[346,"impl-MappingFlags"],[347,"impl-MappingFlags"],[350,"impl-MappingFlags"],[351,"impl-MappingFlags"],[360,"impl-Binary-for-MappingFlags"],[361,"impl-UpperHex-for-MappingFlags"],[362,"impl-Debug-for-MappingFlags"],[363,"impl-LowerHex-for-MappingFlags"],[364,"impl-Octal-for-MappingFlags"],[367,"impl-UpperHex-for-PTEFlags"],[368,"impl-Binary-for-PTEFlags"],[369,"impl-Octal-for-PTEFlags"],[370,"impl-LowerHex-for-PTEFlags"],[371,"impl-Debug-for-PTEFlags"],[380,"impl-MappingFlags"],[381,"impl-MappingFlags"],[383,"impl-MappingFlags"],[384,"impl-Flags-for-MappingFlags"],[385,"impl-MappingFlags"],[386,"impl-PTEFlags"],[387,"impl-Flags-for-PTEFlags"],[388,"impl-MappingFlags"],[389,"impl-MappingFlags"],[393,"impl-MappingFlags"],[394,"impl-MappingFlags"],[398,"impl-MappingFlags"],[399,"impl-MappingFlags"],[401,"impl-MappingFlags"],[402,"impl-MappingFlags"],[404,"impl-MappingFlags"],[405,"impl-MappingFlags"],[415,"impl-MappingFlags"],[416,"impl-MappingFlags"],[418,"impl-MappingFlags"],[419,"impl-MappingFlags"],[421,"impl-MappingFlags"],[422,"impl-MappingFlags"],[424,"impl-MappingFlags"],[425,"impl-MappingFlags"],[435,"impl-MappingFlags"],[436,"impl-MappingFlags"],[439,"impl-MappingFlags"],[440,"impl-MappingFlags"],[446,"impl-MappingFlags"],[447,"impl-MappingFlags"],[452,"impl-MappingFlags"],[453,"impl-MappingFlags"],[474,"impl-MappingFlags"],[475,"impl-MappingFlags"]]}\
+}');
+if (typeof window !== 'undefined' && window.initSearch) {window.initSearch(searchIndex)};
+if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
diff --git a/settings.html b/settings.html
new file mode 100644
index 0000000..b9f4de7
--- /dev/null
+++ b/settings.html
@@ -0,0 +1 @@
+Settings
\ No newline at end of file
diff --git a/src/polyhal/components/arch/mod.rs.html b/src/polyhal/components/arch/mod.rs.html
new file mode 100644
index 0000000..9f71682
--- /dev/null
+++ b/src/polyhal/components/arch/mod.rs.html
@@ -0,0 +1,3 @@
+mod.rs - source
\ No newline at end of file
diff --git a/src/polyhal/components/arch/riscv64.rs.html b/src/polyhal/components/arch/riscv64.rs.html
new file mode 100644
index 0000000..10c0508
--- /dev/null
+++ b/src/polyhal/components/arch/riscv64.rs.html
@@ -0,0 +1,103 @@
+riscv64.rs - source
\ No newline at end of file
diff --git a/src/polyhal/components/boot/mod.rs.html b/src/polyhal/components/boot/mod.rs.html
new file mode 100644
index 0000000..a32da4c
--- /dev/null
+++ b/src/polyhal/components/boot/mod.rs.html
@@ -0,0 +1,47 @@
+mod.rs - source
\ No newline at end of file
diff --git a/src/polyhal/components/boot/riscv64.rs.html b/src/polyhal/components/boot/riscv64.rs.html
new file mode 100644
index 0000000..8e7b830
--- /dev/null
+++ b/src/polyhal/components/boot/riscv64.rs.html
@@ -0,0 +1,401 @@
+riscv64.rs - source
\ No newline at end of file
diff --git a/src/polyhal/components/common.rs.html b/src/polyhal/components/common.rs.html
new file mode 100644
index 0000000..57d09e2
--- /dev/null
+++ b/src/polyhal/components/common.rs.html
@@ -0,0 +1,135 @@
+common.rs - source
use alloc::vec::Vec;
+use fdt::Fdt;
+
+use crate::components::arch::arch_init;
+use crate::{utils::LazyInit, PhysPage};
+
+#[polyhal_macro::def_percpu]
+pub(crate) static CPU_ID: usize = 0;
+
+// TODO: Hide DTB_PTR For arch not yet supported.
+#[allow(dead_code)]
+pub(crate) static DTB_PTR: LazyInit<usize> = LazyInit::new();
+
+/// Page Allocation trait for privoids that page allocation
+pub trait PageAlloc: Sync {
+ /// Allocate a physical page
+ fn alloc(&self) -> PhysPage;
+ /// Release a physical page
+ fn dealloc(&self, ppn: PhysPage);
+}
+
+static PAGE_ALLOC: LazyInit<&dyn PageAlloc> = LazyInit::new();
+
+/// Init arch with page allocator, like log crate
+/// Please initialize the allocator before calling this function.
+pub fn init(page_alloc: &'static dyn PageAlloc) {
+ PAGE_ALLOC.init_by(page_alloc);
+
+ // Init current architecture
+ arch_init();
+}
+
+/// Store the number of cpu, this will fill up by startup function.
+pub(crate) static CPU_NUM: LazyInit<usize> = LazyInit::new();
+
+/// Store the memory area, this will fill up by the arch_init() function in each architecture.
+pub(crate) static MEM_AREA: LazyInit<Vec<(usize, usize)>> = LazyInit::new();
+
+/// Store the DTB_area, this will fill up by the arch_init() function in each architecture
+pub(crate) static DTB_BIN: LazyInit<Vec<u8>> = LazyInit::new();
+
+/// Get the memory area, this function should be called after initialization
+pub fn get_mem_areas() -> Vec<(usize, usize)> {
+ MEM_AREA.clone()
+}
+
+/// Get the fdt
+pub fn get_fdt() -> Option<Fdt<'static>> {
+ Fdt::new(&DTB_BIN).ok()
+}
+
+/// Get the number of cpus
+pub fn get_cpu_num() -> usize {
+ *CPU_NUM
+}
+
+/// alloc a persistent memory page
+#[inline]
+pub(crate) fn frame_alloc() -> PhysPage {
+ PAGE_ALLOC.alloc()
+}
+
+/// release a frame
+#[inline]
+pub(crate) fn frame_dealloc(ppn: PhysPage) {
+ PAGE_ALLOC.dealloc(ppn)
+}
+
\ No newline at end of file
diff --git a/src/polyhal/components/consts/mod.rs.html b/src/polyhal/components/consts/mod.rs.html
new file mode 100644
index 0000000..6122672
--- /dev/null
+++ b/src/polyhal/components/consts/mod.rs.html
@@ -0,0 +1,33 @@
+mod.rs - source
\ No newline at end of file
diff --git a/src/polyhal/components/consts/riscv64.rs.html b/src/polyhal/components/consts/riscv64.rs.html
new file mode 100644
index 0000000..4765f60
--- /dev/null
+++ b/src/polyhal/components/consts/riscv64.rs.html
@@ -0,0 +1,27 @@
+riscv64.rs - source
/// Every core has a unique area of memory.
+/// Just using pagetable to map multi core area.
+/// Area size: 0x100_0000 (16MBytes)
+///
+/// First Area is 0xFFFF_FFC2_0000_0000
+/// Next Area is 0xFFFF_FFC2_0100_0000
+/// Others Same as This, so it will support 16 * 16 = 256 cores (Only auxiliary Harts).
+pub const MULTI_CORE_AREA: usize = 0xFFFF_FFC2_0000_0000;
+pub const MULTI_CORE_AREA_SIZE: usize = 0x100_0000;
+
+impl super::ConfigTrait for super::GenericConfig {
+ const VIRT_ADDR: usize = 0xffff_ffc0_0000_0000;
+}
+
\ No newline at end of file
diff --git a/src/polyhal/components/debug_console/mod.rs.html b/src/polyhal/components/debug_console/mod.rs.html
new file mode 100644
index 0000000..09f1446
--- /dev/null
+++ b/src/polyhal/components/debug_console/mod.rs.html
@@ -0,0 +1,255 @@
+mod.rs - source
//! This is a console for debugging,
+//! If you want to use this logging
+//! You need to use like this:
+//!
+//! #### Put a char to output device(always uart)
+//! ```rust
+//! DebugConsole::putchar(b'3');
+//! ```
+//!
+//! ### Get a char from input device(always uart)
+//! ```rust
+//! DebugConsole::getchar();
+//! ```
+
+super::define_arch_mods!();
+
+use core::fmt::Write;
+
+/// Print macro to print polyhal information with newline
+pub(crate) macro println {
+ () => {
+ $crate::components::debug_console::_print(format_args!("\n"))
+ },
+ ($fmt: expr $(, $($arg: tt)+)?) => {
+ $crate::components::debug_console::_print(format_args!("{}\n", format_args!($fmt $(, $($arg)+)?)))
+ },
+}
+
+/// Display Platform Information with specified format
+/// display_info!("item name", "{}", "format");
+/// The output format like below:
+/// item name : format
+pub(crate) macro display_info{
+ () => {
+ $crate::components::debug_console::_print(format_args!("\n"))
+ },
+ ($item:expr,$fmt: expr $(, $($arg: tt)+)?) => {
+ $crate::components::debug_console::_print(format_args!("{:<26}: {}\n", $item, format_args!($fmt $(, $($arg)+)?)))
+ }
+}
+
+/// Print the given arguments
+#[inline]
+pub(crate) fn _print(args: core::fmt::Arguments) {
+ DebugConsole.write_fmt(args).expect("can't print arguments");
+}
+
+pub struct DebugConsole;
+
+// Write string through DebugConsole
+impl Write for DebugConsole {
+ fn write_str(&mut self, s: &str) -> core::fmt::Result {
+ s.as_bytes().iter().for_each(|x| Self::putchar(*x));
+ Ok(())
+ }
+}
+
+#[cfg(feature = "logger")]
+impl log::Log for DebugConsole {
+ fn enabled(&self, _metadata: &log::Metadata) -> bool {
+ true
+ }
+
+ fn log(&self, record: &log::Record) {
+ use log::Level;
+
+ let file = record.module_path();
+ let line = record.line();
+ #[cfg(all(target_arch = "x86_64", feature = "graphic"))]
+ {
+ let color_code = match record.level() {
+ Level::Error => 0xff0000u32, // Red
+ Level::Warn => 0xFFFF00, // BrightYellow
+ Level::Info => 0x33ccff, // Blue
+ Level::Debug => 0x00ff00, // Green
+ Level::Trace => 0xaaaaaa, // BrightBlack
+ };
+ DebugConsole::set_color(color_code);
+ println!(
+ "[{}] <{}:{}> {}",
+ record.level(),
+ file.unwrap(),
+ line.unwrap(),
+ record.args()
+ );
+ DebugConsole::set_color(0xffffff);
+ }
+ #[cfg(not(all(target_arch = "x86_64", feature = "graphic")))]
+ {
+ let color_code = match record.level() {
+ Level::Error => 31u8, // Red
+ Level::Warn => 93, // BrightYellow
+ Level::Info => 34, // Blue
+ Level::Debug => 32, // Green
+ Level::Trace => 90, // BrightBlack
+ };
+ println!(
+ "\u{1B}[{}m\
+ [{}] <{}:{}> {}\
+ \u{1B}[0m",
+ color_code,
+ record.level(),
+ file.unwrap(),
+ line.unwrap(),
+ record.args()
+ );
+ }
+ }
+
+ fn flush(&self) {}
+}
+
+#[cfg(feature = "logger")]
+impl DebugConsole {
+ pub(crate) fn log_init() {
+ use log::LevelFilter;
+ log::set_logger(&DebugConsole).unwrap();
+ log::set_max_level(match option_env!("LOG") {
+ Some("error") => LevelFilter::Error,
+ Some("warn") => LevelFilter::Warn,
+ Some("info") => LevelFilter::Info,
+ Some("debug") => LevelFilter::Debug,
+ Some("trace") => LevelFilter::Trace,
+ _ => LevelFilter::Debug,
+ });
+ }
+}
+
\ No newline at end of file
diff --git a/src/polyhal/components/debug_console/riscv64.rs.html b/src/polyhal/components/debug_console/riscv64.rs.html
new file mode 100644
index 0000000..b0db078
--- /dev/null
+++ b/src/polyhal/components/debug_console/riscv64.rs.html
@@ -0,0 +1,43 @@
+riscv64.rs - source
use crate::components::debug_console::DebugConsole;
+
+
+/// Debug console function.
+impl DebugConsole {
+ #[inline]
+ #[allow(deprecated)]
+ pub fn putchar(ch: u8) {
+ sbi_rt::legacy::console_putchar(ch as _);
+ }
+
+ #[inline]
+ #[allow(deprecated)]
+ pub fn getchar() -> Option<u8> {
+ let c = sbi_rt::legacy::console_getchar() as u8;
+ match c == u8::MAX {
+ true => None,
+ _ => Some(c),
+ }
+ }
+}
+
\ No newline at end of file
diff --git a/src/polyhal/components/instruction/mod.rs.html b/src/polyhal/components/instruction/mod.rs.html
new file mode 100644
index 0000000..cb9d692
--- /dev/null
+++ b/src/polyhal/components/instruction/mod.rs.html
@@ -0,0 +1,23 @@
+mod.rs - source
//! Instruction Module.
+//!
+//! This module contains the instruction of the different architectures.
+//!
+
+super::define_arch_mods!();
+
+/// Platform Instruction
+/// [Instruction::ebreak] Intruction Breakpoint
+///
+pub struct Instruction;
+
\ No newline at end of file
diff --git a/src/polyhal/components/instruction/riscv64.rs.html b/src/polyhal/components/instruction/riscv64.rs.html
new file mode 100644
index 0000000..9dd72bd
--- /dev/null
+++ b/src/polyhal/components/instruction/riscv64.rs.html
@@ -0,0 +1,27 @@
+riscv64.rs - source
\ No newline at end of file
diff --git a/src/polyhal/components/instruction/riscv64/shutdown.rs.html b/src/polyhal/components/instruction/riscv64/shutdown.rs.html
new file mode 100644
index 0000000..5d59c13
--- /dev/null
+++ b/src/polyhal/components/instruction/riscv64/shutdown.rs.html
@@ -0,0 +1,23 @@
+shutdown.rs - source
use crate::components::instruction::Instruction;
+
+impl Instruction {
+ /// Call SBI_SHUTDOWN to close the machine. Exit qemu if you are using qemu.
+ #[inline]
+ pub fn shutdown() -> ! {
+ // sbi_rt::legacy::shutdown();
+ sbi_rt::system_reset(sbi_rt::Shutdown, sbi_rt::NoReason);
+ unreachable!()
+ }
+}
+
\ No newline at end of file
diff --git a/src/polyhal/components/irq/mod.rs.html b/src/polyhal/components/irq/mod.rs.html
new file mode 100644
index 0000000..e01a716
--- /dev/null
+++ b/src/polyhal/components/irq/mod.rs.html
@@ -0,0 +1,71 @@
+mod.rs - source
//! IRQ(Interrupt requests queue) module.
+//!
+//! How to use this interface.
+//! ```rust
+//! // Init irq
+//! IRQ::init();
+//! [IRQ::irq_enable]
+//! // Enable irq 3
+//! IRQ::irq_enable(3);
+//! [IRQ::irq_disable]
+//! // Disable irq 3
+//! IRQ::irq_disable(3);
+//! [IRQ::irq_enabled]
+//! // Check if irq is enabled
+//! // Return true if the irq is enabled.
+//! IRQ::irq_enabled(3);
+//! [IRQ::int_enable]
+//! // Enable interrupt
+//! IRQ::int_enable();
+//! [IRQ::int_disable]
+//! // Disable interrupt
+//! IRQ::int_disable();
+//! [IRQ::int_enabled]
+//! // Check if interrupt is enabled
+//! let enabled = IRQ::int_enabled();
+//! ```
+
+super::define_arch_mods!();
+
+pub struct IRQ;
+
+impl IRQ {}
+
+#[derive(Debug, Clone, Copy)]
+pub struct IRQVector(pub(crate) usize);
+
\ No newline at end of file
diff --git a/src/polyhal/components/irq/riscv64.rs.html b/src/polyhal/components/irq/riscv64.rs.html
new file mode 100644
index 0000000..43ac4f5
--- /dev/null
+++ b/src/polyhal/components/irq/riscv64.rs.html
@@ -0,0 +1,103 @@
+riscv64.rs - source
use riscv::register::sstatus::{self, clear_sie, set_sie};
+
+use crate::components::irq::{IRQVector, IRQ};
+
+/// Implement IRQ operations for the IRQ interface.
+impl IRQ {
+ /// Enable irq for the given IRQ number.
+ #[inline]
+ pub fn irq_enable(_irq_num: usize) {
+ log::warn!("irq not implemented in riscv platform yet");
+ }
+
+ /// Disable irq for the given IRQ number.
+ #[inline]
+ pub fn irq_disable(_irq_num: usize) {
+ log::warn!("irq not implemented in riscv platform yet");
+ }
+
+ /// Enable interrupts.
+ #[inline]
+ pub fn int_enable() {
+ unsafe { set_sie() }
+ }
+
+ /// Disable interrupts.
+ #[inline]
+ pub fn int_disable() {
+ unsafe { clear_sie() }
+ }
+
+ /// Check if the interrupts was enabled.
+ #[inline]
+ pub fn int_enabled() -> bool {
+ sstatus::read().sie()
+ }
+}
+
+/// Implmente the irq vector methods
+impl IRQVector {
+ /// Get the irq number in this vector
+ #[inline]
+ pub fn irq_num(&self) -> usize {
+ log::warn!("ack not implemented in riscv platform yet");
+ self.0
+ }
+
+ /// Acknowledge the irq
+ pub fn ack(&self) {
+ log::warn!("ack not implemented in riscv platform yet");
+ }
+}
+
\ No newline at end of file
diff --git a/src/polyhal/components/kcontext/mod.rs.html b/src/polyhal/components/kcontext/mod.rs.html
new file mode 100644
index 0000000..29084a3
--- /dev/null
+++ b/src/polyhal/components/kcontext/mod.rs.html
@@ -0,0 +1,37 @@
+mod.rs - source
//! Kernel Context module.
+//!
+//!
+
+super::define_arch_mods!();
+
+/// Kernel Context Arg Type.
+///
+/// Using this by Index and IndexMut trait bound on KContext.
+#[derive(Debug)]
+pub enum KContextArgs {
+ /// Kernel Stack Pointer
+ KSP,
+ /// Kernel Thread Pointer
+ KTP,
+ /// Kernel Program Counter
+ KPC,
+}
+
\ No newline at end of file
diff --git a/src/polyhal/components/kcontext/riscv64.rs.html b/src/polyhal/components/kcontext/riscv64.rs.html
new file mode 100644
index 0000000..3eb5551
--- /dev/null
+++ b/src/polyhal/components/kcontext/riscv64.rs.html
@@ -0,0 +1,403 @@
+riscv64.rs - source
use core::{
+ arch::asm,
+ ops::{Index, IndexMut},
+};
+
+use crate::PageTable;
+
+use crate::components::kcontext::KContextArgs;
+
+/// Save the task context registers.
+macro_rules! save_kcontext_regs {
+ () => {
+ "
+ sd sp, 0*8(a0)
+ sd tp, 1*8(a0)
+ sd s0, 2*8(a0)
+ sd s1, 3*8(a0)
+ sd s2, 4*8(a0)
+ sd s3, 5*8(a0)
+ sd s4, 6*8(a0)
+ sd s5, 7*8(a0)
+ sd s6, 8*8(a0)
+ sd s7, 9*8(a0)
+ sd s8, 10*8(a0)
+ sd s9, 11*8(a0)
+ sd s10, 12*8(a0)
+ sd s11, 13*8(a0)
+ sd ra, 14*8(a0)
+ "
+ };
+}
+
+/// Restore the task context registers.
+macro_rules! restore_kcontext_regs {
+ () => {
+ "
+ ld sp, 0*8(a1)
+ ld tp, 1*8(a1)
+ ld s0, 2*8(a1)
+ ld s1, 3*8(a1)
+ ld s2, 4*8(a1)
+ ld s3, 5*8(a1)
+ ld s4, 6*8(a1)
+ ld s5, 7*8(a1)
+ ld s6, 8*8(a1)
+ ld s7, 9*8(a1)
+ ld s8, 10*8(a1)
+ ld s9, 11*8(a1)
+ ld s10, 12*8(a1)
+ ld s11, 13*8(a1)
+ ld ra, 14*8(a1)
+ "
+ };
+}
+
+/// Return instruction wrapper.
+macro_rules! ret {
+ () => {
+ "ret"
+ };
+}
+
+/// Kernel Context
+///
+/// Kernel Context is used to switch context between kernel task.
+#[derive(Debug)]
+#[repr(C)]
+pub struct KContext {
+ /// Kernel Stack Pointer
+ ksp: usize,
+ /// Kernel Thread Pointer
+ ktp: usize,
+ /// Kernel S regs, s0 - s11, just callee-saved registers
+ /// just used in the context_switch function.
+ _sregs: [usize; 12],
+ /// Kernel Program Counter, Will return to this address.
+ kpc: usize,
+}
+
+impl KContext {
+ /// Create a new blank Kernel Context.
+ pub fn blank() -> Self {
+ Self {
+ ksp: 0,
+ ktp: 0,
+ _sregs: [0; 12],
+ kpc: 0,
+ }
+ }
+}
+
+/// Indexing operations for KContext
+///
+/// Using it just like the Vector.
+///
+/// #[derive(Debug)]
+/// pub enum KContextArgs {
+/// /// Kernel Stack Pointer
+/// KSP,
+/// /// Kernel Thread Pointer
+/// KTP,
+/// /// Kernel Program Counter
+/// KPC
+/// }
+///
+/// etc. Get reg of the kernel stack:
+///
+/// let ksp = KContext[KContextArgs::KSP]
+/// let kpc = KContext[KContextArgs::KPC]
+/// let ktp = KContext[KContextArgs::KTP]
+///
+impl Index<KContextArgs> for KContext {
+ type Output = usize;
+
+ fn index(&self, index: KContextArgs) -> &Self::Output {
+ match index {
+ KContextArgs::KSP => &self.ksp,
+ KContextArgs::KTP => &self.ktp,
+ KContextArgs::KPC => &self.kpc,
+ }
+ }
+}
+
+/// Indexing Mutable operations for KContext
+///
+/// Using it just like the Vector.
+///
+/// etc. Change the value of the kernel Context using IndexMut
+///
+/// ```Rust
+/// KContext[KContextArgs::KSP] = ksp;
+/// KContext[KContextArgs::KPC] = kpc;
+/// KContext[KContextArgs::KTP] = ktp;
+/// ```
+///
+impl IndexMut<KContextArgs> for KContext {
+ fn index_mut(&mut self, index: KContextArgs) -> &mut Self::Output {
+ match index {
+ KContextArgs::KSP => &mut self.ksp,
+ KContextArgs::KTP => &mut self.ktp,
+ KContextArgs::KPC => &mut self.kpc,
+ }
+ }
+}
+
+/// Context Switch
+///
+/// Save the context of current task and switch to new task.
+#[naked]
+pub unsafe extern "C" fn context_switch(from: *mut KContext, to: *const KContext) {
+ core::arch::asm!(
+ // Save Kernel Context.
+ save_kcontext_regs!(),
+ // Restore Kernel Context.
+ restore_kcontext_regs!(),
+ // Return to the caller.
+ ret!(),
+ options(noreturn)
+ )
+}
+
+/// Context Switch With Page Table
+///
+/// Save the context of current task and switch to new task.
+#[naked]
+pub unsafe extern "C" fn context_switch_pt(
+ from: *mut KContext,
+ to: *const KContext,
+ pt_token: PageTable,
+) {
+ core::arch::asm!(
+ // Save Kernel Context.
+ save_kcontext_regs!(),
+ // Switch to new page table.
+ "
+ srli a2, a2, 12
+ li a3, 8 << 60
+ or a2, a2, a3
+ csrw satp, a2
+ sfence.vma
+ ",
+ // Restore Kernel Context.
+ restore_kcontext_regs!(),
+ // Return to the caller.
+ ret!(),
+ options(noreturn)
+ )
+}
+
+#[naked]
+pub extern "C" fn read_current_tp() -> usize {
+ unsafe {
+ asm!(
+ "
+ mv a0, tp
+ ret
+ ",
+ options(noreturn)
+ )
+ }
+}
+
\ No newline at end of file
diff --git a/src/polyhal/components/macros.rs.html b/src/polyhal/components/macros.rs.html
new file mode 100644
index 0000000..0ccc399
--- /dev/null
+++ b/src/polyhal/components/macros.rs.html
@@ -0,0 +1,79 @@
+macros.rs - source
\ No newline at end of file
diff --git a/src/polyhal/components/mem/mod.rs.html b/src/polyhal/components/mem/mod.rs.html
new file mode 100644
index 0000000..7849468
--- /dev/null
+++ b/src/polyhal/components/mem/mod.rs.html
@@ -0,0 +1,17 @@
+mod.rs - source
super::define_arch_mods!();
+
+/// This is a barrier function.
+///
+/// This struct has two functions.
+/// [`Barrier::complete_sync`]: ensures the correct sequencing of instructions
+/// [`Barrier::ordering_sync`]: ensures the visibility and consistency of memory operations
+pub struct Barrier;
+
\ No newline at end of file
diff --git a/src/polyhal/components/mem/riscv64.rs.html b/src/polyhal/components/mem/riscv64.rs.html
new file mode 100644
index 0000000..1f5d8df
--- /dev/null
+++ b/src/polyhal/components/mem/riscv64.rs.html
@@ -0,0 +1,19 @@
+riscv64.rs - source
\ No newline at end of file
diff --git a/src/polyhal/components/mod.rs.html b/src/polyhal/components/mod.rs.html
new file mode 100644
index 0000000..edc1223
--- /dev/null
+++ b/src/polyhal/components/mod.rs.html
@@ -0,0 +1,49 @@
+mod.rs - source
//! General components of the multi-architecture.
+//!
+//!
+
+pub(crate) mod arch;
+pub mod boot;
+pub mod common;
+pub mod consts;
+pub mod debug_console;
+pub mod instruction;
+pub mod irq;
+pub mod kcontext;
+pub mod macros;
+pub mod mem;
+#[cfg(feature = "multicore")]
+pub mod multicore;
+pub mod pagetable;
+pub mod percpu;
+pub mod timer;
+#[cfg(feature = "trap")]
+pub mod trap;
+pub mod trapframe;
+
+use polyhal_macro::define_arch_mods;
+
\ No newline at end of file
diff --git a/src/polyhal/components/multicore/mod.rs.html b/src/polyhal/components/multicore/mod.rs.html
new file mode 100644
index 0000000..45cd0d0
--- /dev/null
+++ b/src/polyhal/components/multicore/mod.rs.html
@@ -0,0 +1,67 @@
+mod.rs - source
//! Multi-core Module.
+//!
+//! This is a leader for the multicore operation
+//!
+//! You can use this function to use the multicore operation
+//!
+//! Boot other calls after the multicore
+//! If you use this function call, you should call it after arch::init(..);
+//! This function will allocate the stack and map it for itself.
+//!
+//! ```rust
+//! Multicore::boot_all();
+//! ```
+//!
+//! Here will have more functionality about multicore in the future.
+//!
+
+use crate::{pub_use_arch, utils::MutexNoIrq};
+
+pub struct MultiCore;
+
+static CORE_SET: MutexNoIrq<u64> = MutexNoIrq::new(0);
+
+pub struct CpuCore;
+
+/// Initialize the core with boot_hart_id
+pub(crate) fn init(boot_hart_id: usize) {
+ let mut set = CORE_SET.lock();
+ *set |= 1 << boot_hart_id;
+}
+
+super::define_arch_mods!();
+pub_use_arch!(boot_core);
+
\ No newline at end of file
diff --git a/src/polyhal/components/multicore/riscv64.rs.html b/src/polyhal/components/multicore/riscv64.rs.html
new file mode 100644
index 0000000..a92a913
--- /dev/null
+++ b/src/polyhal/components/multicore/riscv64.rs.html
@@ -0,0 +1,131 @@
+riscv64.rs - source
use crate::{
+ boot::secondary_start,
+ common::{frame_alloc, CPU_ID, CPU_NUM},
+ consts::{MULTI_CORE_AREA, MULTI_CORE_AREA_SIZE, VIRT_ADDR_START},
+ multicore::MultiCore,
+ MappingFlags, MappingSize, PageTable,
+};
+
+// TODO: Boot a core with top pointer of the stack
+pub fn boot_core(cpu: usize, sp_top: usize) {
+ if cpu == CPU_ID.read_current() {
+ return;
+ };
+
+ // PERCPU DATA ADDRESS RANGE END
+ let aux_core_func = (secondary_start as usize) & (!VIRT_ADDR_START);
+
+ log::info!("secondary addr: {:#x}", secondary_start as usize);
+ let ret = sbi_rt::hart_start(cpu, aux_core_func, sp_top);
+ if ret.is_ok() {
+ log::info!("hart {} Startting successfully", cpu);
+ } else {
+ log::warn!("hart {} Startting failed", cpu)
+ }
+}
+
+/// Implement the function for multicore
+impl MultiCore {
+ /// Boot all application cores.
+ pub fn boot_all() {
+ use crate::addr::VirtPage;
+ use crate::components::boot::secondary_start;
+
+ let page_table = PageTable::current();
+
+ (0..*CPU_NUM).into_iter().for_each(|cpu| {
+ if cpu == CPU_ID.read_current() {
+ return;
+ };
+
+ // PERCPU DATA ADDRESS RANGE END
+ let cpu_addr_end = MULTI_CORE_AREA + (cpu + 1) * MULTI_CORE_AREA_SIZE;
+ let aux_core_func = (secondary_start as usize) & (!VIRT_ADDR_START);
+
+ // Ready to build multi core area.
+ // default stack size is 512K
+ for i in 0..128 {
+ page_table.map_kernel(
+ VirtPage::from_addr(cpu_addr_end - i * PageTable::PAGE_SIZE - 1),
+ frame_alloc(),
+ MappingFlags::RWX | MappingFlags::G,
+ MappingSize::Page4KB,
+ )
+ }
+
+ log::info!("secondary addr: {:#x}", secondary_start as usize);
+ let ret = sbi_rt::hart_start(cpu, aux_core_func, cpu_addr_end);
+ if ret.is_ok() {
+ log::info!("hart {} Startting successfully", cpu);
+ } else {
+ log::warn!("hart {} Startting failed", cpu)
+ }
+ });
+ }
+}
+
\ No newline at end of file
diff --git a/src/polyhal/components/pagetable/mod.rs.html b/src/polyhal/components/pagetable/mod.rs.html
new file mode 100644
index 0000000..98422e6
--- /dev/null
+++ b/src/polyhal/components/pagetable/mod.rs.html
@@ -0,0 +1,703 @@
+mod.rs - source
super::define_arch_mods!();
+
+use core::ops::Deref;
+
+use crate::{components::common::frame_alloc, utils::bit, PhysAddr, PhysPage, VirtAddr, VirtPage};
+
+use super::common::frame_dealloc;
+
+/// The size of the page table.
+pub const PAGE_SIZE: usize = PageTable::PAGE_SIZE;
+/// The max address of the user virtual address.
+pub const USER_VADDR_END: usize = PageTable::USER_VADDR_END;
+
+/// Page table entry structure
+///
+/// Just define here. Should implement functions in specific architectures.
+#[derive(Copy, Clone, Debug)]
+pub(crate) struct PTE(pub usize);
+
+/// Page Table
+///
+/// This is just the page table defination.
+/// The implementation of the page table in the specific architecture mod.
+/// Such as:
+/// x86_64/page_table.rs
+/// riscv64/page_table/sv39.rs
+/// aarch64/page_table.rs
+/// loongarch64/page_table.rs
+#[repr(C)]
+#[derive(Debug, Clone, Copy)]
+pub struct PageTable(pub(crate) PhysAddr);
+
+impl PageTable {
+ /// Get the page table list through the physical address
+ #[inline]
+ pub(crate) fn get_pte_list(paddr: PhysAddr) -> &'static mut [PTE] {
+ paddr.slice_mut_with_len::<PTE>(Self::PTE_NUM_IN_PAGE)
+ }
+
+ /// Mapping a page to specific virtual page (user space address).
+ ///
+ /// Ensure that PageTable is which you want to map.
+ /// vpn: Virtual page will be mapped.
+ /// ppn: Physical page.
+ /// flags: Mapping flags, include Read, Write, Execute and so on.
+ /// size: MappingSize. Just support 4KB page currently.
+ pub fn map_page(&self, vpn: VirtPage, ppn: PhysPage, flags: MappingFlags, _size: MappingSize) {
+ assert!(
+ vpn.to_addr() <= Self::USER_VADDR_END,
+ "You only should use the address limited by user"
+ );
+ assert!(Self::PAGE_LEVEL >= 3, "Just level >= 3 supported currently");
+ let mut pte_list = Self::get_pte_list(self.0);
+ if Self::PAGE_LEVEL == 4 {
+ let pte = &mut pte_list[vpn.pn_index(3)];
+ if !pte.is_valid() {
+ *pte = PTE::new_table(frame_alloc());
+ }
+ pte_list = Self::get_pte_list(pte.address());
+ }
+ // level 3
+ {
+ let pte = &mut pte_list[vpn.pn_index(2)];
+ if !pte.is_valid() {
+ *pte = PTE::new_table(frame_alloc());
+ }
+ pte_list = Self::get_pte_list(pte.address());
+ }
+ // level 2
+ {
+ let pte = &mut pte_list[vpn.pn_index(1)];
+ if !pte.is_valid() {
+ *pte = PTE::new_table(frame_alloc());
+ }
+ pte_list = Self::get_pte_list(pte.address());
+ }
+ // level 1, map page
+ pte_list[vpn.pn_index(0)] = PTE::new_page(ppn, flags.into());
+ TLB::flush_vaddr(vpn.into());
+ }
+
+ /// Mapping a page to specific address(kernel space address).
+ ///
+ /// TODO: This method is not implemented.
+ /// TIPS: If we mapped to kernel, the page will be shared between different pagetable.
+ ///
+ /// Ensure that PageTable is which you want to map.
+ /// vpn: Virtual page will be mapped.
+ /// ppn: Physical page.
+ /// flags: Mapping flags, include Read, Write, Execute and so on.
+ /// size: MappingSize. Just support 4KB page currently.
+ ///
+ /// How to implement shared.
+ pub fn map_kernel(
+ &self,
+ vpn: VirtPage,
+ ppn: PhysPage,
+ flags: MappingFlags,
+ _size: MappingSize,
+ ) {
+ assert!(
+ vpn.to_addr() >= Self::KERNEL_VADDR_START,
+ "Virt page should greater than Self::KERNEL_VADDR_START"
+ );
+ assert!(Self::PAGE_LEVEL >= 3, "Just level >= 3 supported currently");
+ let mut pte_list = Self::get_pte_list(self.0);
+ if Self::PAGE_LEVEL == 4 {
+ let pte = &mut pte_list[vpn.pn_index(3)];
+ if !pte.is_valid() {
+ *pte = PTE::new_table(frame_alloc());
+ }
+ pte_list = Self::get_pte_list(pte.address());
+ }
+ // level 3
+ {
+ let pte = &mut pte_list[vpn.pn_index(2)];
+ if !pte.is_valid() {
+ *pte = PTE::new_table(frame_alloc());
+ }
+ pte_list = Self::get_pte_list(pte.address());
+ }
+ // level 2
+ {
+ let pte = &mut pte_list[vpn.pn_index(1)];
+ if !pte.is_valid() {
+ *pte = PTE::new_table(frame_alloc());
+ }
+ pte_list = Self::get_pte_list(pte.address());
+ }
+ // level 1, map page
+ pte_list[vpn.pn_index(0)] = PTE::new_page(ppn, flags.into());
+ TLB::flush_vaddr(vpn.into());
+ }
+
+ /// Unmap a page from specific virtual page (user space address).
+ ///
+ /// Ensure the virtual page is exists.
+ /// vpn: Virtual address.
+ pub fn unmap_page(&self, vpn: VirtPage) {
+ let mut pte_list = Self::get_pte_list(self.0);
+ if Self::PAGE_LEVEL == 4 {
+ let pte = &mut pte_list[vpn.pn_index(3)];
+ if !pte.is_table() {
+ return;
+ };
+ pte_list = Self::get_pte_list(pte.address());
+ }
+ // level 3
+ {
+ let pte = &mut pte_list[vpn.pn_index(2)];
+ if !pte.is_table() {
+ return;
+ };
+ pte_list = Self::get_pte_list(pte.address());
+ }
+ // level 2
+ {
+ let pte = &mut pte_list[vpn.pn_index(1)];
+ if !pte.is_table() {
+ return;
+ };
+ pte_list = Self::get_pte_list(pte.address());
+ }
+ // level 1, map page
+ pte_list[vpn.pn_index(0)] = PTE(0);
+ TLB::flush_vaddr(vpn.into());
+ }
+
+ /// Translate a virtual adress to a physical address and mapping flags.
+ ///
+ /// Return None if the vaddr isn't mapped.
+ /// vpn: The virtual address will be translated.
+ pub fn translate(&self, vaddr: VirtAddr) -> Option<(PhysAddr, MappingFlags)> {
+ let vpn: VirtPage = vaddr.into();
+ let mut pte_list = Self::get_pte_list(self.0);
+ if Self::PAGE_LEVEL == 4 {
+ let pte = &mut pte_list[vpn.pn_index(3)];
+ if !pte.is_table() {
+ return None;
+ }
+ pte_list = Self::get_pte_list(pte.address());
+ }
+ // level 3
+ {
+ let pte = &mut pte_list[vpn.pn_index(2)];
+ if !pte.is_table() {
+ return None;
+ }
+ pte_list = Self::get_pte_list(pte.address());
+ }
+ // level 2
+ {
+ let pte = &mut pte_list[vpn.pn_index(1)];
+ if !pte.is_table() {
+ return None;
+ }
+ pte_list = Self::get_pte_list(pte.address());
+ }
+ // level 1, map page
+ let pte = pte_list[vpn.pn_index(0)];
+ Some((
+ PhysAddr(pte.address().0 + vaddr.pn_offest(0)),
+ pte.flags().into(),
+ ))
+ }
+
+ /// Release the page table entry.
+ ///
+ /// The page table entry in the user space address will be released.
+ /// [Page Table Wikipedia](https://en.wikipedia.org/wiki/Page_table).
+ /// You don't need to care about this if you just want to use.
+ pub fn release(&self) {
+ let drop_l2 = |pte_list: &[PTE]| {
+ pte_list.iter().for_each(|x| {
+ if x.is_table() {
+ frame_dealloc(x.address().into());
+ }
+ });
+ };
+ let drop_l3 = |pte_list: &[PTE]| {
+ pte_list.iter().for_each(|x| {
+ if x.is_table() {
+ drop_l2(Self::get_pte_list(x.address()));
+ frame_dealloc(x.address().into());
+ }
+ });
+ };
+ let drop_l4 = |pte_list: &[PTE]| {
+ pte_list.iter().for_each(|x| {
+ if x.is_table() {
+ drop_l3(Self::get_pte_list(x.address()));
+ frame_dealloc(x.address().into());
+ }
+ });
+ };
+
+ // Drop all sub page table entry and clear root page.
+ let pte_list = &mut Self::get_pte_list(self.0)[..Self::GLOBAL_ROOT_PTE_RANGE];
+ if Self::PAGE_LEVEL == 4 {
+ drop_l4(pte_list);
+ } else {
+ drop_l3(pte_list);
+ }
+ pte_list.fill(PTE(0));
+ }
+}
+
+bitflags::bitflags! {
+ /// Mapping flags for page table.
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+ pub struct MappingFlags: u64 {
+ /// Persent
+ const P = bit!(0);
+ /// User Accessable Flag
+ const U = bit!(1);
+ /// Readable Flag
+ const R = bit!(2);
+ /// Writeable Flag
+ const W = bit!(3);
+ /// Executeable Flag
+ const X = bit!(4);
+ /// Accessed Flag
+ const A = bit!(5);
+ /// Dirty Flag, indicating that the page was written
+ const D = bit!(6);
+ /// Global Flag
+ const G = bit!(7);
+ /// Device Flag, indicating that the page was used for device memory
+ const Device = bit!(8);
+ /// Cache Flag, indicating that the page will be cached
+ const Cache = bit!(9);
+
+ /// Read | Write | Executeable Flags
+ const RWX = Self::R.bits() | Self::W.bits() | Self::X.bits();
+ /// User | Read | Write Flags
+ const URW = Self::U.bits() | Self::R.bits() | Self::W.bits();
+ /// User | Read | Executeable Flags
+ const URX = Self::U.bits() | Self::R.bits() | Self::X.bits();
+ /// User | Read | Write | Executeable Flags
+ const URWX = Self::URW.bits() | Self::X.bits();
+ }
+}
+
+/// This structure indicates size of the page that will be mapped.
+///
+/// TODO: Support More Page Size, 16KB or 32KB
+/// Just support 4KB right now.
+#[derive(Debug)]
+pub enum MappingSize {
+ Page4KB,
+ // Page2MB,
+ // Page1GB,
+}
+
+/// TLB Operation set.
+/// Such as flush_vaddr, flush_all.
+/// Just use it in the fn.
+///
+/// there are some methods in the TLB implementation
+///
+/// ### Flush the tlb entry through the specific virtual address
+///
+/// ```rust
+/// TLB::flush_vaddr(arg0); arg0 should be VirtAddr
+/// ```
+/// ### Flush all tlb entries
+/// ```rust
+/// TLB::flush_all();
+/// ```
+pub struct TLB;
+
+/// Page Table Wrapper
+///
+/// You can use this wrapper to packing PageTable.
+/// If you release the PageTableWrapper,
+/// the PageTable will release its page table entry.
+#[derive(Debug)]
+pub struct PageTableWrapper(pub PageTable);
+
+impl Deref for PageTableWrapper {
+ type Target = PageTable;
+
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+
+/// Allocate a new PageTableWrapper with new page table root
+///
+/// This operation will restore the page table.
+impl PageTableWrapper {
+ /// Alloc a new PageTableWrapper with new page table root
+ /// This operation will copy kernel page table space from booting page table.
+ #[inline]
+ pub fn alloc() -> Self {
+ let pt = PageTable(frame_alloc().into());
+ pt.restore();
+ Self(pt)
+ }
+}
+
+/// Page Table Release.
+///
+/// You must implement this trait to release page table.
+/// Include the page table entry and root page.
+impl Drop for PageTableWrapper {
+ fn drop(&mut self) {
+ self.0.release();
+ frame_dealloc(self.0 .0.into());
+ }
+}
+
\ No newline at end of file
diff --git a/src/polyhal/components/pagetable/riscv64.rs.html b/src/polyhal/components/pagetable/riscv64.rs.html
new file mode 100644
index 0000000..6b6fc03
--- /dev/null
+++ b/src/polyhal/components/pagetable/riscv64.rs.html
@@ -0,0 +1,479 @@
+riscv64.rs - source
\ No newline at end of file
diff --git a/src/polyhal/components/percpu/mod.rs.html b/src/polyhal/components/percpu/mod.rs.html
new file mode 100644
index 0000000..fc26926
--- /dev/null
+++ b/src/polyhal/components/percpu/mod.rs.html
@@ -0,0 +1,209 @@
+mod.rs - source
//! Per-cpu module.
+//!
+//!
+
+super::define_arch_mods!();
+
+use alloc::alloc::alloc;
+use core::{alloc::Layout, mem::size_of, ptr::copy_nonoverlapping};
+
+use super::pagetable::PAGE_SIZE;
+
+pub use polyhal_macro::def_percpu;
+
+#[repr(align(8))]
+struct PerCPUDATA([u8; PAGE_SIZE]);
+
+static BOOT_PERCPU_DATA_AREA: PerCPUDATA = PerCPUDATA([0; PAGE_SIZE]);
+
+/// This is a empty seat for percpu section.
+/// Force the linker to create the percpu section.
+#[link_section = "percpu"]
+#[used(linker)]
+static _PERCPU_SEAT: [usize; 0] = [0; 0];
+
+#[cfg(target_arch = "x86_64")]
+const PERCPU_RESERVED: usize = size_of::<PerCPUReserved>();
+#[cfg(not(target_arch = "x86_64"))]
+const PERCPU_RESERVED: usize = 0;
+
+/// Returns the base address of the per-CPU data area on the given CPU.
+///
+/// if `cpu_id` is 0, it returns the base address of all per-CPU data areas.
+pub fn percpu_area_init(cpu_id: usize) -> usize {
+ // Get initial per-CPU data area
+ extern "Rust" {
+ fn __start_percpu();
+ fn __stop_percpu();
+ }
+ let start = __start_percpu as usize;
+ let size = __stop_percpu as usize - start + PERCPU_RESERVED;
+
+ // Get the base address of the per-CPU data area
+ // If cpu_id is boot,core then use BOOT_PERCPU_DATA_AREA.
+ // else alloc area.
+ let dst = if cpu_id == 0 {
+ &BOOT_PERCPU_DATA_AREA as *const _ as usize as *mut u8
+ } else {
+ let layout =
+ Layout::from_size_align(size, size_of::<usize>()).expect("percpu area align failed");
+ unsafe { alloc(layout) }
+ };
+
+ // Init the area with original data.
+ unsafe {
+ copy_nonoverlapping(start as *const u8, dst.add(PERCPU_RESERVED), size);
+ }
+
+ dst as usize
+}
+
+/// Read the architecture-specific thread pointer register on the current CPU.
+pub fn get_local_thread_pointer() -> usize {
+ let tp;
+ unsafe {
+ cfg_if::cfg_if! {
+ if #[cfg(target_arch = "x86_64")] {
+ tp = x86::msr::rdmsr(x86::msr::IA32_GS_BASE) as usize
+ } else if #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))] {
+ core::arch::asm!("mv {}, gp", out(reg) tp)
+ } else if #[cfg(target_arch = "aarch64")] {
+ core::arch::asm!("mrs {}, TPIDR_EL1", out(reg) tp)
+ } else if #[cfg(target_arch = "loongarch64")] {
+ core::arch::asm!("move {}, $r21", out(reg) tp)
+ }
+ }
+ }
+ tp
+}
+
+/// Set the architecture-specific thread pointer register to the per-CPU data
+/// area base on the current CPU.
+///
+/// `cpu_id` indicates which per-CPU data area to use.
+pub fn set_local_thread_pointer(cpu_id: usize) {
+ let tp = percpu_area_init(cpu_id);
+ unsafe {
+ cfg_if::cfg_if! {
+ if #[cfg(target_arch = "x86_64")] {
+ x86::msr::wrmsr(x86::msr::IA32_GS_BASE, tp as u64);
+ // Write cpu_local pointer to the first usize of the per-CPU data area
+ // Write the valid address to the second usize of the per-CPU data area
+ let percpu_reserved = PerCPUReserved::mut_from_ptr(tp as _);
+ percpu_reserved.self_ptr = tp;
+ percpu_reserved.valid_ptr = tp + PERCPU_RESERVED;
+ } else if #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))] {
+ core::arch::asm!("mv gp, {}", in(reg) tp)
+ } else if #[cfg(target_arch = "aarch64")] {
+ core::arch::asm!("msr TPIDR_EL1, {}", in(reg) tp)
+ } else if #[cfg(target_arch = "loongarch64")] {
+ core::arch::asm!("move $r21, {}", in(reg) tp)
+ }
+ }
+ }
+}
+
\ No newline at end of file
diff --git a/src/polyhal/components/percpu/riscv64.rs.html b/src/polyhal/components/percpu/riscv64.rs.html
new file mode 100644
index 0000000..29aec54
--- /dev/null
+++ b/src/polyhal/components/percpu/riscv64.rs.html
@@ -0,0 +1,43 @@
+riscv64.rs - source
+/// PolyHAL defined percpu reserved fields.
+/// Just used in the polyHAL and context switch.
+#[repr(C)]
+pub(crate) struct PerCPUReserved {
+ pub user_rsp: usize,
+ pub kernel_rsp: usize,
+ pub user_context: usize,
+}
+
+/// Get the offset of the specified percpu field.
+///
+/// PerCPU Arrange is that.
+///
+/// IN x86_64. The Reserved fields was used in manually.
+/// IN other architectures, the reserved fields was defined
+/// negative offset of the percpu pointer.
+pub(crate) macro PerCPUReservedOffset($field: ident) {
+ core::mem::offset_of!(PerCPUReserved, $field) as isize
+ - core::mem::size_of::<PerCPUReserved>() as isize
+}
+
\ No newline at end of file
diff --git a/src/polyhal/components/timer/mod.rs.html b/src/polyhal/components/timer/mod.rs.html
new file mode 100644
index 0000000..f2e4ac0
--- /dev/null
+++ b/src/polyhal/components/timer/mod.rs.html
@@ -0,0 +1,11 @@
+mod.rs - source
\ No newline at end of file
diff --git a/src/polyhal/components/timer/riscv64.rs.html b/src/polyhal/components/timer/riscv64.rs.html
new file mode 100644
index 0000000..5f77279
--- /dev/null
+++ b/src/polyhal/components/timer/riscv64.rs.html
@@ -0,0 +1,67 @@
+riscv64.rs - source
\ No newline at end of file
diff --git a/src/polyhal/components/trap/mod.rs.html b/src/polyhal/components/trap/mod.rs.html
new file mode 100644
index 0000000..f86589b
--- /dev/null
+++ b/src/polyhal/components/trap/mod.rs.html
@@ -0,0 +1,89 @@
+mod.rs - source
\ No newline at end of file
diff --git a/src/polyhal/components/trap/riscv64.rs.html b/src/polyhal/components/trap/riscv64.rs.html
new file mode 100644
index 0000000..8304d38
--- /dev/null
+++ b/src/polyhal/components/trap/riscv64.rs.html
@@ -0,0 +1,551 @@
+riscv64.rs - source
\ No newline at end of file
diff --git a/src/polyhal/components/trapframe/mod.rs.html b/src/polyhal/components/trapframe/mod.rs.html
new file mode 100644
index 0000000..c23a4b1
--- /dev/null
+++ b/src/polyhal/components/trapframe/mod.rs.html
@@ -0,0 +1,53 @@
+mod.rs - source
//! Trapframe module.
+//!
+//!
+
+use core::mem::size_of;
+
+super::define_arch_mods!();
+
+/// Trap Frame Arg Type
+///
+/// Using this by Index and IndexMut trait bound on TrapFrame
+#[derive(Debug)]
+pub enum TrapFrameArgs {
+ SEPC,
+ RA,
+ SP,
+ RET,
+ ARG0,
+ ARG1,
+ ARG2,
+ TLS,
+ SYSCALL,
+}
+
+/// The size of the [TrapFrame]
+pub const TRAPFRAME_SIZE: usize = size_of::<TrapFrame>();
+
\ No newline at end of file
diff --git a/src/polyhal/components/trapframe/riscv64.rs.html b/src/polyhal/components/trapframe/riscv64.rs.html
new file mode 100644
index 0000000..fdf91ac
--- /dev/null
+++ b/src/polyhal/components/trapframe/riscv64.rs.html
@@ -0,0 +1,273 @@
+riscv64.rs - source
\ No newline at end of file
diff --git a/src/polyhal/drivers/interrupt/mod.rs.html b/src/polyhal/drivers/interrupt/mod.rs.html
new file mode 100644
index 0000000..65037ed
--- /dev/null
+++ b/src/polyhal/drivers/interrupt/mod.rs.html
@@ -0,0 +1,3 @@
+mod.rs - source
\ No newline at end of file
diff --git a/src/polyhal/drivers/mod.rs.html b/src/polyhal/drivers/mod.rs.html
new file mode 100644
index 0000000..ac5d961
--- /dev/null
+++ b/src/polyhal/drivers/mod.rs.html
@@ -0,0 +1,5 @@
+mod.rs - source
\ No newline at end of file
diff --git a/src/polyhal/drivers/uart/mod.rs.html b/src/polyhal/drivers/uart/mod.rs.html
new file mode 100644
index 0000000..e01fef8
--- /dev/null
+++ b/src/polyhal/drivers/uart/mod.rs.html
@@ -0,0 +1,3 @@
+mod.rs - source
\ No newline at end of file
diff --git a/src/polyhal/lib.rs.html b/src/polyhal/lib.rs.html
new file mode 100644
index 0000000..9d8cbd1
--- /dev/null
+++ b/src/polyhal/lib.rs.html
@@ -0,0 +1,545 @@
+lib.rs - source
#![no_std]
+#![no_main]
+#![feature(naked_functions)]
+#![feature(asm_const)]
+#![feature(cfg_version)]
+#![feature(decl_macro)]
+#![feature(cfg_match)]
+#![feature(offset_of)]
+#![feature(used_with_arg)]
+#![cfg_attr(not(version("1.79")), feature(stdsimd))]
+#![feature(const_mut_refs)]
+#![feature(const_slice_from_raw_parts_mut)]
+#![feature(const_trait_impl)]
+#![cfg_attr(target_arch = "riscv64", feature(riscv_ext_intrinsics))]
+#![cfg_attr(target_arch = "aarch64", feature(const_option))]
+// For test
+#![feature(custom_test_frameworks)]
+#![test_runner(crate::tests::test_runner)]
+#![reexport_test_harness_main = "test_main"]
+
+//! This is a crate to help you supporting multiple platforms.
+//!
+//! If you want to use this crate, you should implement the following trait in your code.
+//!
+//! ```rust
+//! /// impl
+//! pub struct PageAllocImpl;
+//!
+//! impl PageAlloc for PageAllocImpl {
+//! fn alloc(&self) -> PhysPage {
+//! frame_alloc()
+//! }
+//!
+//! fn dealloc(&self, ppn: PhysPage) {
+//! frame::frame_dealloc(ppn)
+//! }
+//! }
+//!
+//! /// kernel interrupt
+//! #[polyhal::arch_interrupt]
+//! fn kernel_interrupt(ctx: &mut TrapFrame, trap_type: TrapType) {
+//! // println!("trap_type @ {:x?} {:#x?}", trap_type, ctx);
+//! match trap_type {
+//! Breakpoint => return,
+//! UserEnvCall => {
+//! // jump to next instruction anyway
+//! ctx.syscall_ok();
+//! log::info!("Handle a syscall");
+//! }
+//! StorePageFault(_paddr) | LoadPageFault(_paddr) | InstructionPageFault(_paddr) => {
+//! log::info!("page fault");
+//! }
+//! IllegalInstruction(_) => {
+//! log::info!("illegal instruction");
+//! }
+//! Time => {
+//! log::info!("Timer");
+//! }
+//! _ => {
+//! log::warn!("unsuspended trap type: {:?}", trap_type);
+//! }
+//! }
+//! }
+//!
+//! #[polyhal::arch_entry]
+//! /// kernel main function, entry point.
+//! fn main(hartid: usize) {
+//! if hartid != 0 {
+//! return;
+//! }
+//!
+//! println!("[kernel] Hello, world!");
+//! allocator::init_allocator();
+//! logging::init(Some("trace"));
+//! println!("init logging");
+//!
+//! // Init page alloc for polyhal
+//! polyhal::init(&PageAllocImpl);
+//!
+//! get_mem_areas().into_iter().for_each(|(start, size)| {
+//! println!("init memory region {:#x} - {:#x}", start, start + size);
+//! frame::add_frame_range(start, start + size);
+//! });
+//! panic!("end of rust_main!");
+//! }
+//!
+//! ```
+//!
+//! The main(hardid: usize) is the entry point.
+//!
+//! You can find details in the example.
+//!
+//! In this crate you can find some interfaces to use.
+//! These interfaces are classified into some structures.
+//!
+//! [PhysPage]: PhysicalPage And its associated functions.
+//!
+//! [PhysAddr](addr::PhysAddr): PhysicalAddr And its associated functions.
+//!
+//! [VirtPage](addr::VirtPage): VirtualPage And its associated functions.
+//!
+//! [VirtAddr](addr::VirtAddr): VirtualAddr And its associated functions.
+//!
+//! [IRQ](irq::IRQ): Interrupt ReQuest management, includes enable and disable.
+//!
+//! [Barrier](mem::Barrier): Memory barrier operations.
+//!
+//! [MultiCore](multicore::MultiCore): MultiCore operations. Now only [multicore::MultiCore::boot_all] is available.
+//!
+//! [PageTable]: PageTable and its associated functions.
+//!
+//! [MappingFlags](pagetable::MappingFlags): MappingFlags, This is an abstraction of pagetable flags.
+//!
+//! [TLB](pagetable::TLB): TLB operations.
+//!
+//! [PageTableWrapper](pagetable::PageTableWrapper): PageTableWrapper. It will dealloc all pagetable leaf when it was dropping.
+//!
+//! [Time](time::Time): Time and its associated functions.
+//!
+//! [Instruction](instruction::Instruction): Some platform instruction.
+//!
+//! There also provides a debugging console(recommanded only for debugging).
+//!
+//! [DebugConsole](debug::DebugConsole): A console for debugging.
+//!
+//! This crate provides a [TrapFrame], you can operate it through index with [TrapFrameArgs].
+//!
+//! If you are using kernel task. You should to enable feature `kcontext`.
+//! Then you can use kernel task context structure [KContext], and manipulate it with [KContextArgs].
+//!
+//! You can switch kcontext through [context_switch_pt] or [context_switch]
+//!
+//! There are also some consts.
+//!
+//! [VIRT_ADDR_START]: This is a higher half kernel offset address.
+//! [USER_VADDR_END]: End of the user address range.
+//! [PAGE_SIZE]: The size of the page.
+//!
+//! You can get some device information using the functions below.
+//! [get_mem_areas]: Get the avaliable memorys.
+//! [get_fdt]: Get the Fdt structure(fdt is a rust dtb operation crate).
+//! [get_cpu_num]: Get the number of cpus.
+//!
+//! TIPS: You should have finished [init] before using [get_mem_areas] and [get_fdt].
+
+extern crate alloc;
+
+extern crate log;
+
+pub mod addr;
+mod components;
+pub use components::*;
+pub(crate) mod drivers;
+pub mod time;
+pub mod utils;
+use core::mem::size_of;
+
+#[cfg(feature = "boot")]
+pub use polyhal_macro::arch_entry;
+#[cfg(feature = "trap")]
+pub use polyhal_macro::arch_interrupt;
+
+// Re export the Module like Structure.
+pub use addr::{PhysAddr, PhysPage, VirtAddr, VirtPage};
+// pub use multicore::MultiCore;
+pub use components::pagetable::{MappingFlags, MappingSize, PageTable, PageTableWrapper};
+pub use time::Time;
+
+pub(crate) fn clear_bss() {
+ extern "C" {
+ fn _sbss();
+ fn _ebss();
+ }
+ unsafe {
+ core::slice::from_raw_parts_mut(
+ _sbss as usize as *mut u128,
+ (_ebss as usize - _sbss as usize) / size_of::<u128>(),
+ )
+ .fill(0);
+ }
+}
+
+#[cfg(test)]
+pub mod tests {
+ use crate::api::frame_alloc;
+ use crate::debug::{print, println};
+ use crate::get_mem_areas;
+ use crate::shutdown;
+ use crate::PageAlloc;
+ use crate::PhysPage;
+ use crate::TrapFrame;
+ use crate::TrapType;
+ use buddy_system_allocator::LockedHeap;
+ use core::panic::PanicInfo;
+
+ pub fn test_runner(tests: &[&dyn Fn()]) {
+ crate::debug::println!("Running {} tests", tests.len());
+ for test in tests {
+ test();
+ }
+ }
+
+ #[test_case]
+ fn trivial_assertion() {
+ print!("trivial assertion... ");
+ assert_eq!(1, 1);
+ println!("[ok]");
+ }
+
+ #[global_allocator]
+ static HEAP_ALLOCATOR: LockedHeap<32> = LockedHeap::<32>::empty();
+
+ #[panic_handler]
+ fn panic(info: &core::panic::PanicInfo) -> ! {
+ crate::debug::println!("{}", info);
+ crate::shutdown()
+ }
+
+ const KERNEL_HEAP_SIZE: usize = 0x200_0000;
+
+ static mut HEAP_SPACE: [u8; KERNEL_HEAP_SIZE] = [0; KERNEL_HEAP_SIZE];
+
+ pub fn init_allocator() {
+ unsafe {
+ HEAP_ALLOCATOR
+ .lock()
+ .init(HEAP_SPACE.as_ptr() as usize, KERNEL_HEAP_SIZE);
+ }
+ }
+
+ pub struct PageAllocImpl;
+
+ impl PageAlloc for PageAllocImpl {
+ fn alloc(&self) -> PhysPage {
+ // frame_alloc()
+ todo!("alloc page")
+ }
+
+ fn dealloc(&self, ppn: PhysPage) {
+ // frame::frame_dealloc(ppn)
+ todo!("dealloc page");
+ }
+ }
+
+ /// kernel interrupt
+ #[crate::arch_interrupt]
+ fn kernel_interrupt(ctx: &mut TrapFrame, trap_type: TrapType) {
+ // println!("trap_type @ {:x?} {:#x?}", trap_type, ctx);
+ }
+
+ #[crate::arch_entry]
+ /// kernel main function, entry point.
+ fn main(hartid: usize) {
+ if hartid != 0 {
+ return;
+ }
+
+ println!("[kernel] Hello, world!");
+ init_allocator();
+
+ // Init page alloc for polyhal
+ crate::init(&PageAllocImpl);
+
+ crate::test_main();
+
+ // get_mem_areas().into_iter().for_each(|(start, size)| {
+ // println!("init memory region {:#x} - {:#x}", start, start + size);
+ // frame::add_frame_range(start, start + size);
+ // });
+ panic!("end of rust_main!");
+ }
+}
+
\ No newline at end of file
diff --git a/src/polyhal/time.rs.html b/src/polyhal/time.rs.html
new file mode 100644
index 0000000..d05d14d
--- /dev/null
+++ b/src/polyhal/time.rs.html
@@ -0,0 +1,141 @@
+time.rs - source
/// Time struct and its interface
+///
+/// You can use this to get time from ticks
+///
+/// ### get current time
+/// ```rust
+/// Time::now();
+/// ```
+///
+/// ### get current cpu's frequency
+/// ```rust
+/// Time::get_freq();
+/// ```
+///
+/// ### get how many nanoseconds have passed.
+/// ```rust
+/// Time::now().to_nsec();
+/// ```
+///
+/// ### get how many microseconds have passed.
+/// ```rust
+/// Time::now().to_usec();
+/// ```
+///
+/// ### get how many millisecond have passed.
+/// ```rust
+/// Time::now().to_msec();
+/// ```
+///
+/// ### get how may ticks have passed
+/// ```rust
+/// Time::now().raw();
+/// ```
+///
+/// ### convert ticks to time
+/// ```rust
+/// Time::from_raw(Time::now().raw());
+/// ```
+///
+
+#[derive(Clone, Copy, Debug)]
+pub struct Time(pub(crate) usize);
+
+impl Time {
+ #[inline]
+ pub fn to_msec(&self) -> usize {
+ self.0 * 1_000 / Self::get_freq()
+ }
+
+ #[inline]
+ pub fn to_usec(&self) -> usize {
+ self.0 * 1_000_000 / Self::get_freq()
+ }
+
+ /// Converts hardware ticks to nanoseconds.
+ #[inline]
+ pub fn to_nsec(&self) -> usize {
+ self.0 * 1_000_000_000 / Self::get_freq()
+ }
+
+ #[inline]
+ pub fn raw(&self) -> usize {
+ self.0
+ }
+
+ #[inline]
+ pub fn from_raw(raw: usize) -> Self {
+ Self(raw)
+ }
+}
+
\ No newline at end of file
diff --git a/src/polyhal/utils/lazy_init.rs.html b/src/polyhal/utils/lazy_init.rs.html
new file mode 100644
index 0000000..7c27cde
--- /dev/null
+++ b/src/polyhal/utils/lazy_init.rs.html
@@ -0,0 +1,223 @@
+lazy_init.rs - source
\ No newline at end of file
diff --git a/src/polyhal/utils/macros.rs.html b/src/polyhal/utils/macros.rs.html
new file mode 100644
index 0000000..4478604
--- /dev/null
+++ b/src/polyhal/utils/macros.rs.html
@@ -0,0 +1,17 @@
+macros.rs - source
/// bit macro will generate the number through a shift value.
+///
+/// Here is an example.
+/// You can use bit!(0) instead of 1 << 0.
+/// bit!(39) instead of 1 << 39.
+pub macro bit($x: expr) {
+ 1 << $x
+}
+
\ No newline at end of file
diff --git a/src/polyhal/utils/mod.rs.html b/src/polyhal/utils/mod.rs.html
new file mode 100644
index 0000000..58d5e6d
--- /dev/null
+++ b/src/polyhal/utils/mod.rs.html
@@ -0,0 +1,15 @@
+mod.rs - source
mod lazy_init;
+mod macros;
+mod mutex_no_irq;
+
+pub use lazy_init::LazyInit;
+pub use macros::bit;
+pub use mutex_no_irq::{MutexNoIrq, MutexNoIrqGuard};
+
\ No newline at end of file
diff --git a/src/polyhal/utils/mutex_no_irq.rs.html b/src/polyhal/utils/mutex_no_irq.rs.html
new file mode 100644
index 0000000..8d71979
--- /dev/null
+++ b/src/polyhal/utils/mutex_no_irq.rs.html
@@ -0,0 +1,193 @@
+mutex_no_irq.rs - source
use core::ops::{Deref, DerefMut};
+use spin::{Mutex, MutexGuard};
+
+use crate::components::irq::IRQ;
+
+pub struct MutexNoIrq<T: ?Sized> {
+ lock: Mutex<T>,
+}
+
+/// Irq Status Struct.
+/// This structure contains the status of the current IRQ
+/// And it will restore irq status after dropping.
+struct IrqStatus {
+ irq_enabled: bool,
+}
+
+/// Restore the IRQ status when dropping
+impl Drop for IrqStatus {
+ fn drop(&mut self) {
+ if self.irq_enabled {
+ IRQ::int_enable();
+ }
+ }
+}
+
+/// Implement Sync for MutexNoIrq
+unsafe impl<T: ?Sized + Send> Sync for MutexNoIrq<T> {}
+/// Implement Send for MutexNoIrq
+unsafe impl<T: ?Sized + Send> Send for MutexNoIrq<T> {}
+
+impl<T> MutexNoIrq<T> {
+ pub const fn new(data: T) -> MutexNoIrq<T> {
+ MutexNoIrq {
+ lock: Mutex::new(data),
+ }
+ }
+
+ #[inline(always)]
+ pub fn into_inner(self) -> T {
+ self.lock.into_inner()
+ }
+}
+
+impl<T: ?Sized> MutexNoIrq<T> {
+ #[inline]
+ pub fn lock(&self) -> MutexNoIrqGuard<T> {
+ loop {
+ if let Some(guard) = self.try_lock() {
+ return guard;
+ }
+ }
+ }
+
+ #[inline]
+ pub fn is_locked(&self) -> bool {
+ self.lock.is_locked()
+ }
+
+ pub unsafe fn force_unlock(&self) {
+ self.lock.force_unlock()
+ }
+
+ #[inline]
+ pub fn try_lock(&self) -> Option<MutexNoIrqGuard<T>> {
+ if self.lock.is_locked() {
+ return None;
+ }
+ let _irq_status = IrqStatus {
+ irq_enabled: IRQ::int_enabled(),
+ };
+ IRQ::int_disable();
+ self.lock
+ .try_lock()
+ .map(|guard| MutexNoIrqGuard { guard, _irq_status })
+ }
+}
+
+/// The Mutex Guard.
+pub struct MutexNoIrqGuard<'a, T: ?Sized + 'a> {
+ guard: MutexGuard<'a, T>,
+ _irq_status: IrqStatus,
+}
+
+impl<'a, T: ?Sized> Deref for MutexNoIrqGuard<'a, T> {
+ type Target = T;
+
+ fn deref(&self) -> &T {
+ &(self.guard)
+ }
+}
+
+impl<'a, T: ?Sized> DerefMut for MutexNoIrqGuard<'a, T> {
+ fn deref_mut(&mut self) -> &mut T {
+ &mut (self.guard)
+ }
+}
+
\ No newline at end of file
diff --git a/static.files/COPYRIGHT-23e9bde6c69aea69.txt b/static.files/COPYRIGHT-23e9bde6c69aea69.txt
new file mode 100644
index 0000000..1447df7
--- /dev/null
+++ b/static.files/COPYRIGHT-23e9bde6c69aea69.txt
@@ -0,0 +1,50 @@
+# REUSE-IgnoreStart
+
+These documentation pages include resources by third parties. This copyright
+file applies only to those resources. The following third party resources are
+included, and carry their own copyright notices and license terms:
+
+* Fira Sans (FiraSans-Regular.woff2, FiraSans-Medium.woff2):
+
+ Copyright (c) 2014, Mozilla Foundation https://mozilla.org/
+ with Reserved Font Name Fira Sans.
+
+ Copyright (c) 2014, Telefonica S.A.
+
+ Licensed under the SIL Open Font License, Version 1.1.
+ See FiraSans-LICENSE.txt.
+
+* rustdoc.css, main.js, and playpen.js:
+
+ Copyright 2015 The Rust Developers.
+ Licensed under the Apache License, Version 2.0 (see LICENSE-APACHE.txt) or
+ the MIT license (LICENSE-MIT.txt) at your option.
+
+* normalize.css:
+
+ Copyright (c) Nicolas Gallagher and Jonathan Neal.
+ Licensed under the MIT license (see LICENSE-MIT.txt).
+
+* Source Code Pro (SourceCodePro-Regular.ttf.woff2,
+ SourceCodePro-Semibold.ttf.woff2, SourceCodePro-It.ttf.woff2):
+
+ Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/),
+ with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark
+ of Adobe Systems Incorporated in the United States and/or other countries.
+
+ Licensed under the SIL Open Font License, Version 1.1.
+ See SourceCodePro-LICENSE.txt.
+
+* Source Serif 4 (SourceSerif4-Regular.ttf.woff2, SourceSerif4-Bold.ttf.woff2,
+ SourceSerif4-It.ttf.woff2):
+
+ Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name
+ 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United
+ States and/or other countries.
+
+ Licensed under the SIL Open Font License, Version 1.1.
+ See SourceSerif4-LICENSE.md.
+
+This copyright file is intended to be distributed with rustdoc output.
+
+# REUSE-IgnoreEnd
diff --git a/static.files/FiraSans-LICENSE-db4b642586e02d97.txt b/static.files/FiraSans-LICENSE-db4b642586e02d97.txt
new file mode 100644
index 0000000..d7e9c14
--- /dev/null
+++ b/static.files/FiraSans-LICENSE-db4b642586e02d97.txt
@@ -0,0 +1,98 @@
+// REUSE-IgnoreStart
+
+Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A.
+with Reserved Font Name < Fira >,
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+// REUSE-IgnoreEnd
diff --git a/static.files/FiraSans-Medium-8f9a781e4970d388.woff2 b/static.files/FiraSans-Medium-8f9a781e4970d388.woff2
new file mode 100644
index 0000000..7a1e5fc
Binary files /dev/null and b/static.files/FiraSans-Medium-8f9a781e4970d388.woff2 differ
diff --git a/static.files/FiraSans-Regular-018c141bf0843ffd.woff2 b/static.files/FiraSans-Regular-018c141bf0843ffd.woff2
new file mode 100644
index 0000000..e766e06
Binary files /dev/null and b/static.files/FiraSans-Regular-018c141bf0843ffd.woff2 differ
diff --git a/static.files/LICENSE-APACHE-b91fa81cba47b86a.txt b/static.files/LICENSE-APACHE-b91fa81cba47b86a.txt
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/static.files/LICENSE-APACHE-b91fa81cba47b86a.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/static.files/LICENSE-MIT-65090b722b3f6c56.txt b/static.files/LICENSE-MIT-65090b722b3f6c56.txt
new file mode 100644
index 0000000..31aa793
--- /dev/null
+++ b/static.files/LICENSE-MIT-65090b722b3f6c56.txt
@@ -0,0 +1,23 @@
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/static.files/NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2 b/static.files/NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2
new file mode 100644
index 0000000..1866ad4
Binary files /dev/null and b/static.files/NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2 differ
diff --git a/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt b/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt
new file mode 100644
index 0000000..4b3edc2
--- /dev/null
+++ b/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt
@@ -0,0 +1,103 @@
+// REUSE-IgnoreStart
+
+Copyright (c) 2010, NAVER Corporation (https://www.navercorp.com/),
+
+with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver NanumGothic,
+NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver NanumBrush, NanumPen,
+Naver NanumPen, Naver NanumGothicEco, NanumGothicEco, Naver NanumMyeongjoEco,
+NanumMyeongjoEco, Naver NanumGothicLight, NanumGothicLight, NanumBarunGothic,
+Naver NanumBarunGothic, NanumSquareRound, NanumBarunPen, MaruBuri
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+// REUSE-IgnoreEnd
diff --git a/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 b/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2
new file mode 100644
index 0000000..462c34e
Binary files /dev/null and b/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 differ
diff --git a/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt b/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt
new file mode 100644
index 0000000..0d2941e
--- /dev/null
+++ b/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt
@@ -0,0 +1,97 @@
+// REUSE-IgnoreStart
+
+Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+// REUSE-IgnoreEnd
diff --git a/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 b/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2
new file mode 100644
index 0000000..10b558e
Binary files /dev/null and b/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 differ
diff --git a/static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2 b/static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2
new file mode 100644
index 0000000..5ec64ee
Binary files /dev/null and b/static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2 differ
diff --git a/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 b/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2
new file mode 100644
index 0000000..181a07f
Binary files /dev/null and b/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 differ
diff --git a/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 b/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2
new file mode 100644
index 0000000..2ae08a7
Binary files /dev/null and b/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 differ
diff --git a/static.files/SourceSerif4-LICENSE-3bb119e13b1258b7.md b/static.files/SourceSerif4-LICENSE-3bb119e13b1258b7.md
new file mode 100644
index 0000000..175fa4f
--- /dev/null
+++ b/static.files/SourceSerif4-LICENSE-3bb119e13b1258b7.md
@@ -0,0 +1,98 @@
+
+
+Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries.
+Copyright 2014 - 2023 Adobe (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+
diff --git a/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 b/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2
new file mode 100644
index 0000000..0263fc3
Binary files /dev/null and b/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 differ
diff --git a/static.files/clipboard-7571035ce49a181d.svg b/static.files/clipboard-7571035ce49a181d.svg
new file mode 100644
index 0000000..8adbd99
--- /dev/null
+++ b/static.files/clipboard-7571035ce49a181d.svg
@@ -0,0 +1 @@
+
diff --git a/static.files/favicon-16x16-8b506e7a72182f1c.png b/static.files/favicon-16x16-8b506e7a72182f1c.png
new file mode 100644
index 0000000..ea4b45c
Binary files /dev/null and b/static.files/favicon-16x16-8b506e7a72182f1c.png differ
diff --git a/static.files/favicon-2c020d218678b618.svg b/static.files/favicon-2c020d218678b618.svg
new file mode 100644
index 0000000..8b34b51
--- /dev/null
+++ b/static.files/favicon-2c020d218678b618.svg
@@ -0,0 +1,24 @@
+
diff --git a/static.files/favicon-32x32-422f7d1d52889060.png b/static.files/favicon-32x32-422f7d1d52889060.png
new file mode 100644
index 0000000..69b8613
Binary files /dev/null and b/static.files/favicon-32x32-422f7d1d52889060.png differ
diff --git a/static.files/main-77dede896d6ac08e.js b/static.files/main-77dede896d6ac08e.js
new file mode 100644
index 0000000..d511f28
--- /dev/null
+++ b/static.files/main-77dede896d6ac08e.js
@@ -0,0 +1,11 @@
+"use strict";window.RUSTDOC_TOOLTIP_HOVER_MS=300;window.RUSTDOC_TOOLTIP_HOVER_EXIT_MS=450;function resourcePath(basename,extension){return getVar("root-path")+basename+getVar("resource-suffix")+extension}function hideMain(){addClass(document.getElementById(MAIN_ID),"hidden")}function showMain(){removeClass(document.getElementById(MAIN_ID),"hidden")}function blurHandler(event,parentElem,hideCallback){if(!parentElem.contains(document.activeElement)&&!parentElem.contains(event.relatedTarget)){hideCallback()}}window.rootPath=getVar("root-path");window.currentCrate=getVar("current-crate");function setMobileTopbar(){const mobileTopbar=document.querySelector(".mobile-topbar");const locationTitle=document.querySelector(".sidebar h2.location");if(mobileTopbar){const mobileTitle=document.createElement("h2");mobileTitle.className="location";if(hasClass(document.querySelector(".rustdoc"),"crate")){mobileTitle.innerText=`Crate ${window.currentCrate}`}else if(locationTitle){mobileTitle.innerHTML=locationTitle.innerHTML}mobileTopbar.appendChild(mobileTitle)}}function getVirtualKey(ev){if("key"in ev&&typeof ev.key!=="undefined"){return ev.key}const c=ev.charCode||ev.keyCode;if(c===27){return"Escape"}return String.fromCharCode(c)}const MAIN_ID="main-content";const SETTINGS_BUTTON_ID="settings-menu";const ALTERNATIVE_DISPLAY_ID="alternative-display";const NOT_DISPLAYED_ID="not-displayed";const HELP_BUTTON_ID="help-button";function getSettingsButton(){return document.getElementById(SETTINGS_BUTTON_ID)}function getHelpButton(){return document.getElementById(HELP_BUTTON_ID)}function getNakedUrl(){return window.location.href.split("?")[0].split("#")[0]}function insertAfter(newNode,referenceNode){referenceNode.parentNode.insertBefore(newNode,referenceNode.nextSibling)}function getOrCreateSection(id,classes){let el=document.getElementById(id);if(!el){el=document.createElement("section");el.id=id;el.className=classes;insertAfter(el,document.getElementById(MAIN_ID))}return el}function getAlternativeDisplayElem(){return getOrCreateSection(ALTERNATIVE_DISPLAY_ID,"content hidden")}function getNotDisplayedElem(){return getOrCreateSection(NOT_DISPLAYED_ID,"hidden")}function switchDisplayedElement(elemToDisplay){const el=getAlternativeDisplayElem();if(el.children.length>0){getNotDisplayedElem().appendChild(el.firstElementChild)}if(elemToDisplay===null){addClass(el,"hidden");showMain();return}el.appendChild(elemToDisplay);hideMain();removeClass(el,"hidden")}function browserSupportsHistoryApi(){return window.history&&typeof window.history.pushState==="function"}function preLoadCss(cssUrl){const link=document.createElement("link");link.href=cssUrl;link.rel="preload";link.as="style";document.getElementsByTagName("head")[0].appendChild(link)}(function(){const isHelpPage=window.location.pathname.endsWith("/help.html");function loadScript(url){const script=document.createElement("script");script.src=url;document.head.append(script)}getSettingsButton().onclick=event=>{if(event.ctrlKey||event.altKey||event.metaKey){return}window.hideAllModals(false);addClass(getSettingsButton(),"rotate");event.preventDefault();loadScript(getVar("static-root-path")+getVar("settings-js"));setTimeout(()=>{const themes=getVar("themes").split(",");for(const theme of themes){if(theme!==""){preLoadCss(getVar("root-path")+theme+".css")}}},0)};window.searchState={loadingText:"Loading search results...",input:document.getElementsByClassName("search-input")[0],outputElement:()=>{let el=document.getElementById("search");if(!el){el=document.createElement("section");el.id="search";getNotDisplayedElem().appendChild(el)}return el},title:document.title,titleBeforeSearch:document.title,timeout:null,currentTab:0,focusedByTab:[null,null,null],clearInputTimeout:()=>{if(searchState.timeout!==null){clearTimeout(searchState.timeout);searchState.timeout=null}},isDisplayed:()=>searchState.outputElement().parentElement.id===ALTERNATIVE_DISPLAY_ID,focus:()=>{searchState.input.focus()},defocus:()=>{searchState.input.blur()},showResults:search=>{if(search===null||typeof search==="undefined"){search=searchState.outputElement()}switchDisplayedElement(search);searchState.mouseMovedAfterSearch=false;document.title=searchState.title},removeQueryParameters:()=>{document.title=searchState.titleBeforeSearch;if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.hash)}},hideResults:()=>{switchDisplayedElement(null);searchState.removeQueryParameters()},getQueryStringParams:()=>{const params={};window.location.search.substring(1).split("&").map(s=>{const pair=s.split("=");params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1])});return params},setup:()=>{const search_input=searchState.input;if(!searchState.input){return}let searchLoaded=false;function loadSearch(){if(!searchLoaded){searchLoaded=true;loadScript(getVar("static-root-path")+getVar("search-js"));loadScript(resourcePath("search-index",".js"))}}search_input.addEventListener("focus",()=>{search_input.origPlaceholder=search_input.placeholder;search_input.placeholder="Type your search here.";loadSearch()});if(search_input.value!==""){loadSearch()}const params=searchState.getQueryStringParams();if(params.search!==undefined){searchState.setLoadingSearch();loadSearch()}},setLoadingSearch:()=>{const search=searchState.outputElement();search.innerHTML="
"}else{if(e.getAttribute("title")!==null){e.setAttribute("data-title",e.getAttribute("title"));e.removeAttribute("title")}if(e.getAttribute("data-title")!==null){const titleContent=document.createElement("div");titleContent.className="content";titleContent.appendChild(document.createTextNode(e.getAttribute("data-title")));wrapper.appendChild(titleContent)}}wrapper.className="tooltip popover";const focusCatcher=document.createElement("div");focusCatcher.setAttribute("tabindex","0");focusCatcher.onfocus=hideTooltip;wrapper.appendChild(focusCatcher);const pos=e.getBoundingClientRect();wrapper.style.top=(pos.top+window.scrollY+pos.height)+"px";wrapper.style.left=0;wrapper.style.right="auto";wrapper.style.visibility="hidden";const body=document.getElementsByTagName("body")[0];body.appendChild(wrapper);const wrapperPos=wrapper.getBoundingClientRect();const finalPos=pos.left+window.scrollX-wrapperPos.width+24;if(finalPos>0){wrapper.style.left=finalPos+"px"}else{wrapper.style.setProperty("--popover-arrow-offset",(wrapperPos.right-pos.right+4)+"px")}wrapper.style.visibility="";window.CURRENT_TOOLTIP_ELEMENT=wrapper;window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE=e;clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);wrapper.onpointerenter=ev=>{if(ev.pointerType!=="mouse"){return}clearTooltipHoverTimeout(e)};wrapper.onpointerleave=ev=>{if(ev.pointerType!=="mouse"){return}if(!e.TOOLTIP_FORCE_VISIBLE&&!e.contains(ev.relatedTarget)){setTooltipHoverTimeout(e,false);addClass(wrapper,"fade-out")}}}function setTooltipHoverTimeout(element,show){clearTooltipHoverTimeout(element);if(!show&&!window.CURRENT_TOOLTIP_ELEMENT){return}if(show&&window.CURRENT_TOOLTIP_ELEMENT){return}if(window.CURRENT_TOOLTIP_ELEMENT&&window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE!==element){return}element.TOOLTIP_HOVER_TIMEOUT=setTimeout(()=>{if(show){showTooltip(element)}else if(!element.TOOLTIP_FORCE_VISIBLE){hideTooltip(false)}},show?window.RUSTDOC_TOOLTIP_HOVER_MS:window.RUSTDOC_TOOLTIP_HOVER_EXIT_MS)}function clearTooltipHoverTimeout(element){if(element.TOOLTIP_HOVER_TIMEOUT!==undefined){removeClass(window.CURRENT_TOOLTIP_ELEMENT,"fade-out");clearTimeout(element.TOOLTIP_HOVER_TIMEOUT);delete element.TOOLTIP_HOVER_TIMEOUT}}function tooltipBlurHandler(event){if(window.CURRENT_TOOLTIP_ELEMENT&&!window.CURRENT_TOOLTIP_ELEMENT.contains(document.activeElement)&&!window.CURRENT_TOOLTIP_ELEMENT.contains(event.relatedTarget)&&!window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.contains(document.activeElement)&&!window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.contains(event.relatedTarget)){setTimeout(()=>hideTooltip(false),0)}}function hideTooltip(focus){if(window.CURRENT_TOOLTIP_ELEMENT){if(window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE){if(focus){window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.focus()}window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE=false}const body=document.getElementsByTagName("body")[0];body.removeChild(window.CURRENT_TOOLTIP_ELEMENT);clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);window.CURRENT_TOOLTIP_ELEMENT=null}}onEachLazy(document.getElementsByClassName("tooltip"),e=>{e.onclick=()=>{e.TOOLTIP_FORCE_VISIBLE=e.TOOLTIP_FORCE_VISIBLE?false:true;if(window.CURRENT_TOOLTIP_ELEMENT&&!e.TOOLTIP_FORCE_VISIBLE){hideTooltip(true)}else{showTooltip(e);window.CURRENT_TOOLTIP_ELEMENT.setAttribute("tabindex","0");window.CURRENT_TOOLTIP_ELEMENT.focus();window.CURRENT_TOOLTIP_ELEMENT.onblur=tooltipBlurHandler}return false};e.onpointerenter=ev=>{if(ev.pointerType!=="mouse"){return}setTooltipHoverTimeout(e,true)};e.onpointermove=ev=>{if(ev.pointerType!=="mouse"){return}setTooltipHoverTimeout(e,true)};e.onpointerleave=ev=>{if(ev.pointerType!=="mouse"){return}if(!e.TOOLTIP_FORCE_VISIBLE&&window.CURRENT_TOOLTIP_ELEMENT&&!window.CURRENT_TOOLTIP_ELEMENT.contains(ev.relatedTarget)){setTooltipHoverTimeout(e,false);addClass(window.CURRENT_TOOLTIP_ELEMENT,"fade-out")}}});const sidebar_menu_toggle=document.getElementsByClassName("sidebar-menu-toggle")[0];if(sidebar_menu_toggle){sidebar_menu_toggle.addEventListener("click",()=>{const sidebar=document.getElementsByClassName("sidebar")[0];if(!hasClass(sidebar,"shown")){showSidebar()}else{hideSidebar()}})}function helpBlurHandler(event){blurHandler(event,getHelpButton(),window.hidePopoverMenus)}function buildHelpMenu(){const book_info=document.createElement("span");const channel=getVar("channel");book_info.className="top";book_info.innerHTML=`You can find more information in \
+the rustdoc book.`;const shortcuts=[["?","Show this help dialog"],["S","Focus the search field"],["↑","Move up in search results"],["↓","Move down in search results"],["← / →","Switch result tab (when results focused)"],["⏎","Go to active search result"],["+","Expand all sections"],["-","Collapse all sections"],].map(x=>"
";const infos=[`For a full list of all search features, take a look here.`,"Prefix searches with a type followed by a colon (e.g., fn:) to \
+ restrict the search to a given item kind.","Accepted kinds are: fn, mod, struct, \
+ enum, trait, type, macro, \
+ and const.","Search functions by type signature (e.g., vec -> usize or \
+ -> vec or String, enum:Cow -> bool)","You can look for items with an exact name by putting double quotes around \
+ your request: \"string\"","Look for functions that accept or return \
+ slices and \
+ arrays by writing \
+ square brackets (e.g., -> [u8] or [] -> Option)","Look for items inside another one by searching for a path: vec::Vec",].map(x=>"
"}else{const signatureTabTitle=results.query.elems.length===0?"In Function Return Types":results.query.returned.length===0?"In Function Parameters":"In Function Signatures";output+="
`}}return output}function buildSettingsPage(){const theme_names=getVar("themes").split(",").filter(t=>t);theme_names.push("light","dark","ayu");const settings=[{"name":"Theme","js_name":"theme","default":"system preference","options":theme_names.concat("system preference"),},{"name":"Preferred light theme","js_name":"preferred-light-theme","default":"light","options":theme_names,},{"name":"Preferred dark theme","js_name":"preferred-dark-theme","default":"dark","options":theme_names,},{"name":"Auto-hide item contents for large items","js_name":"auto-hide-large-items","default":true,},{"name":"Auto-hide item methods' documentation","js_name":"auto-hide-method-docs","default":false,},{"name":"Auto-hide trait implementation documentation","js_name":"auto-hide-trait-implementations","default":false,},{"name":"Directly go to item in search if there is only one result","js_name":"go-to-only-result","default":false,},{"name":"Show line numbers on code examples","js_name":"line-numbers","default":false,},{"name":"Disable keyboard shortcuts","js_name":"disable-shortcuts","default":false,},];const elementKind=isSettingsPage?"section":"div";const innerHTML=`
${buildSettingsPageSections(settings)}
`;const el=document.createElement(elementKind);el.id="settings";if(!isSettingsPage){el.className="popover"}el.innerHTML=innerHTML;if(isSettingsPage){document.getElementById(MAIN_ID).appendChild(el)}else{el.setAttribute("tabindex","-1");getSettingsButton().appendChild(el)}return el}const settingsMenu=buildSettingsPage();function displaySettings(){settingsMenu.style.display=""}function settingsBlurHandler(event){blurHandler(event,getSettingsButton(),window.hidePopoverMenus)}if(isSettingsPage){getSettingsButton().onclick=event=>{event.preventDefault()}}else{const settingsButton=getSettingsButton();const settingsMenu=document.getElementById("settings");settingsButton.onclick=event=>{if(settingsMenu.contains(event.target)){return}event.preventDefault();const shouldDisplaySettings=settingsMenu.style.display==="none";window.hideAllModals();if(shouldDisplaySettings){displaySettings()}};settingsButton.onblur=settingsBlurHandler;settingsButton.querySelector("a").onblur=settingsBlurHandler;onEachLazy(settingsMenu.querySelectorAll("input"),el=>{el.onblur=settingsBlurHandler});settingsMenu.onblur=settingsBlurHandler}setTimeout(()=>{setEvents(settingsMenu);if(!isSettingsPage){displaySettings()}removeClass(getSettingsButton(),"rotate")},0)})()
\ No newline at end of file
diff --git a/static.files/src-script-3280b574d94e47b4.js b/static.files/src-script-3280b574d94e47b4.js
new file mode 100644
index 0000000..9ea8892
--- /dev/null
+++ b/static.files/src-script-3280b574d94e47b4.js
@@ -0,0 +1 @@
+"use strict";(function(){const rootPath=getVar("root-path");const NAME_OFFSET=0;const DIRS_OFFSET=1;const FILES_OFFSET=2;const RUSTDOC_MOBILE_BREAKPOINT=700;function closeSidebarIfMobile(){if(window.innerWidth"){addClass(document.documentElement,"src-sidebar-expanded");child.innerText="<";updateLocalStorage("source-sidebar-show","true")}else{removeClass(document.documentElement,"src-sidebar-expanded");child.innerText=">";updateLocalStorage("source-sidebar-show","false")}}function createSidebarToggle(){const sidebarToggle=document.createElement("div");sidebarToggle.id="src-sidebar-toggle";const inner=document.createElement("button");if(getCurrentValue("source-sidebar-show")==="true"){inner.innerText="<"}else{inner.innerText=">"}inner.onclick=toggleSidebar;sidebarToggle.appendChild(inner);return sidebarToggle}function createSrcSidebar(){const container=document.querySelector("nav.sidebar");const sidebarToggle=createSidebarToggle();container.insertBefore(sidebarToggle,container.firstChild);const sidebar=document.createElement("div");sidebar.id="src-sidebar";let hasFoundFile=false;const title=document.createElement("div");title.className="title";title.innerText="Files";sidebar.appendChild(title);Object.keys(srcIndex).forEach(key=>{srcIndex[key][NAME_OFFSET]=key;hasFoundFile=createDirEntry(srcIndex[key],sidebar,"",hasFoundFile)});container.appendChild(sidebar);const selected_elem=sidebar.getElementsByClassName("selected")[0];if(typeof selected_elem!=="undefined"){selected_elem.focus()}}const lineNumbersRegex=/^#?(\d+)(?:-(\d+))?$/;function highlightSrcLines(match){if(typeof match==="undefined"){match=window.location.hash.match(lineNumbersRegex)}if(!match){return}let from=parseInt(match[1],10);let to=from;if(typeof match[2]!=="undefined"){to=parseInt(match[2],10)}if(to{onEachLazy(e.getElementsByTagName("a"),i_e=>{removeClass(i_e,"line-highlighted")})});for(let i=from;i<=to;++i){elem=document.getElementById(i);if(!elem){break}addClass(elem,"line-highlighted")}}const handleSrcHighlight=(function(){let prev_line_id=0;const set_fragment=name=>{const x=window.scrollX,y=window.scrollY;if(browserSupportsHistoryApi()){history.replaceState(null,null,"#"+name);highlightSrcLines()}else{location.replace("#"+name)}window.scrollTo(x,y)};return ev=>{let cur_line_id=parseInt(ev.target.id,10);if(isNaN(cur_line_id)||ev.ctrlKey||ev.altKey||ev.metaKey){return}ev.preventDefault();if(ev.shiftKey&&prev_line_id){if(prev_line_id>cur_line_id){const tmp=prev_line_id;prev_line_id=cur_line_id;cur_line_id=tmp}set_fragment(prev_line_id+"-"+cur_line_id)}else{prev_line_id=cur_line_id;set_fragment(cur_line_id)}}}());window.addEventListener("hashchange",()=>{const match=window.location.hash.match(lineNumbersRegex);if(match){return highlightSrcLines(match)}});onEachLazy(document.getElementsByClassName("src-line-numbers"),el=>{el.addEventListener("click",handleSrcHighlight)});highlightSrcLines();window.createSrcSidebar=createSrcSidebar})()
\ No newline at end of file
diff --git a/static.files/storage-fec3eaa3851e447d.js b/static.files/storage-fec3eaa3851e447d.js
new file mode 100644
index 0000000..a687118
--- /dev/null
+++ b/static.files/storage-fec3eaa3851e447d.js
@@ -0,0 +1 @@
+"use strict";const builtinThemes=["light","dark","ayu"];const darkThemes=["dark","ayu"];window.currentTheme=document.getElementById("themeStyle");const settingsDataset=(function(){const settingsElement=document.getElementById("default-settings");return settingsElement&&settingsElement.dataset?settingsElement.dataset:null})();function getSettingValue(settingName){const current=getCurrentValue(settingName);if(current===null&&settingsDataset!==null){const def=settingsDataset[settingName.replace(/-/g,"_")];if(def!==undefined){return def}}return current}const localStoredTheme=getSettingValue("theme");function hasClass(elem,className){return elem&&elem.classList&&elem.classList.contains(className)}function addClass(elem,className){if(elem&&elem.classList){elem.classList.add(className)}}function removeClass(elem,className){if(elem&&elem.classList){elem.classList.remove(className)}}function onEach(arr,func,reversed){if(arr&&arr.length>0){if(reversed){for(let i=arr.length-1;i>=0;--i){if(func(arr[i])){return true}}}else{for(const elem of arr){if(func(elem)){return true}}}}return false}function onEachLazy(lazyArray,func,reversed){return onEach(Array.prototype.slice.call(lazyArray),func,reversed)}function updateLocalStorage(name,value){try{window.localStorage.setItem("rustdoc-"+name,value)}catch(e){}}function getCurrentValue(name){try{return window.localStorage.getItem("rustdoc-"+name)}catch(e){return null}}const getVar=(function getVar(name){const el=document.querySelector("head > meta[name='rustdoc-vars']");return el?el.attributes["data-"+name].value:null});function switchTheme(newThemeName,saveTheme){if(saveTheme){updateLocalStorage("theme",newThemeName)}document.documentElement.setAttribute("data-theme",newThemeName);if(builtinThemes.indexOf(newThemeName)!==-1){if(window.currentTheme){window.currentTheme.parentNode.removeChild(window.currentTheme);window.currentTheme=null}}else{const newHref=getVar("root-path")+newThemeName+getVar("resource-suffix")+".css";if(!window.currentTheme){if(document.readyState==="loading"){document.write(``);window.currentTheme=document.getElementById("themeStyle")}else{window.currentTheme=document.createElement("link");window.currentTheme.rel="stylesheet";window.currentTheme.id="themeStyle";window.currentTheme.href=newHref;document.documentElement.appendChild(window.currentTheme)}}else if(newHref!==window.currentTheme.href){window.currentTheme.href=newHref}}}const updateTheme=(function(){const mql=window.matchMedia("(prefers-color-scheme: dark)");function updateTheme(){if(getSettingValue("use-system-theme")!=="false"){const lightTheme=getSettingValue("preferred-light-theme")||"light";const darkTheme=getSettingValue("preferred-dark-theme")||"dark";updateLocalStorage("use-system-theme","true");switchTheme(mql.matches?darkTheme:lightTheme,true)}else{switchTheme(getSettingValue("theme"),false)}}mql.addEventListener("change",updateTheme);return updateTheme})();if(getSettingValue("use-system-theme")!=="false"&&window.matchMedia){if(getSettingValue("use-system-theme")===null&&getSettingValue("preferred-dark-theme")===null&&darkThemes.indexOf(localStoredTheme)>=0){updateLocalStorage("preferred-dark-theme",localStoredTheme)}}updateTheme();if(getSettingValue("source-sidebar-show")==="true"){addClass(document.documentElement,"src-sidebar-expanded")}window.addEventListener("pageshow",ev=>{if(ev.persisted){setTimeout(updateTheme,0)}})
\ No newline at end of file
diff --git a/static.files/wheel-7b819b6101059cd0.svg b/static.files/wheel-7b819b6101059cd0.svg
new file mode 100644
index 0000000..83c07f6
--- /dev/null
+++ b/static.files/wheel-7b819b6101059cd0.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/trait.impl/bitflags/traits/trait.Flags.js b/trait.impl/bitflags/traits/trait.Flags.js
new file mode 100644
index 0000000..0c943c3
--- /dev/null
+++ b/trait.impl/bitflags/traits/trait.Flags.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Flags for MappingFlags"],["impl Flags for PTEFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/bitflags/traits/trait.PublicFlags.js b/trait.impl/bitflags/traits/trait.PublicFlags.js
new file mode 100644
index 0000000..b98edde
--- /dev/null
+++ b/trait.impl/bitflags/traits/trait.PublicFlags.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl PublicFlags for PTEFlags"],["impl PublicFlags for MappingFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/clone/trait.Clone.js b/trait.impl/core/clone/trait.Clone.js
new file mode 100644
index 0000000..3bfb174
--- /dev/null
+++ b/trait.impl/core/clone/trait.Clone.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Clone for TrapType"],["impl Clone for EscapeReason"],["impl Clone for PhysPage"],["impl Clone for Time"],["impl Clone for VirtAddr"],["impl Clone for TrapFrame"],["impl Clone for PTEFlags"],["impl Clone for PhysAddr"],["impl Clone for MappingFlags"],["impl Clone for VirtPage"],["impl Clone for IRQVector"],["impl Clone for PageTable"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/cmp/trait.Eq.js b/trait.impl/core/cmp/trait.Eq.js
new file mode 100644
index 0000000..ec92efb
--- /dev/null
+++ b/trait.impl/core/cmp/trait.Eq.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Eq for PTEFlags"],["impl Eq for PhysPage"],["impl Eq for EscapeReason"],["impl Eq for VirtPage"],["impl Eq for VirtAddr"],["impl Eq for MappingFlags"],["impl Eq for PhysAddr"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/cmp/trait.Ord.js b/trait.impl/core/cmp/trait.Ord.js
new file mode 100644
index 0000000..b0d3db2
--- /dev/null
+++ b/trait.impl/core/cmp/trait.Ord.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Ord for PhysAddr"],["impl Ord for VirtPage"],["impl Ord for VirtAddr"],["impl Ord for PhysPage"],["impl Ord for MappingFlags"],["impl Ord for PTEFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/cmp/trait.PartialEq.js b/trait.impl/core/cmp/trait.PartialEq.js
new file mode 100644
index 0000000..c663cf6
--- /dev/null
+++ b/trait.impl/core/cmp/trait.PartialEq.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl PartialEq for VirtAddr"],["impl PartialEq for PhysAddr"],["impl PartialEq for VirtPage"],["impl PartialEq for PhysPage"],["impl PartialEq for MappingFlags"],["impl PartialEq for EscapeReason"],["impl PartialEq for PTEFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/cmp/trait.PartialOrd.js b/trait.impl/core/cmp/trait.PartialOrd.js
new file mode 100644
index 0000000..c882668
--- /dev/null
+++ b/trait.impl/core/cmp/trait.PartialOrd.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl PartialOrd for PTEFlags"],["impl PartialOrd for PhysAddr"],["impl PartialOrd for VirtAddr"],["impl PartialOrd for VirtPage"],["impl PartialOrd for MappingFlags"],["impl PartialOrd for PhysPage"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/convert/trait.From.js b/trait.impl/core/convert/trait.From.js
new file mode 100644
index 0000000..43b9632
--- /dev/null
+++ b/trait.impl/core/convert/trait.From.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl From<PhysPage> for PhysAddr"],["impl From<VirtAddr> for VirtPage"],["impl From<usize> for VirtPage"],["impl From<usize> for VirtAddr"],["impl From<VirtPage> for VirtAddr"],["impl From<VirtAddr> for usize"],["impl From<usize> for PhysPage"],["impl From<PTEFlags> for MappingFlags"],["impl From<MappingFlags> for PTEFlags"],["impl From<PhysAddr> for PhysPage"],["impl From<PhysPage> for usize"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/convert/trait.Into.js b/trait.impl/core/convert/trait.Into.js
new file mode 100644
index 0000000..33ebef0
--- /dev/null
+++ b/trait.impl/core/convert/trait.Into.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Into<EscapeReason> for TrapType"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/fmt/trait.Binary.js b/trait.impl/core/fmt/trait.Binary.js
new file mode 100644
index 0000000..d6753dd
--- /dev/null
+++ b/trait.impl/core/fmt/trait.Binary.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Binary for MappingFlags"],["impl Binary for PTEFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/fmt/trait.Debug.js b/trait.impl/core/fmt/trait.Debug.js
new file mode 100644
index 0000000..609a7a7
--- /dev/null
+++ b/trait.impl/core/fmt/trait.Debug.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Debug for KContext"],["impl Debug for PTEFlags"],["impl Debug for PhysAddr"],["impl Debug for MappingFlags"],["impl Debug for VirtAddr"],["impl Debug for IRQVector"],["impl Debug for KContextArgs"],["impl Debug for PageTable"],["impl Debug for EscapeReason"],["impl Debug for PageTableWrapper"],["impl Debug for MappingSize"],["impl Debug for PhysPage"],["impl Debug for TrapType"],["impl Debug for VirtPage"],["impl Debug for Time"],["impl<T: Debug> Debug for LazyInit<T>"],["impl Debug for TrapFrameArgs"],["impl Debug for TrapFrame"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/fmt/trait.Display.js b/trait.impl/core/fmt/trait.Display.js
new file mode 100644
index 0000000..41e68ef
--- /dev/null
+++ b/trait.impl/core/fmt/trait.Display.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Display for PhysPage"],["impl Display for VirtAddr"],["impl Display for PhysAddr"],["impl Display for VirtPage"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/fmt/trait.LowerHex.js b/trait.impl/core/fmt/trait.LowerHex.js
new file mode 100644
index 0000000..02cefc2
--- /dev/null
+++ b/trait.impl/core/fmt/trait.LowerHex.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl LowerHex for PTEFlags"],["impl LowerHex for MappingFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/fmt/trait.Octal.js b/trait.impl/core/fmt/trait.Octal.js
new file mode 100644
index 0000000..089747e
--- /dev/null
+++ b/trait.impl/core/fmt/trait.Octal.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Octal for PTEFlags"],["impl Octal for MappingFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/fmt/trait.UpperHex.js b/trait.impl/core/fmt/trait.UpperHex.js
new file mode 100644
index 0000000..cbb38d3
--- /dev/null
+++ b/trait.impl/core/fmt/trait.UpperHex.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl UpperHex for PTEFlags"],["impl UpperHex for MappingFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/fmt/trait.Write.js b/trait.impl/core/fmt/trait.Write.js
new file mode 100644
index 0000000..f2f5047
--- /dev/null
+++ b/trait.impl/core/fmt/trait.Write.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Write for DebugConsole"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/hash/trait.Hash.js b/trait.impl/core/hash/trait.Hash.js
new file mode 100644
index 0000000..3d9ddd7
--- /dev/null
+++ b/trait.impl/core/hash/trait.Hash.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Hash for PTEFlags"],["impl Hash for MappingFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/iter/traits/collect/trait.Extend.js b/trait.impl/core/iter/traits/collect/trait.Extend.js
new file mode 100644
index 0000000..b496cb5
--- /dev/null
+++ b/trait.impl/core/iter/traits/collect/trait.Extend.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Extend<MappingFlags> for MappingFlags"],["impl Extend<PTEFlags> for PTEFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/iter/traits/collect/trait.FromIterator.js b/trait.impl/core/iter/traits/collect/trait.FromIterator.js
new file mode 100644
index 0000000..2cdc97b
--- /dev/null
+++ b/trait.impl/core/iter/traits/collect/trait.FromIterator.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl FromIterator<PTEFlags> for PTEFlags"],["impl FromIterator<MappingFlags> for MappingFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/iter/traits/collect/trait.IntoIterator.js b/trait.impl/core/iter/traits/collect/trait.IntoIterator.js
new file mode 100644
index 0000000..acbd5b0
--- /dev/null
+++ b/trait.impl/core/iter/traits/collect/trait.IntoIterator.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl IntoIterator for PTEFlags"],["impl IntoIterator for MappingFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/marker/trait.Copy.js b/trait.impl/core/marker/trait.Copy.js
new file mode 100644
index 0000000..1aa7880
--- /dev/null
+++ b/trait.impl/core/marker/trait.Copy.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Copy for PhysPage"],["impl Copy for PhysAddr"],["impl Copy for EscapeReason"],["impl Copy for VirtPage"],["impl Copy for PTEFlags"],["impl Copy for MappingFlags"],["impl Copy for VirtAddr"],["impl Copy for PageTable"],["impl Copy for TrapType"],["impl Copy for Time"],["impl Copy for IRQVector"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/marker/trait.Freeze.js b/trait.impl/core/marker/trait.Freeze.js
new file mode 100644
index 0000000..26ddda1
--- /dev/null
+++ b/trait.impl/core/marker/trait.Freeze.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Freeze for PhysAddr",1,["polyhal::addr::PhysAddr"]],["impl Freeze for VirtAddr",1,["polyhal::addr::VirtAddr"]],["impl Freeze for PhysPage",1,["polyhal::addr::PhysPage"]],["impl Freeze for VirtPage",1,["polyhal::addr::VirtPage"]],["impl Freeze for DebugConsole",1,["polyhal::components::debug_console::DebugConsole"]],["impl Freeze for Instruction",1,["polyhal::components::instruction::Instruction"]],["impl Freeze for IRQ",1,["polyhal::components::irq::IRQ"]],["impl Freeze for IRQVector",1,["polyhal::components::irq::IRQVector"]],["impl Freeze for KContext",1,["polyhal::components::kcontext::riscv64::KContext"]],["impl Freeze for KContextArgs",1,["polyhal::components::kcontext::KContextArgs"]],["impl Freeze for Barrier",1,["polyhal::components::mem::Barrier"]],["impl Freeze for MultiCore",1,["polyhal::components::multicore::MultiCore"]],["impl Freeze for CpuCore",1,["polyhal::components::multicore::CpuCore"]],["impl Freeze for PTEFlags",1,["polyhal::components::pagetable::riscv64::PTEFlags"]],["impl Freeze for PageTable",1,["polyhal::components::pagetable::PageTable"]],["impl Freeze for MappingFlags",1,["polyhal::components::pagetable::MappingFlags"]],["impl Freeze for MappingSize",1,["polyhal::components::pagetable::MappingSize"]],["impl Freeze for TLB",1,["polyhal::components::pagetable::TLB"]],["impl Freeze for PageTableWrapper",1,["polyhal::components::pagetable::PageTableWrapper"]],["impl Freeze for TrapType",1,["polyhal::components::trap::TrapType"]],["impl Freeze for EscapeReason",1,["polyhal::components::trap::EscapeReason"]],["impl Freeze for TrapFrame",1,["polyhal::components::trapframe::riscv64::TrapFrame"]],["impl Freeze for KernelToken",1,["polyhal::components::trapframe::riscv64::KernelToken"]],["impl Freeze for TrapFrameArgs",1,["polyhal::components::trapframe::TrapFrameArgs"]],["impl Freeze for Time",1,["polyhal::time::Time"]],["impl<T> !Freeze for LazyInit<T>",1,["polyhal::utils::lazy_init::LazyInit"]],["impl<T> !Freeze for MutexNoIrq<T>",1,["polyhal::utils::mutex_no_irq::MutexNoIrq"]],["impl<'a, T: ?Sized> Freeze for MutexNoIrqGuard<'a, T>",1,["polyhal::utils::mutex_no_irq::MutexNoIrqGuard"]]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/marker/trait.Send.js b/trait.impl/core/marker/trait.Send.js
new file mode 100644
index 0000000..99c3f4b
--- /dev/null
+++ b/trait.impl/core/marker/trait.Send.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Send for PhysAddr",1,["polyhal::addr::PhysAddr"]],["impl Send for VirtAddr",1,["polyhal::addr::VirtAddr"]],["impl Send for PhysPage",1,["polyhal::addr::PhysPage"]],["impl Send for VirtPage",1,["polyhal::addr::VirtPage"]],["impl Send for DebugConsole",1,["polyhal::components::debug_console::DebugConsole"]],["impl Send for Instruction",1,["polyhal::components::instruction::Instruction"]],["impl Send for IRQ",1,["polyhal::components::irq::IRQ"]],["impl Send for IRQVector",1,["polyhal::components::irq::IRQVector"]],["impl Send for KContext",1,["polyhal::components::kcontext::riscv64::KContext"]],["impl Send for KContextArgs",1,["polyhal::components::kcontext::KContextArgs"]],["impl Send for Barrier",1,["polyhal::components::mem::Barrier"]],["impl Send for MultiCore",1,["polyhal::components::multicore::MultiCore"]],["impl Send for CpuCore",1,["polyhal::components::multicore::CpuCore"]],["impl Send for PTEFlags",1,["polyhal::components::pagetable::riscv64::PTEFlags"]],["impl Send for PageTable",1,["polyhal::components::pagetable::PageTable"]],["impl Send for MappingFlags",1,["polyhal::components::pagetable::MappingFlags"]],["impl Send for MappingSize",1,["polyhal::components::pagetable::MappingSize"]],["impl Send for TLB",1,["polyhal::components::pagetable::TLB"]],["impl Send for PageTableWrapper",1,["polyhal::components::pagetable::PageTableWrapper"]],["impl Send for TrapType",1,["polyhal::components::trap::TrapType"]],["impl Send for EscapeReason",1,["polyhal::components::trap::EscapeReason"]],["impl Send for TrapFrame",1,["polyhal::components::trapframe::riscv64::TrapFrame"]],["impl Send for KernelToken",1,["polyhal::components::trapframe::riscv64::KernelToken"]],["impl Send for TrapFrameArgs",1,["polyhal::components::trapframe::TrapFrameArgs"]],["impl Send for Time",1,["polyhal::time::Time"]],["impl<'a, T: ?Sized> Send for MutexNoIrqGuard<'a, T>where\n T: Send,",1,["polyhal::utils::mutex_no_irq::MutexNoIrqGuard"]],["impl<T: Send> Send for LazyInit<T>"],["impl<T: ?Sized + Send> Send for MutexNoIrq<T>"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/marker/trait.StructuralEq.js b/trait.impl/core/marker/trait.StructuralEq.js
new file mode 100644
index 0000000..d6a9ce5
--- /dev/null
+++ b/trait.impl/core/marker/trait.StructuralEq.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl StructuralEq for EscapeReason"],["impl StructuralEq for PTEFlags"],["impl StructuralEq for PhysPage"],["impl StructuralEq for VirtAddr"],["impl StructuralEq for MappingFlags"],["impl StructuralEq for VirtPage"],["impl StructuralEq for PhysAddr"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/marker/trait.StructuralPartialEq.js b/trait.impl/core/marker/trait.StructuralPartialEq.js
new file mode 100644
index 0000000..802924a
--- /dev/null
+++ b/trait.impl/core/marker/trait.StructuralPartialEq.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl StructuralPartialEq for PhysPage"],["impl StructuralPartialEq for PTEFlags"],["impl StructuralPartialEq for PhysAddr"],["impl StructuralPartialEq for EscapeReason"],["impl StructuralPartialEq for VirtAddr"],["impl StructuralPartialEq for MappingFlags"],["impl StructuralPartialEq for VirtPage"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/marker/trait.Sync.js b/trait.impl/core/marker/trait.Sync.js
new file mode 100644
index 0000000..dc040a9
--- /dev/null
+++ b/trait.impl/core/marker/trait.Sync.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Sync for PhysAddr",1,["polyhal::addr::PhysAddr"]],["impl Sync for VirtAddr",1,["polyhal::addr::VirtAddr"]],["impl Sync for PhysPage",1,["polyhal::addr::PhysPage"]],["impl Sync for VirtPage",1,["polyhal::addr::VirtPage"]],["impl Sync for DebugConsole",1,["polyhal::components::debug_console::DebugConsole"]],["impl Sync for Instruction",1,["polyhal::components::instruction::Instruction"]],["impl Sync for IRQ",1,["polyhal::components::irq::IRQ"]],["impl Sync for IRQVector",1,["polyhal::components::irq::IRQVector"]],["impl Sync for KContext",1,["polyhal::components::kcontext::riscv64::KContext"]],["impl Sync for KContextArgs",1,["polyhal::components::kcontext::KContextArgs"]],["impl Sync for Barrier",1,["polyhal::components::mem::Barrier"]],["impl Sync for MultiCore",1,["polyhal::components::multicore::MultiCore"]],["impl Sync for CpuCore",1,["polyhal::components::multicore::CpuCore"]],["impl Sync for PTEFlags",1,["polyhal::components::pagetable::riscv64::PTEFlags"]],["impl Sync for PageTable",1,["polyhal::components::pagetable::PageTable"]],["impl Sync for MappingFlags",1,["polyhal::components::pagetable::MappingFlags"]],["impl Sync for MappingSize",1,["polyhal::components::pagetable::MappingSize"]],["impl Sync for TLB",1,["polyhal::components::pagetable::TLB"]],["impl Sync for PageTableWrapper",1,["polyhal::components::pagetable::PageTableWrapper"]],["impl Sync for TrapType",1,["polyhal::components::trap::TrapType"]],["impl Sync for EscapeReason",1,["polyhal::components::trap::EscapeReason"]],["impl Sync for TrapFrame",1,["polyhal::components::trapframe::riscv64::TrapFrame"]],["impl Sync for KernelToken",1,["polyhal::components::trapframe::riscv64::KernelToken"]],["impl Sync for TrapFrameArgs",1,["polyhal::components::trapframe::TrapFrameArgs"]],["impl Sync for Time",1,["polyhal::time::Time"]],["impl<'a, T: ?Sized> Sync for MutexNoIrqGuard<'a, T>where\n T: Sync,",1,["polyhal::utils::mutex_no_irq::MutexNoIrqGuard"]],["impl<T: Send + Sync> Sync for LazyInit<T>"],["impl<T: ?Sized + Send> Sync for MutexNoIrq<T>"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/marker/trait.Unpin.js b/trait.impl/core/marker/trait.Unpin.js
new file mode 100644
index 0000000..57cae5c
--- /dev/null
+++ b/trait.impl/core/marker/trait.Unpin.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Unpin for PhysAddr",1,["polyhal::addr::PhysAddr"]],["impl Unpin for VirtAddr",1,["polyhal::addr::VirtAddr"]],["impl Unpin for PhysPage",1,["polyhal::addr::PhysPage"]],["impl Unpin for VirtPage",1,["polyhal::addr::VirtPage"]],["impl Unpin for DebugConsole",1,["polyhal::components::debug_console::DebugConsole"]],["impl Unpin for Instruction",1,["polyhal::components::instruction::Instruction"]],["impl Unpin for IRQ",1,["polyhal::components::irq::IRQ"]],["impl Unpin for IRQVector",1,["polyhal::components::irq::IRQVector"]],["impl Unpin for KContext",1,["polyhal::components::kcontext::riscv64::KContext"]],["impl Unpin for KContextArgs",1,["polyhal::components::kcontext::KContextArgs"]],["impl Unpin for Barrier",1,["polyhal::components::mem::Barrier"]],["impl Unpin for MultiCore",1,["polyhal::components::multicore::MultiCore"]],["impl Unpin for CpuCore",1,["polyhal::components::multicore::CpuCore"]],["impl Unpin for PTEFlags",1,["polyhal::components::pagetable::riscv64::PTEFlags"]],["impl Unpin for PageTable",1,["polyhal::components::pagetable::PageTable"]],["impl Unpin for MappingFlags",1,["polyhal::components::pagetable::MappingFlags"]],["impl Unpin for MappingSize",1,["polyhal::components::pagetable::MappingSize"]],["impl Unpin for TLB",1,["polyhal::components::pagetable::TLB"]],["impl Unpin for PageTableWrapper",1,["polyhal::components::pagetable::PageTableWrapper"]],["impl Unpin for TrapType",1,["polyhal::components::trap::TrapType"]],["impl Unpin for EscapeReason",1,["polyhal::components::trap::EscapeReason"]],["impl Unpin for TrapFrame",1,["polyhal::components::trapframe::riscv64::TrapFrame"]],["impl Unpin for KernelToken",1,["polyhal::components::trapframe::riscv64::KernelToken"]],["impl Unpin for TrapFrameArgs",1,["polyhal::components::trapframe::TrapFrameArgs"]],["impl Unpin for Time",1,["polyhal::time::Time"]],["impl<T> Unpin for LazyInit<T>where\n T: Unpin,",1,["polyhal::utils::lazy_init::LazyInit"]],["impl<T: ?Sized> Unpin for MutexNoIrq<T>where\n T: Unpin,",1,["polyhal::utils::mutex_no_irq::MutexNoIrq"]],["impl<'a, T: ?Sized> Unpin for MutexNoIrqGuard<'a, T>",1,["polyhal::utils::mutex_no_irq::MutexNoIrqGuard"]]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/arith/trait.Add.js b/trait.impl/core/ops/arith/trait.Add.js
new file mode 100644
index 0000000..d5c72b5
--- /dev/null
+++ b/trait.impl/core/ops/arith/trait.Add.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Add for PhysPage"],["impl Add<usize> for VirtPage"],["impl Add<usize> for PhysPage"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/arith/trait.Sub.js b/trait.impl/core/ops/arith/trait.Sub.js
new file mode 100644
index 0000000..274e8cf
--- /dev/null
+++ b/trait.impl/core/ops/arith/trait.Sub.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Sub for PTEFlags"],["impl Sub for MappingFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/arith/trait.SubAssign.js b/trait.impl/core/ops/arith/trait.SubAssign.js
new file mode 100644
index 0000000..f06aaa8
--- /dev/null
+++ b/trait.impl/core/ops/arith/trait.SubAssign.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl SubAssign for MappingFlags"],["impl SubAssign for PTEFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/bit/trait.BitAnd.js b/trait.impl/core/ops/bit/trait.BitAnd.js
new file mode 100644
index 0000000..c9a8e0b
--- /dev/null
+++ b/trait.impl/core/ops/bit/trait.BitAnd.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl BitAnd for MappingFlags"],["impl BitAnd for PTEFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/bit/trait.BitAndAssign.js b/trait.impl/core/ops/bit/trait.BitAndAssign.js
new file mode 100644
index 0000000..4dfa9cc
--- /dev/null
+++ b/trait.impl/core/ops/bit/trait.BitAndAssign.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl BitAndAssign for PTEFlags"],["impl BitAndAssign for MappingFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/bit/trait.BitOr.js b/trait.impl/core/ops/bit/trait.BitOr.js
new file mode 100644
index 0000000..60df5f4
--- /dev/null
+++ b/trait.impl/core/ops/bit/trait.BitOr.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl BitOr for PTEFlags"],["impl BitOr for MappingFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/bit/trait.BitOrAssign.js b/trait.impl/core/ops/bit/trait.BitOrAssign.js
new file mode 100644
index 0000000..159659e
--- /dev/null
+++ b/trait.impl/core/ops/bit/trait.BitOrAssign.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl BitOrAssign for PTEFlags"],["impl BitOrAssign for MappingFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/bit/trait.BitXor.js b/trait.impl/core/ops/bit/trait.BitXor.js
new file mode 100644
index 0000000..2e3d729
--- /dev/null
+++ b/trait.impl/core/ops/bit/trait.BitXor.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl BitXor for PTEFlags"],["impl BitXor for MappingFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/bit/trait.BitXorAssign.js b/trait.impl/core/ops/bit/trait.BitXorAssign.js
new file mode 100644
index 0000000..757d442
--- /dev/null
+++ b/trait.impl/core/ops/bit/trait.BitXorAssign.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl BitXorAssign for MappingFlags"],["impl BitXorAssign for PTEFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/bit/trait.Not.js b/trait.impl/core/ops/bit/trait.Not.js
new file mode 100644
index 0000000..6850590
--- /dev/null
+++ b/trait.impl/core/ops/bit/trait.Not.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Not for PTEFlags"],["impl Not for MappingFlags"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/deref/trait.Deref.js b/trait.impl/core/ops/deref/trait.Deref.js
new file mode 100644
index 0000000..a25f12e
--- /dev/null
+++ b/trait.impl/core/ops/deref/trait.Deref.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl<'a, T: ?Sized> Deref for MutexNoIrqGuard<'a, T>"],["impl<T> Deref for LazyInit<T>"],["impl Deref for PageTableWrapper"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/deref/trait.DerefMut.js b/trait.impl/core/ops/deref/trait.DerefMut.js
new file mode 100644
index 0000000..2c0788f
--- /dev/null
+++ b/trait.impl/core/ops/deref/trait.DerefMut.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl<T> DerefMut for LazyInit<T>"],["impl<'a, T: ?Sized> DerefMut for MutexNoIrqGuard<'a, T>"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/drop/trait.Drop.js b/trait.impl/core/ops/drop/trait.Drop.js
new file mode 100644
index 0000000..23946fa
--- /dev/null
+++ b/trait.impl/core/ops/drop/trait.Drop.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl<T> Drop for LazyInit<T>"],["impl Drop for PageTableWrapper"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/index/trait.Index.js b/trait.impl/core/ops/index/trait.Index.js
new file mode 100644
index 0000000..be0b7c9
--- /dev/null
+++ b/trait.impl/core/ops/index/trait.Index.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Index<TrapFrameArgs> for TrapFrame"],["impl Index<KContextArgs> for KContext"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/ops/index/trait.IndexMut.js b/trait.impl/core/ops/index/trait.IndexMut.js
new file mode 100644
index 0000000..861f748
--- /dev/null
+++ b/trait.impl/core/ops/index/trait.IndexMut.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl IndexMut<KContextArgs> for KContext"],["impl IndexMut<TrapFrameArgs> for TrapFrame"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js b/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js
new file mode 100644
index 0000000..cfcc9f1
--- /dev/null
+++ b/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl RefUnwindSafe for PhysAddr",1,["polyhal::addr::PhysAddr"]],["impl RefUnwindSafe for VirtAddr",1,["polyhal::addr::VirtAddr"]],["impl RefUnwindSafe for PhysPage",1,["polyhal::addr::PhysPage"]],["impl RefUnwindSafe for VirtPage",1,["polyhal::addr::VirtPage"]],["impl RefUnwindSafe for DebugConsole",1,["polyhal::components::debug_console::DebugConsole"]],["impl RefUnwindSafe for Instruction",1,["polyhal::components::instruction::Instruction"]],["impl RefUnwindSafe for IRQ",1,["polyhal::components::irq::IRQ"]],["impl RefUnwindSafe for IRQVector",1,["polyhal::components::irq::IRQVector"]],["impl RefUnwindSafe for KContext",1,["polyhal::components::kcontext::riscv64::KContext"]],["impl RefUnwindSafe for KContextArgs",1,["polyhal::components::kcontext::KContextArgs"]],["impl RefUnwindSafe for Barrier",1,["polyhal::components::mem::Barrier"]],["impl RefUnwindSafe for MultiCore",1,["polyhal::components::multicore::MultiCore"]],["impl RefUnwindSafe for CpuCore",1,["polyhal::components::multicore::CpuCore"]],["impl RefUnwindSafe for PTEFlags",1,["polyhal::components::pagetable::riscv64::PTEFlags"]],["impl RefUnwindSafe for PageTable",1,["polyhal::components::pagetable::PageTable"]],["impl RefUnwindSafe for MappingFlags",1,["polyhal::components::pagetable::MappingFlags"]],["impl RefUnwindSafe for MappingSize",1,["polyhal::components::pagetable::MappingSize"]],["impl RefUnwindSafe for TLB",1,["polyhal::components::pagetable::TLB"]],["impl RefUnwindSafe for PageTableWrapper",1,["polyhal::components::pagetable::PageTableWrapper"]],["impl RefUnwindSafe for TrapType",1,["polyhal::components::trap::TrapType"]],["impl RefUnwindSafe for EscapeReason",1,["polyhal::components::trap::EscapeReason"]],["impl RefUnwindSafe for TrapFrame",1,["polyhal::components::trapframe::riscv64::TrapFrame"]],["impl RefUnwindSafe for KernelToken",1,["polyhal::components::trapframe::riscv64::KernelToken"]],["impl RefUnwindSafe for TrapFrameArgs",1,["polyhal::components::trapframe::TrapFrameArgs"]],["impl RefUnwindSafe for Time",1,["polyhal::time::Time"]],["impl<T> !RefUnwindSafe for LazyInit<T>",1,["polyhal::utils::lazy_init::LazyInit"]],["impl<T> !RefUnwindSafe for MutexNoIrq<T>",1,["polyhal::utils::mutex_no_irq::MutexNoIrq"]],["impl<'a, T: ?Sized> RefUnwindSafe for MutexNoIrqGuard<'a, T>where\n T: RefUnwindSafe,",1,["polyhal::utils::mutex_no_irq::MutexNoIrqGuard"]]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js b/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js
new file mode 100644
index 0000000..dbe07a0
--- /dev/null
+++ b/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl UnwindSafe for PhysAddr",1,["polyhal::addr::PhysAddr"]],["impl UnwindSafe for VirtAddr",1,["polyhal::addr::VirtAddr"]],["impl UnwindSafe for PhysPage",1,["polyhal::addr::PhysPage"]],["impl UnwindSafe for VirtPage",1,["polyhal::addr::VirtPage"]],["impl UnwindSafe for DebugConsole",1,["polyhal::components::debug_console::DebugConsole"]],["impl UnwindSafe for Instruction",1,["polyhal::components::instruction::Instruction"]],["impl UnwindSafe for IRQ",1,["polyhal::components::irq::IRQ"]],["impl UnwindSafe for IRQVector",1,["polyhal::components::irq::IRQVector"]],["impl UnwindSafe for KContext",1,["polyhal::components::kcontext::riscv64::KContext"]],["impl UnwindSafe for KContextArgs",1,["polyhal::components::kcontext::KContextArgs"]],["impl UnwindSafe for Barrier",1,["polyhal::components::mem::Barrier"]],["impl UnwindSafe for MultiCore",1,["polyhal::components::multicore::MultiCore"]],["impl UnwindSafe for CpuCore",1,["polyhal::components::multicore::CpuCore"]],["impl UnwindSafe for PTEFlags",1,["polyhal::components::pagetable::riscv64::PTEFlags"]],["impl UnwindSafe for PageTable",1,["polyhal::components::pagetable::PageTable"]],["impl UnwindSafe for MappingFlags",1,["polyhal::components::pagetable::MappingFlags"]],["impl UnwindSafe for MappingSize",1,["polyhal::components::pagetable::MappingSize"]],["impl UnwindSafe for TLB",1,["polyhal::components::pagetable::TLB"]],["impl UnwindSafe for PageTableWrapper",1,["polyhal::components::pagetable::PageTableWrapper"]],["impl UnwindSafe for TrapType",1,["polyhal::components::trap::TrapType"]],["impl UnwindSafe for EscapeReason",1,["polyhal::components::trap::EscapeReason"]],["impl UnwindSafe for TrapFrame",1,["polyhal::components::trapframe::riscv64::TrapFrame"]],["impl UnwindSafe for KernelToken",1,["polyhal::components::trapframe::riscv64::KernelToken"]],["impl UnwindSafe for TrapFrameArgs",1,["polyhal::components::trapframe::TrapFrameArgs"]],["impl UnwindSafe for Time",1,["polyhal::time::Time"]],["impl<T> UnwindSafe for LazyInit<T>where\n T: UnwindSafe,",1,["polyhal::utils::lazy_init::LazyInit"]],["impl<T: ?Sized> UnwindSafe for MutexNoIrq<T>where\n T: UnwindSafe,",1,["polyhal::utils::mutex_no_irq::MutexNoIrq"]],["impl<'a, T: ?Sized> UnwindSafe for MutexNoIrqGuard<'a, T>where\n T: RefUnwindSafe,",1,["polyhal::utils::mutex_no_irq::MutexNoIrqGuard"]]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/trait.impl/log/trait.Log.js b/trait.impl/log/trait.Log.js
new file mode 100644
index 0000000..11c9234
--- /dev/null
+++ b/trait.impl/log/trait.Log.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"polyhal":[["impl Log for DebugConsole"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file