@@ -995,15 +995,25 @@ early_param("memmap", parse_memmap_opt);
995995 */
996996void __init e820__reserve_setup_data (void )
997997{
998+ struct setup_indirect * indirect ;
998999 struct setup_data * data ;
999- u64 pa_data ;
1000+ u64 pa_data , pa_next ;
1001+ u32 len ;
10001002
10011003 pa_data = boot_params .hdr .setup_data ;
10021004 if (!pa_data )
10031005 return ;
10041006
10051007 while (pa_data ) {
10061008 data = early_memremap (pa_data , sizeof (* data ));
1009+ if (!data ) {
1010+ pr_warn ("e820: failed to memremap setup_data entry\n" );
1011+ return ;
1012+ }
1013+
1014+ len = sizeof (* data );
1015+ pa_next = data -> next ;
1016+
10071017 e820__range_update (pa_data , sizeof (* data )+ data -> len , E820_TYPE_RAM , E820_TYPE_RESERVED_KERN );
10081018
10091019 /*
@@ -1015,18 +1025,27 @@ void __init e820__reserve_setup_data(void)
10151025 sizeof (* data ) + data -> len ,
10161026 E820_TYPE_RAM , E820_TYPE_RESERVED_KERN );
10171027
1018- if (data -> type == SETUP_INDIRECT &&
1019- ((struct setup_indirect * )data -> data )-> type != SETUP_INDIRECT ) {
1020- e820__range_update (((struct setup_indirect * )data -> data )-> addr ,
1021- ((struct setup_indirect * )data -> data )-> len ,
1022- E820_TYPE_RAM , E820_TYPE_RESERVED_KERN );
1023- e820__range_update_kexec (((struct setup_indirect * )data -> data )-> addr ,
1024- ((struct setup_indirect * )data -> data )-> len ,
1025- E820_TYPE_RAM , E820_TYPE_RESERVED_KERN );
1028+ if (data -> type == SETUP_INDIRECT ) {
1029+ len += data -> len ;
1030+ early_memunmap (data , sizeof (* data ));
1031+ data = early_memremap (pa_data , len );
1032+ if (!data ) {
1033+ pr_warn ("e820: failed to memremap indirect setup_data\n" );
1034+ return ;
1035+ }
1036+
1037+ indirect = (struct setup_indirect * )data -> data ;
1038+
1039+ if (indirect -> type != SETUP_INDIRECT ) {
1040+ e820__range_update (indirect -> addr , indirect -> len ,
1041+ E820_TYPE_RAM , E820_TYPE_RESERVED_KERN );
1042+ e820__range_update_kexec (indirect -> addr , indirect -> len ,
1043+ E820_TYPE_RAM , E820_TYPE_RESERVED_KERN );
1044+ }
10261045 }
10271046
1028- pa_data = data -> next ;
1029- early_memunmap (data , sizeof ( * data ) );
1047+ pa_data = pa_next ;
1048+ early_memunmap (data , len );
10301049 }
10311050
10321051 e820__update_table (e820_table );
0 commit comments