//! Functions and data-structures for working with descriptor tables. use crate::segmentation::SegmentSelector; use core::arch::asm; use core::fmt; use core::mem::size_of; /// A struct describing a pointer to a descriptor table (GDT / IDT). /// This is in a format suitable for giving to 'lgdt' or 'lidt'. #[repr(C, packed)] pub struct DescriptorTablePointer { /// Size of the DT. pub limit: u16, /// Pointer to the memory region containing the DT. pub base: *const Entry, } impl Default for DescriptorTablePointer { fn default() -> DescriptorTablePointer { DescriptorTablePointer { limit: 0, base: core::ptr::null(), } } } impl DescriptorTablePointer { pub fn new(tbl: &T) -> Self { // GDT, LDT, and IDT all expect the limit to be set to "one less". // See Intel 3a, Section 3.5.1 "Segment Descriptor Tables" and // Section 6.10 "Interrupt Descriptor Table (IDT)". let len = size_of::() - 1; assert!(len < 0x10000); DescriptorTablePointer { base: tbl as *const T, limit: len as u16, } } pub fn new_from_slice(slice: &[T]) -> Self { // GDT, LDT, and IDT all expect the limit to be set to "one less". // See Intel 3a, Section 3.5.1 "Segment Descriptor Tables" and // Section 6.10 "Interrupt Descriptor Table (IDT)". let len = slice.len() * size_of::() - 1; assert!(len < 0x10000); DescriptorTablePointer { base: slice.as_ptr(), limit: len as u16, } } } impl fmt::Debug for DescriptorTablePointer { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "DescriptorTablePointer ({} {:?})", { self.limit }, { self.base }) } } /// Load the GDTR register with the specified base and limit. /// /// # Safety /// Needs CPL 0. pub unsafe fn lgdt(gdt: &DescriptorTablePointer) { asm!("lgdt ({0})", in(reg) gdt, options(att_syntax)); } /// Retrieve base and limit from the GDTR register. /// /// # Safety /// Needs CPL 0. pub unsafe fn sgdt(idt: &mut DescriptorTablePointer) { asm!("sgdt ({0})", in(reg) idt as *mut DescriptorTablePointer, options(att_syntax)); } /// Loads the segment selector into the selector field of the local /// descriptor table register (LDTR). /// /// After the segment selector is loaded in the LDTR, /// the processor uses the segment selector to locate /// the segment descriptor for the LDT in the global /// descriptor table (GDT). /// /// # Safety /// Needs CPL 0. pub unsafe fn load_ldtr(selector: SegmentSelector) { asm!("lldt {0:x}", in(reg) selector.bits(), options(att_syntax)); } /// Returns the segment selector from the local descriptor table register (LDTR). /// /// The returned segment selector points to the segment descriptor /// (located in the GDT) for the current LDT. /// /// # Safety /// Needs CPL 0. pub unsafe fn ldtr() -> SegmentSelector { let selector: u16; asm!("sldt {0:x}", out(reg) selector, options(att_syntax)); SegmentSelector::from_raw(selector) } /// Load the IDTR register with the specified base and limit. /// /// # Safety /// Needs CPL 0. pub unsafe fn lidt(idt: &DescriptorTablePointer) { asm!("lidt ({0})", in(reg) idt, options(att_syntax)); } /// Retrieve base and limit from the IDTR register. /// /// # Safety /// Needs CPL 0. pub unsafe fn sidt(idt: &mut DescriptorTablePointer) { asm!("sidt ({0})", in(reg) idt as *mut DescriptorTablePointer, options(att_syntax)); } #[cfg(all(test, feature = "utest"))] mod test { use super::*; #[test] fn check_sgdt() { let mut gdtr: super::DescriptorTablePointer = Default::default(); gdtr.limit = 0xdead; gdtr.base = 0xbadc0de as *mut u64; unsafe { sgdt(&mut gdtr); } let base = gdtr.base; let limit = gdtr.limit; assert_ne!(base, core::ptr::null_mut()); assert_ne!(limit, 0xdead); assert_ne!(base as u64, 0xbadc0de); } #[test] fn check_sidt() { let mut gdtr: super::DescriptorTablePointer = Default::default(); gdtr.limit = 0xdead; gdtr.base = 0xbadc0de as *mut u64; unsafe { sidt(&mut gdtr); } let base = gdtr.base; let limit = gdtr.limit; assert_ne!(base, core::ptr::null_mut()); assert_ne!(limit, 0xdead); assert_ne!(base as u64, 0xbadc0de); } } a1?s=13&d=retro' width='13' height='13' alt='Gravatar' /> Anshul Gupta 3-0/+7 13 daysAdd `linkerd` to `audiobookshelf`Gravatar Anshul Gupta 1-0/+2 13 daysRevert "Remove linkerd injection from sonarr backup"Gravatar Anshul Gupta 1-0/+3 This reverts commit c8213ad903a29b9cbc6015c6cbb5dd664a3aeb41. The failures were caused by an expired certificate. 2025-09-11Add startup probe to lazylibrarianGravatar Anshul Gupta 1-2/+5 2025-09-11Update Helm release grafana to v9.4.5Gravatar renovate[bot] 1-1/+1 2025-09-11Update Helm release connect to v2.0.4Gravatar renovate[bot] 2-4/+4 2025-09-11Update rancher/k3s-upgrade Docker digest to 78ed84bGravatar renovate[bot] 1-1/+1 2025-09-11Update codeberg.org/emersion/soju:v0.9.0 Docker digest to 1ada980Gravatar renovate[bot] 1-1/+1 2025-09-11Update linuxserver/calibre:8.10.0 Docker digest to 652ec02Gravatar renovate[bot] 1-1/+1 2025-09-11Update lscr.io/linuxserver/nzbhydra2:7.16.3 Docker digest to f4d64f2Gravatar renovate[bot] 1-1/+1 2025-09-10Update crocodilestick/calibre-web-automated:dev Docker digest to 2eef759Gravatar renovate[bot] 1-1/+1 2025-09-10Add oauth proxy to calibre serverGravatar Anshul Gupta 3-2/+125 2025-09-10Update postgres:17.6 Docker digest to feff5b2Gravatar renovate[bot] 4-4/+4 2025-09-10Update Helm release traefik to v37.1.1Gravatar renovate[bot] 2-4/+4 2025-09-09Add rreading-glasses metadata server for bookshelfGravatar Anshul Gupta 10-1/+116 2025-09-09Add svc for calibre content serverGravatar Anshul Gupta 2-0/+16 2025-09-09Convert calibre to statefulsetGravatar Anshul Gupta 1-3/+15 2025-09-09Add bookshelfGravatar Anshul Gupta 7-0/+162 2025-09-09Update lscr.io/linuxserver/smokeping:2.9.0 Docker digest to 072cc65Gravatar renovate[bot] 1-1/+1 2025-09-09Update lscr.io/linuxserver/bazarr:1.5.2 Docker digest to fed1656Gravatar renovate[bot] 1-1/+1 2025-09-09Update Helm release datadog to v3.132.1Gravatar renovate[bot] 1-1/+1 2025-09-09Update postgres:17.6 Docker digest to 8a56befGravatar renovate[bot] 4-4/+4 2025-09-09Update lscr.io/linuxserver/jellyfin:10.10.7 Docker digest to 0844d75Gravatar renovate[bot] 1-1/+1 2025-09-09Update postgres:17.6 Docker digest to 29574e2Gravatar renovate[bot] 4-4/+4 2025-09-09Update postgres:17.6 Docker digest to ab24d83Gravatar renovate[bot] 4-4/+4 2025-09-08Remove cnpgGravatar Anshul Gupta 2-31/+0 2025-09-08Remove `homepage`Gravatar Anshul Gupta 11-514/+0 2025-09-08Remove windmillGravatar Anshul Gupta 7-195/+1 2025-09-08Run tailscale pods as non-rootGravatar Anshul Gupta 1-0/+3 2025-09-09Update postgres:17.6 Docker digest to 7be29dbGravatar renovate[bot] 4-4/+4 2025-09-09Update nginx:1.29.1 Docker digest to d5f28efGravatar renovate[bot] 1-1/+1 2025-09-08Move media apps into `media` projectGravatar Anshul Gupta 5-5/+5 2025-09-08Add `glance`Gravatar Anshul Gupta 9-0/+206 2025-09-08Update rancher/k3s-upgrade Docker digest to f3d7b08Gravatar renovate[bot] 1-1/+1 2025-09-08Add immich proxyGravatar Anshul Gupta 8-0/+151 2025-09-08Increase replica count of qb-proxyGravatar Anshul Gupta 1-1/+1 2025-09-08Use inbuilt nginx envsubst scriptGravatar Anshul Gupta 2-31/+9 2025-09-08Update nginxinc/nginx-unprivileged:1.29.1 Docker digest to ad78b4aGravatar renovate[bot] 1-1/+1 2025-09-07Switch qbt-proxy nginx to unprivilegedGravatar Anshul Gupta 1-18/+42 2025-09-08Update ghcr.io/paperless-ngx/paperless-ngx Docker tag to v2.18.4Gravatar renovate[bot] 2-2/+2 2025-09-08Update ghcr.io/community-tooling/oci-images/paperless-export Docker tag to ↵Gravatar renovate[bot] 1-1/+1 v1.2.4 2025-09-08Update postgres:17.6 Docker digest to 5250e61Gravatar renovate[bot] 4-4/+4 2025-09-07Add ingest directory to calibre-webGravatar Anshul Gupta 1-0/+5