working on iso structs
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
Signed-off-by: Julien CLEMENT <julien.clement@epita.fr>
This commit is contained in:
parent
c4531b5074
commit
f567198f75
@ -1,25 +1,157 @@
|
|||||||
|
const ISO_BLOCK_SIZE: usize = 2048;
|
||||||
|
|
||||||
|
// Twin values structs
|
||||||
|
|
||||||
#[repr(C, packed)]
|
#[repr(C, packed)]
|
||||||
pub struct IsoPathTable {
|
pub struct MultiEndian32 {
|
||||||
|
le: u32, // Little endian value
|
||||||
|
be: u32, // Big endian value
|
||||||
|
}
|
||||||
|
|
||||||
|
#[repr(C, packed)]
|
||||||
|
pub struct MultiEndian16 {
|
||||||
|
le: u16, // Little endian value
|
||||||
|
be: u16, // Big endian value
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Path table structure
|
||||||
|
|
||||||
|
#[repr(C, packed)]
|
||||||
|
struct IsoPathTable {
|
||||||
idf_len: u8, // Identifier name length
|
idf_len: u8, // Identifier name length
|
||||||
ext_size: u8, // Extended attribute record length
|
ext_size: u8, // Extended attribute record length
|
||||||
data_blk: u8, // File data block index
|
data_blk: u8, // File data block index
|
||||||
parent_dir: u16, // Number of the parent dir
|
parent_dir: u16, // Number of the parent dir
|
||||||
idf: [char; 0] // Directory name, of size Self::idf_len
|
idf: [u8; 0] // Directory name, of size Self::idf_len
|
||||||
}
|
}
|
||||||
|
|
||||||
impl IsoPathTable {
|
impl IsoPathTable {
|
||||||
pub fn from(mapping: &u8) -> &Self {
|
pub fn from(mapping: &u8) -> &Self {
|
||||||
let ptr: *const u8 = mapping;
|
let ptr: *const u8 = mapping;
|
||||||
let path_table_ptr: *const IsoPathTable = ptr as *const IsoPathTable;
|
let path_table_ptr: *const Self = ptr as *const Self;
|
||||||
unsafe {
|
unsafe {
|
||||||
&*path_table_ptr
|
&*path_table_ptr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unaligned_references)]
|
#[allow(unaligned_references)]
|
||||||
pub fn get_idf(&self) -> &[char] {
|
pub fn get_idf(&self) -> &[u8] {
|
||||||
unsafe {
|
unsafe {
|
||||||
core::slice::from_raw_parts(self.idf.as_ptr(), self.idf_len as usize)
|
core::slice::from_raw_parts(self.idf.as_ptr(), self.idf_len as usize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Directory structure
|
||||||
|
|
||||||
|
const ISO_DATE_LEN: usize = 7;
|
||||||
|
|
||||||
|
#[repr(u8)]
|
||||||
|
enum IsoFileType {
|
||||||
|
HIDDEN = 0x1, // Hidden file
|
||||||
|
ISDIR = 0x2, // Directory
|
||||||
|
ASSOCIAT = 0x4, // Associated
|
||||||
|
USEEXT = 0x8, //
|
||||||
|
USEPERM = 0x10, //
|
||||||
|
MULTIDIR = 0x80 //
|
||||||
|
}
|
||||||
|
|
||||||
|
#[repr(C, packed)]
|
||||||
|
pub struct IsoDir {
|
||||||
|
dir_size: u8, // Length of directory record
|
||||||
|
ext_size: u8, // Length of extended attribute record
|
||||||
|
data_blk: MultiEndian32, // File data block index
|
||||||
|
file_size: MultiEndian32, // File size
|
||||||
|
date: [u8; ISO_DATE_LEN],
|
||||||
|
file_type: IsoFileType,
|
||||||
|
|
||||||
|
unit_size: u8,
|
||||||
|
gap_size: u8,
|
||||||
|
|
||||||
|
vol_seq: MultiEndian16,
|
||||||
|
|
||||||
|
idf_len: u8, // File name length
|
||||||
|
idf: [u8; 0], // File name
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IsoDir {
|
||||||
|
pub fn from(mapping: &u8) -> &Self {
|
||||||
|
let ptr: *const u8 = mapping;
|
||||||
|
let path_table_ptr: *const Self = ptr as *const Self;
|
||||||
|
unsafe {
|
||||||
|
&*path_table_ptr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(unaligned_references)]
|
||||||
|
pub fn get_idf(&self) -> &[u8] {
|
||||||
|
unsafe {
|
||||||
|
core::slice::from_raw_parts(self.idf.as_ptr(), self.idf_len as usize)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Primary volume descriptor structure
|
||||||
|
|
||||||
|
const ISO_PRIM_VOLDESC_BLOCK: usize = 16;
|
||||||
|
|
||||||
|
const ISO_SYSIDF_LEN: usize = 32;
|
||||||
|
const ISO_VOLIDF_LEN: usize = 32;
|
||||||
|
const ISO_VOLSET_LEN: usize = 128;
|
||||||
|
const ISO_PUBIDF_LEN: usize = 128;
|
||||||
|
const ISO_DPREP_LEN: usize = 128;
|
||||||
|
const ISO_APP_LEN: usize = 128;
|
||||||
|
const ISO_CPRFIL_LEN: usize = 37;
|
||||||
|
const ISO_ABSFIL_LEN: usize = 37;
|
||||||
|
const ISO_BIBFIL_LEN: usize = 37;
|
||||||
|
const ISO_LDATE_LEN: usize = 17;
|
||||||
|
|
||||||
|
#[repr(C, packed)]
|
||||||
|
pub struct IsoPrimVolDesc {
|
||||||
|
vol_desc_type: u8, // Volume descripto type (1)
|
||||||
|
std_identifier: [u8; 5], // standard identifier ("CD001")
|
||||||
|
vol_desc_version: u8, // Volume descriptor version (1)
|
||||||
|
|
||||||
|
_unused1: u8,
|
||||||
|
|
||||||
|
sys_idf: [u8; ISO_SYSIDF_LEN], // System identifier
|
||||||
|
vol_idf: [u8; ISO_VOLIDF_LEN], // Volume identifier
|
||||||
|
|
||||||
|
_unused2: [u8; 8],
|
||||||
|
|
||||||
|
vol_blk_count: MultiEndian32, // Number of logical blocks in the volume
|
||||||
|
|
||||||
|
_unused3: [u8; 32],
|
||||||
|
|
||||||
|
vol_set_size: MultiEndian16, // The Volume Set size of the volume
|
||||||
|
vol_seq_num: MultiEndian16, // The number of the volume in the set
|
||||||
|
vol_blk_size: MultiEndian16, // The size in bytes of a logical block
|
||||||
|
|
||||||
|
path_table_size: MultiEndian32, // Length in bytes of the path table
|
||||||
|
le_path_table_blk: u32, // Path table block index little endian
|
||||||
|
le_opt_path_table_blk: u32, // Optionnal path table block index little endian
|
||||||
|
be_path_table_blk: u32,
|
||||||
|
be_opt_path_table_blk: u32,
|
||||||
|
|
||||||
|
root_dir: IsoDir, // Root directory entry
|
||||||
|
|
||||||
|
_unused4: [u8; 34 - core::mem::size_of::<IsoDir>()], // Padding
|
||||||
|
|
||||||
|
volset_idf: [u8; ISO_VOLSET_LEN], // name of the multiple volume set
|
||||||
|
pub_idf: [u8; ISO_PUBIDF_LEN], // Publisher name
|
||||||
|
dprep_idf: [u8; ISO_DPREP_LEN], // Data preparer name
|
||||||
|
app_idf: [u8; ISO_APP_LEN], // Application name
|
||||||
|
|
||||||
|
copyright_file: [u8; ISO_CPRFIL_LEN], // Copyright file name in root dir
|
||||||
|
abstract_file: [u8; ISO_ABSFIL_LEN], // Abstract file name in root dir
|
||||||
|
bibli_file: [u8; ISO_BIBFIL_LEN], // Bibliograpgic file name in root dir
|
||||||
|
date_creat: [u8; ISO_LDATE_LEN], // Creation date
|
||||||
|
date_modif: [u8; ISO_LDATE_LEN], // Modification date
|
||||||
|
date_expir: [u8; ISO_LDATE_LEN], // Expiration date
|
||||||
|
date_effect: [u8; ISO_LDATE_LEN], // Effective date
|
||||||
|
|
||||||
|
file_struct_version: u8, // File structure version (1)
|
||||||
}
|
}
|
@ -1 +1 @@
|
|||||||
mod iso9660;
|
pub mod iso9660;
|
@ -1 +1 @@
|
|||||||
mod iso;
|
pub mod iso;
|
@ -18,6 +18,8 @@ use drivers::vga::{self, Color, ColorCode};
|
|||||||
use multiboot2::BootInformation;
|
use multiboot2::BootInformation;
|
||||||
use task::{executor::Executor, keyboard, Task};
|
use task::{executor::Executor, keyboard, Task};
|
||||||
|
|
||||||
|
use fs::iso::iso9660::{IsoDir, IsoPrimVolDesc, MultiEndian32};
|
||||||
|
|
||||||
#[alloc_error_handler]
|
#[alloc_error_handler]
|
||||||
fn alloc_error_handler(layout: alloc::alloc::Layout) -> ! {
|
fn alloc_error_handler(layout: alloc::alloc::Layout) -> ! {
|
||||||
panic!("Allocation error: {:?}", layout)
|
panic!("Allocation error: {:?}", layout)
|
||||||
@ -54,8 +56,11 @@ pub extern "C" fn julios_main(multiboot_info_addr: usize) -> ! {
|
|||||||
println!("***JuliOS V0.1.0***");
|
println!("***JuliOS V0.1.0***");
|
||||||
serial_println!("Hello serial");
|
serial_println!("Hello serial");
|
||||||
|
|
||||||
|
serial_println!("{}", core::mem::size_of::<IsoPrimVolDesc>());
|
||||||
|
serial_println!("{}", core::mem::size_of::<IsoDir>());
|
||||||
|
serial_println!("{}", core::mem::size_of::<MultiEndian32>());
|
||||||
|
|
||||||
let mut executor = Executor::new();
|
let mut executor = Executor::new();
|
||||||
executor.spawn(Task::new(drivers::atapi::print_block()));
|
|
||||||
executor.spawn(Task::new(keyboard::print_keypresses()));
|
executor.spawn(Task::new(keyboard::print_keypresses()));
|
||||||
executor.run();
|
executor.run();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user