@@ -32,7 +32,7 @@ pub unsafe fn load(address: usize) -> &'static BootInformation {
32
32
33
33
#[ repr( C ) ]
34
34
pub struct BootInformation {
35
- pub total_size : u32 ,
35
+ total_size : u32 ,
36
36
_reserved : u32 ,
37
37
first_tag : Tag ,
38
38
}
@@ -43,27 +43,31 @@ impl BootInformation {
43
43
}
44
44
45
45
pub fn end_address ( & self ) -> usize {
46
- self . start_address ( ) + self . total_size as usize
46
+ self . start_address ( ) + self . total_size ( )
47
+ }
48
+
49
+ pub fn total_size ( & self ) -> usize {
50
+ self . total_size as usize
47
51
}
48
52
49
53
pub fn elf_sections_tag ( & self ) -> Option < & ' static ElfSectionsTag > {
50
- self . get_tag ( 9 ) . map ( |tag| unsafe { & * ( tag as * const Tag as * const ElfSectionsTag ) } )
54
+ self . get_tag ( 9 ) . map ( |tag| unsafe { & * ( tag as * const Tag as * const ElfSectionsTag ) } )
51
55
}
52
56
53
57
pub fn memory_map_tag ( & self ) -> Option < & ' static MemoryMapTag > {
54
- self . get_tag ( 6 ) . map ( |tag| unsafe { & * ( tag as * const Tag as * const MemoryMapTag ) } )
58
+ self . get_tag ( 6 ) . map ( |tag| unsafe { & * ( tag as * const Tag as * const MemoryMapTag ) } )
55
59
}
56
60
57
61
pub fn module_tags ( & self ) -> ModuleIter {
58
- ModuleIter { iter : self . tags ( ) }
62
+ module :: module_iter ( self . tags ( ) )
59
63
}
60
64
61
65
pub fn boot_loader_name_tag ( & self ) -> Option < & ' static BootLoaderNameTag > {
62
- self . get_tag ( 2 ) . map ( |tag| unsafe { & * ( tag as * const Tag as * const BootLoaderNameTag ) } )
66
+ self . get_tag ( 2 ) . map ( |tag| unsafe { & * ( tag as * const Tag as * const BootLoaderNameTag ) } )
63
67
}
64
68
65
69
pub fn command_line_tag ( & self ) -> Option < & ' static CommandLineTag > {
66
- self . get_tag ( 1 ) . map ( |tag| unsafe { & * ( tag as * const Tag as * const CommandLineTag ) } )
70
+ self . get_tag ( 1 ) . map ( |tag| unsafe { & * ( tag as * const Tag as * const CommandLineTag ) } )
67
71
}
68
72
69
73
fn has_valid_end_tag ( & self ) -> bool {
@@ -81,7 +85,7 @@ impl BootInformation {
81
85
}
82
86
83
87
fn tags ( & self ) -> TagIter {
84
- TagIter { current : & self . first_tag as * const _ }
88
+ TagIter { current : & self . first_tag as * const _ }
85
89
}
86
90
}
87
91
@@ -90,7 +94,7 @@ impl fmt::Debug for BootInformation {
90
94
writeln ! ( f, "multiboot information" ) ?;
91
95
92
96
writeln ! ( f, "S: {:#010X}, E: {:#010X}, L: {:#010X}" ,
93
- self . start_address( ) , self . end_address( ) , self . total_size) ?;
97
+ self . start_address( ) , self . end_address( ) , self . total_size( ) ) ?;
94
98
95
99
if let Some ( boot_loader_name_tag) = self . boot_loader_name_tag ( ) {
96
100
writeln ! ( f, "boot loader name: {}" , boot_loader_name_tag. name( ) ) ?;
@@ -104,7 +108,7 @@ impl fmt::Debug for BootInformation {
104
108
writeln ! ( f, "memory areas:" ) ?;
105
109
for area in memory_map_tag. memory_areas ( ) {
106
110
writeln ! ( f, " S: {:#010X}, E: {:#010X}, L: {:#010X}" ,
107
- area. base_addr , area. base_addr + area . length , area. length ) ?;
111
+ area. start_address ( ) , area. end_address ( ) , area. size ( ) ) ?;
108
112
}
109
113
}
110
114
@@ -113,7 +117,8 @@ impl fmt::Debug for BootInformation {
113
117
writeln ! ( f, "kernel sections:" ) ?;
114
118
for s in elf_sections_tag. sections ( ) {
115
119
writeln ! ( f, " name: {:15}, S: {:#08X}, E: {:#08X}, L: {:#08X}, F: {:#04X}" ,
116
- string_table. section_name( s) , s. addr, s. addr + s. size, s. size, s. flags) ?;
120
+ string_table. section_name( s) , s. start_address( ) ,
121
+ s. start_address( ) + s. size( ) , s. size( ) , s. flags( ) . bits( ) ) ?;
117
122
}
118
123
}
119
124
@@ -130,6 +135,8 @@ impl fmt::Debug for BootInformation {
130
135
#[ cfg( test) ]
131
136
mod tests {
132
137
use super :: load;
138
+ use super :: { ElfSectionFlags , ELF_SECTION_EXECUTABLE , ELF_SECTION_ALLOCATED , ELF_SECTION_WRITABLE } ;
139
+ use super :: ElfSectionType ;
133
140
134
141
#[ test]
135
142
fn no_tags ( ) {
@@ -143,7 +150,7 @@ mod tests {
143
150
let bi = unsafe { load ( addr) } ;
144
151
assert_eq ! ( addr, bi. start_address( ) ) ;
145
152
assert_eq ! ( addr + bytes. len( ) , bi. end_address( ) ) ;
146
- assert_eq ! ( bytes. len( ) , bi. total_size as usize ) ;
153
+ assert_eq ! ( bytes. len( ) , bi. total_size( ) ) ;
147
154
assert ! ( bi. elf_sections_tag( ) . is_none( ) ) ;
148
155
assert ! ( bi. memory_map_tag( ) . is_none( ) ) ;
149
156
assert ! ( bi. module_tags( ) . next( ) . is_none( ) ) ;
@@ -165,7 +172,7 @@ mod tests {
165
172
let bi = unsafe { load ( addr) } ;
166
173
assert_eq ! ( addr, bi. start_address( ) ) ;
167
174
assert_eq ! ( addr + bytes. len( ) , bi. end_address( ) ) ;
168
- assert_eq ! ( bytes. len( ) , bi. total_size as usize ) ;
175
+ assert_eq ! ( bytes. len( ) , bi. total_size( ) ) ;
169
176
assert ! ( bi. elf_sections_tag( ) . is_none( ) ) ;
170
177
assert ! ( bi. memory_map_tag( ) . is_none( ) ) ;
171
178
assert ! ( bi. module_tags( ) . next( ) . is_none( ) ) ;
@@ -187,7 +194,7 @@ mod tests {
187
194
let bi = unsafe { load ( addr) } ;
188
195
assert_eq ! ( addr, bi. start_address( ) ) ;
189
196
assert_eq ! ( addr + bytes. len( ) , bi. end_address( ) ) ;
190
- assert_eq ! ( bytes. len( ) , bi. total_size as usize ) ;
197
+ assert_eq ! ( bytes. len( ) , bi. total_size( ) ) ;
191
198
assert ! ( bi. elf_sections_tag( ) . is_none( ) ) ;
192
199
assert ! ( bi. memory_map_tag( ) . is_none( ) ) ;
193
200
assert ! ( bi. module_tags( ) . next( ) . is_none( ) ) ;
@@ -211,14 +218,15 @@ mod tests {
211
218
let bi = unsafe { load ( addr) } ;
212
219
assert_eq ! ( addr, bi. start_address( ) ) ;
213
220
assert_eq ! ( addr + bytes. len( ) , bi. end_address( ) ) ;
214
- assert_eq ! ( bytes. len( ) , bi. total_size as usize ) ;
221
+ assert_eq ! ( bytes. len( ) , bi. total_size( ) ) ;
215
222
assert ! ( bi. elf_sections_tag( ) . is_none( ) ) ;
216
223
assert ! ( bi. memory_map_tag( ) . is_none( ) ) ;
217
224
assert ! ( bi. module_tags( ) . next( ) . is_none( ) ) ;
218
225
assert_eq ! ( "name" , bi. boot_loader_name_tag( ) . unwrap( ) . name( ) ) ;
219
226
assert ! ( bi. command_line_tag( ) . is_none( ) ) ;
220
227
}
221
228
229
+ #[ cfg( not( feature = "elf32" ) ) ]
222
230
#[ test]
223
231
fn grub2 ( ) {
224
232
let mut bytes: [ u8 ; 960 ] = [
@@ -490,7 +498,7 @@ mod tests {
490
498
let bi = unsafe { load ( addr) } ;
491
499
assert_eq ! ( addr, bi. start_address( ) ) ;
492
500
assert_eq ! ( addr + bytes. len( ) , bi. end_address( ) ) ;
493
- assert_eq ! ( bytes. len( ) , bi. total_size as usize ) ;
501
+ assert_eq ! ( bytes. len( ) , bi. total_size( ) as usize ) ;
494
502
let es = bi. elf_sections_tag ( ) . unwrap ( ) ;
495
503
let st = es. string_table ( ) ;
496
504
assert_eq ! ( string_addr, st as * const _ as u64 ) ;
@@ -499,52 +507,61 @@ mod tests {
499
507
assert_eq ! ( ".rodata" , st. section_name( s1) ) ;
500
508
assert_eq ! ( 0xFFFF_8000_0010_0000 , s1. start_address( ) ) ;
501
509
assert_eq ! ( 0xFFFF_8000_0010_3000 , s1. end_address( ) ) ;
502
- assert_eq ! ( 0x0000_0000_0000_3000 , s1. size) ;
503
- assert_eq ! ( 2 , s1. flags) ;
510
+ assert_eq ! ( 0x0000_0000_0000_3000 , s1. size( ) ) ;
511
+ assert_eq ! ( ELF_SECTION_ALLOCATED , s1. flags( ) ) ;
512
+ assert_eq ! ( ElfSectionType :: ProgramSection , s1. section_type( ) ) ;
504
513
let s2 = s. next ( ) . unwrap ( ) ;
505
514
assert_eq ! ( ".text" , st. section_name( s2) ) ;
506
515
assert_eq ! ( 0xFFFF_8000_0010_3000 , s2. start_address( ) ) ;
507
516
assert_eq ! ( 0xFFFF_8000_0010_C000 , s2. end_address( ) ) ;
508
- assert_eq ! ( 0x0000_0000_0000_9000 , s2. size) ;
509
- assert_eq ! ( 6 , s2. flags) ;
517
+ assert_eq ! ( 0x0000_0000_0000_9000 , s2. size( ) ) ;
518
+ assert_eq ! ( ELF_SECTION_EXECUTABLE | ELF_SECTION_ALLOCATED , s2. flags( ) ) ;
519
+ assert_eq ! ( ElfSectionType :: ProgramSection , s2. section_type( ) ) ;
510
520
let s3 = s. next ( ) . unwrap ( ) ;
511
521
assert_eq ! ( ".data" , st. section_name( s3) ) ;
512
522
assert_eq ! ( 0xFFFF_8000_0010_C000 , s3. start_address( ) ) ;
513
523
assert_eq ! ( 0xFFFF_8000_0010_E000 , s3. end_address( ) ) ;
514
- assert_eq ! ( 0x0000_0000_0000_2000 , s3. size) ;
515
- assert_eq ! ( 3 , s3. flags) ;
524
+ assert_eq ! ( 0x0000_0000_0000_2000 , s3. size( ) ) ;
525
+ assert_eq ! ( ELF_SECTION_ALLOCATED | ELF_SECTION_WRITABLE , s3. flags( ) ) ;
526
+ assert_eq ! ( ElfSectionType :: ProgramSection , s3. section_type( ) ) ;
516
527
let s4 = s. next ( ) . unwrap ( ) ;
517
528
assert_eq ! ( ".bss" , st. section_name( s4) ) ;
518
529
assert_eq ! ( 0xFFFF_8000_0010_E000 , s4. start_address( ) ) ;
519
530
assert_eq ! ( 0xFFFF_8000_0011_3000 , s4. end_address( ) ) ;
520
- assert_eq ! ( 0x0000_0000_0000_5000 , s4. size) ;
521
- assert_eq ! ( 3 , s4. flags) ;
531
+ assert_eq ! ( 0x0000_0000_0000_5000 , s4. size( ) ) ;
532
+ assert_eq ! ( ELF_SECTION_ALLOCATED | ELF_SECTION_WRITABLE , s4. flags( ) ) ;
533
+ assert_eq ! ( ElfSectionType :: Uninitialized , s4. section_type( ) ) ;
522
534
let s5 = s. next ( ) . unwrap ( ) ;
523
535
assert_eq ! ( ".data.rel.ro" , st. section_name( s5) ) ;
524
536
assert_eq ! ( 0xFFFF_8000_0011_3000 , s5. start_address( ) ) ;
525
537
assert_eq ! ( 0xFFFF_8000_0011_3000 , s5. end_address( ) ) ;
526
- assert_eq ! ( 0x0000_0000_0000_0000 , s5. size) ;
527
- assert_eq ! ( 3 , s5. flags) ;
538
+ assert_eq ! ( 0x0000_0000_0000_0000 , s5. size( ) ) ;
539
+ assert_eq ! ( ELF_SECTION_ALLOCATED | ELF_SECTION_WRITABLE , s5. flags( ) ) ;
540
+ assert_eq ! ( ElfSectionType :: ProgramSection , s5. section_type( ) ) ;
528
541
let s6 = s. next ( ) . unwrap ( ) ;
529
542
assert_eq ! ( ".symtab" , st. section_name( s6) ) ;
530
543
assert_eq ! ( 0x0000_0000_0011_3000 , s6. start_address( ) ) ;
531
544
assert_eq ! ( 0x0000_0000_0011_5BE0 , s6. end_address( ) ) ;
532
- assert_eq ! ( 0x0000_0000_0000_2BE0 , s6. size) ;
533
- assert_eq ! ( 0 , s6. flags) ;
545
+ assert_eq ! ( 0x0000_0000_0000_2BE0 , s6. size( ) ) ;
546
+ assert_eq ! ( ElfSectionFlags :: empty( ) , s6. flags( ) ) ;
547
+ assert_eq ! ( ElfSectionType :: LinkerSymbolTable , s6. section_type( ) ) ;
534
548
let s7 = s. next ( ) . unwrap ( ) ;
535
549
assert_eq ! ( ".strtab" , st. section_name( s7) ) ;
536
550
assert_eq ! ( 0x0000_0000_0011_5BE0 , s7. start_address( ) ) ;
537
551
assert_eq ! ( 0x0000_0000_0011_9371 , s7. end_address( ) ) ;
538
- assert_eq ! ( 0x0000_0000_0000_3791 , s7. size) ;
539
- assert_eq ! ( 0 , s7. flags) ;
552
+ assert_eq ! ( 0x0000_0000_0000_3791 , s7. size( ) ) ;
553
+ assert_eq ! ( ElfSectionFlags :: empty( ) , s7. flags( ) ) ;
554
+ assert_eq ! ( ElfSectionType :: StringTable , s7. section_type( ) ) ;
540
555
assert ! ( s. next( ) . is_none( ) ) ;
541
556
let mut mm = bi. memory_map_tag ( ) . unwrap ( ) . memory_areas ( ) ;
542
557
let mm1 = mm. next ( ) . unwrap ( ) ;
543
- assert_eq ! ( 0x00000000 , mm1. base_addr) ;
544
- assert_eq ! ( 0x009_FC00 , mm1. length) ;
558
+ assert_eq ! ( 0x00000000 , mm1. start_address( ) ) ;
559
+ assert_eq ! ( 0x009_FC00 , mm1. end_address( ) ) ;
560
+ assert_eq ! ( 0x009_FC00 , mm1. size( ) ) ;
545
561
let mm2 = mm. next ( ) . unwrap ( ) ;
546
- assert_eq ! ( 0x010_0000 , mm2. base_addr) ;
547
- assert_eq ! ( 0x7EE_0000 , mm2. length) ;
562
+ assert_eq ! ( 0x010_0000 , mm2. start_address( ) ) ;
563
+ assert_eq ! ( 0x7FE_0000 , mm2. end_address( ) ) ;
564
+ assert_eq ! ( 0x7EE_0000 , mm2. size( ) ) ;
548
565
assert ! ( mm. next( ) . is_none( ) ) ;
549
566
assert ! ( bi. module_tags( ) . next( ) . is_none( ) ) ;
550
567
assert_eq ! ( "GRUB 2.02~beta3-5" , bi. boot_loader_name_tag( ) . unwrap( ) . name( ) ) ;
0 commit comments