@@ -4,7 +4,7 @@ use core::fmt;
4
4
5
5
use header:: { Tag , TagIter } ;
6
6
pub use boot_loader_name:: BootLoaderNameTag ;
7
- pub use elf_sections:: { ElfSectionsTag , ElfSection , ElfSectionIter , ElfSectionType , ElfSectionFlags , StringTable } ;
7
+ pub use elf_sections:: { ElfSectionsTag , ElfSection , ElfSectionIter , ElfSectionType , ElfSectionFlags } ;
8
8
pub use elf_sections:: { ELF_SECTION_WRITABLE , ELF_SECTION_ALLOCATED , ELF_SECTION_EXECUTABLE } ;
9
9
pub use memory_map:: { MemoryMapTag , MemoryArea , MemoryAreaIter } ;
10
10
pub use module:: { ModuleTag , ModuleIter } ;
@@ -20,38 +20,41 @@ mod memory_map;
20
20
mod module;
21
21
mod command_line;
22
22
23
- pub unsafe fn load ( address : usize ) -> & ' static BootInformation {
23
+ pub unsafe fn load ( address : usize ) -> BootInformation {
24
24
if !cfg ! ( test) {
25
25
assert_eq ! ( 0 , address & 0b111 ) ;
26
26
}
27
- let multiboot = & * ( address as * const BootInformation ) ;
27
+ let multiboot = & * ( address as * const BootInformationInner ) ;
28
28
assert_eq ! ( 0 , multiboot. total_size & 0b111 ) ;
29
29
assert ! ( multiboot. has_valid_end_tag( ) ) ;
30
- multiboot
30
+ BootInformation { inner : multiboot }
31
31
}
32
32
33
- #[ repr( C ) ]
34
33
pub struct BootInformation {
34
+ inner : * const BootInformationInner ,
35
+ }
36
+
37
+ #[ repr( C ) ]
38
+ struct BootInformationInner {
35
39
total_size : u32 ,
36
40
_reserved : u32 ,
37
- first_tag : Tag ,
38
41
}
39
42
40
43
impl BootInformation {
41
44
pub fn start_address ( & self ) -> usize {
42
- self as * const _ as usize
45
+ self . inner as usize
43
46
}
44
47
45
48
pub fn end_address ( & self ) -> usize {
46
49
self . start_address ( ) + self . total_size ( )
47
50
}
48
51
49
52
pub fn total_size ( & self ) -> usize {
50
- self . total_size as usize
53
+ self . get ( ) . total_size as usize
51
54
}
52
55
53
- pub fn elf_sections_tag ( & self ) -> Option < & ' static ElfSectionsTag > {
54
- self . get_tag ( 9 ) . map ( |tag| unsafe { & * ( tag as * const Tag as * const ElfSectionsTag ) } )
56
+ pub fn elf_sections_tag ( & self ) -> Option < ElfSectionsTag > {
57
+ self . get_tag ( 9 ) . map ( |tag| elf_sections :: elf_sections_tag ( tag) )
55
58
}
56
59
57
60
pub fn memory_map_tag ( & self ) -> Option < & ' static MemoryMapTag > {
@@ -70,22 +73,28 @@ impl BootInformation {
70
73
self . get_tag ( 1 ) . map ( |tag| unsafe { & * ( tag as * const Tag as * const CommandLineTag ) } )
71
74
}
72
75
73
- fn has_valid_end_tag ( & self ) -> bool {
74
- const END_TAG : Tag = Tag { typ : 0 , size : 8 } ;
75
-
76
- let self_ptr = self as * const _ ;
77
- let end_tag_addr = self_ptr as usize + ( self . total_size - END_TAG . size ) as usize ;
78
- let end_tag = unsafe { & * ( end_tag_addr as * const Tag ) } ;
79
-
80
- end_tag. typ == END_TAG . typ && end_tag. size == END_TAG . size
76
+ fn get ( & self ) -> & BootInformationInner {
77
+ unsafe { & * self . inner }
81
78
}
82
79
83
80
fn get_tag ( & self , typ : u32 ) -> Option < & ' static Tag > {
84
81
self . tags ( ) . find ( |tag| tag. typ == typ)
85
82
}
86
83
87
84
fn tags ( & self ) -> TagIter {
88
- TagIter { current : & self . first_tag as * const _ }
85
+ TagIter { current : unsafe { self . inner . offset ( 1 ) } as * const _ }
86
+ }
87
+ }
88
+
89
+ impl BootInformationInner {
90
+ fn has_valid_end_tag ( & self ) -> bool {
91
+ const END_TAG : Tag = Tag { typ : 0 , size : 8 } ;
92
+
93
+ let self_ptr = self as * const _ ;
94
+ let end_tag_addr = self_ptr as usize + ( self . total_size - END_TAG . size ) as usize ;
95
+ let end_tag = unsafe { & * ( end_tag_addr as * const Tag ) } ;
96
+
97
+ end_tag. typ == END_TAG . typ && end_tag. size == END_TAG . size
89
98
}
90
99
}
91
100
@@ -113,11 +122,10 @@ impl fmt::Debug for BootInformation {
113
122
}
114
123
115
124
if let Some ( elf_sections_tag) = self . elf_sections_tag ( ) {
116
- let string_table = elf_sections_tag. string_table ( ) ;
117
125
writeln ! ( f, "kernel sections:" ) ?;
118
126
for s in elf_sections_tag. sections ( ) {
119
127
writeln ! ( f, " name: {:15}, S: {:#08X}, E: {:#08X}, L: {:#08X}, F: {:#04X}" ,
120
- string_table . section_name ( s ) , s. start_address( ) ,
128
+ s . name ( ) , s. start_address( ) ,
121
129
s. start_address( ) + s. size( ) , s. size( ) , s. flags( ) . bits( ) ) ?;
122
130
}
123
131
}
@@ -500,53 +508,51 @@ mod tests {
500
508
assert_eq ! ( addr + bytes. len( ) , bi. end_address( ) ) ;
501
509
assert_eq ! ( bytes. len( ) , bi. total_size( ) as usize ) ;
502
510
let es = bi. elf_sections_tag ( ) . unwrap ( ) ;
503
- let st = es. string_table ( ) ;
504
- assert_eq ! ( string_addr, st as * const _ as u64 ) ;
505
511
let mut s = es. sections ( ) ;
506
512
let s1 = s. next ( ) . unwrap ( ) ;
507
- assert_eq ! ( ".rodata" , st . section_name ( s1 ) ) ;
513
+ assert_eq ! ( ".rodata" , s1 . name ( ) ) ;
508
514
assert_eq ! ( 0xFFFF_8000_0010_0000 , s1. start_address( ) ) ;
509
515
assert_eq ! ( 0xFFFF_8000_0010_3000 , s1. end_address( ) ) ;
510
516
assert_eq ! ( 0x0000_0000_0000_3000 , s1. size( ) ) ;
511
517
assert_eq ! ( ELF_SECTION_ALLOCATED , s1. flags( ) ) ;
512
518
assert_eq ! ( ElfSectionType :: ProgramSection , s1. section_type( ) ) ;
513
519
let s2 = s. next ( ) . unwrap ( ) ;
514
- assert_eq ! ( ".text" , st . section_name ( s2 ) ) ;
520
+ assert_eq ! ( ".text" , s2 . name ( ) ) ;
515
521
assert_eq ! ( 0xFFFF_8000_0010_3000 , s2. start_address( ) ) ;
516
522
assert_eq ! ( 0xFFFF_8000_0010_C000 , s2. end_address( ) ) ;
517
523
assert_eq ! ( 0x0000_0000_0000_9000 , s2. size( ) ) ;
518
524
assert_eq ! ( ELF_SECTION_EXECUTABLE | ELF_SECTION_ALLOCATED , s2. flags( ) ) ;
519
525
assert_eq ! ( ElfSectionType :: ProgramSection , s2. section_type( ) ) ;
520
526
let s3 = s. next ( ) . unwrap ( ) ;
521
- assert_eq ! ( ".data" , st . section_name ( s3 ) ) ;
527
+ assert_eq ! ( ".data" , s3 . name ( ) ) ;
522
528
assert_eq ! ( 0xFFFF_8000_0010_C000 , s3. start_address( ) ) ;
523
529
assert_eq ! ( 0xFFFF_8000_0010_E000 , s3. end_address( ) ) ;
524
530
assert_eq ! ( 0x0000_0000_0000_2000 , s3. size( ) ) ;
525
531
assert_eq ! ( ELF_SECTION_ALLOCATED | ELF_SECTION_WRITABLE , s3. flags( ) ) ;
526
532
assert_eq ! ( ElfSectionType :: ProgramSection , s3. section_type( ) ) ;
527
533
let s4 = s. next ( ) . unwrap ( ) ;
528
- assert_eq ! ( ".bss" , st . section_name ( s4 ) ) ;
534
+ assert_eq ! ( ".bss" , s4 . name ( ) ) ;
529
535
assert_eq ! ( 0xFFFF_8000_0010_E000 , s4. start_address( ) ) ;
530
536
assert_eq ! ( 0xFFFF_8000_0011_3000 , s4. end_address( ) ) ;
531
537
assert_eq ! ( 0x0000_0000_0000_5000 , s4. size( ) ) ;
532
538
assert_eq ! ( ELF_SECTION_ALLOCATED | ELF_SECTION_WRITABLE , s4. flags( ) ) ;
533
539
assert_eq ! ( ElfSectionType :: Uninitialized , s4. section_type( ) ) ;
534
540
let s5 = s. next ( ) . unwrap ( ) ;
535
- assert_eq ! ( ".data.rel.ro" , st . section_name ( s5 ) ) ;
541
+ assert_eq ! ( ".data.rel.ro" , s5 . name ( ) ) ;
536
542
assert_eq ! ( 0xFFFF_8000_0011_3000 , s5. start_address( ) ) ;
537
543
assert_eq ! ( 0xFFFF_8000_0011_3000 , s5. end_address( ) ) ;
538
544
assert_eq ! ( 0x0000_0000_0000_0000 , s5. size( ) ) ;
539
545
assert_eq ! ( ELF_SECTION_ALLOCATED | ELF_SECTION_WRITABLE , s5. flags( ) ) ;
540
546
assert_eq ! ( ElfSectionType :: ProgramSection , s5. section_type( ) ) ;
541
547
let s6 = s. next ( ) . unwrap ( ) ;
542
- assert_eq ! ( ".symtab" , st . section_name ( s6 ) ) ;
548
+ assert_eq ! ( ".symtab" , s6 . name ( ) ) ;
543
549
assert_eq ! ( 0x0000_0000_0011_3000 , s6. start_address( ) ) ;
544
550
assert_eq ! ( 0x0000_0000_0011_5BE0 , s6. end_address( ) ) ;
545
551
assert_eq ! ( 0x0000_0000_0000_2BE0 , s6. size( ) ) ;
546
552
assert_eq ! ( ElfSectionFlags :: empty( ) , s6. flags( ) ) ;
547
553
assert_eq ! ( ElfSectionType :: LinkerSymbolTable , s6. section_type( ) ) ;
548
554
let s7 = s. next ( ) . unwrap ( ) ;
549
- assert_eq ! ( ".strtab" , st . section_name ( s7 ) ) ;
555
+ assert_eq ! ( ".strtab" , s7 . name ( ) ) ;
550
556
assert_eq ! ( 0x0000_0000_0011_5BE0 , s7. start_address( ) ) ;
551
557
assert_eq ! ( 0x0000_0000_0011_9371 , s7. end_address( ) ) ;
552
558
assert_eq ! ( 0x0000_0000_0000_3791 , s7. size( ) ) ;
0 commit comments