@@ -114,12 +114,8 @@ static int check_version_id(acl_kernel_if *kern) {
114
114
}
115
115
116
116
// Loads auto-discovery config string. Returns 0 if was successful.
117
- static int get_auto_discovery_string (acl_kernel_if *kern, char *config_str) {
118
- unsigned int version, rom_address;
119
- char description_size_msb[KERNEL_ROM_SIZE_BYTES_READ + 1 ];
120
- char description_size_lsb[KERNEL_ROM_SIZE_BYTES_READ + 1 ];
121
- unsigned int size_location;
122
- unsigned int size, rom_size;
117
+ static int get_auto_discovery_string (acl_kernel_if *kern, char *config_str, size_t config_str_len) {
118
+ unsigned int version, rom_address, rom_size;
123
119
size_t r;
124
120
int result;
125
121
acl_assert_locked ();
@@ -129,39 +125,25 @@ static int get_auto_discovery_string(acl_kernel_if *kern, char *config_str) {
129
125
version = 0 ;
130
126
acl_kernel_if_read_32b (kern, OFFSET_KERNEL_VERSION_ID, &version);
131
127
if (version == KERNEL_ROM_VERSION_ID) {
132
- // Read autodiscovery size
133
- size_location = OFFSET_KERNEL_ROM_LOCATION_MSB;
134
- acl_kernel_rom_cra_read_32b (kern, size_location,
135
- (unsigned int *)description_size_msb);
136
- description_size_msb[KERNEL_ROM_SIZE_BYTES_READ] = ' \0 ' ;
137
- size = (unsigned int )strtol (description_size_msb, NULL , 16 );
138
- size = size << 16 ;
139
-
140
- size_location = OFFSET_KERNEL_ROM_LOCATION_LSB;
141
- acl_kernel_rom_cra_read_32b (kern, size_location,
142
- (unsigned int *)description_size_lsb);
143
- description_size_lsb[KERNEL_ROM_SIZE_BYTES_READ] = ' \0 ' ;
144
- size += (unsigned int )strtol (description_size_lsb, NULL , 16 );
145
-
146
128
// Find beginning address of ROM
147
- rom_size = 1 << ((unsigned )log2 (size + KERNEL_ROM_SIZE_BYTES) + 1 );
129
+ rom_size = 1 << ((unsigned )log2 (( double )config_str_len + KERNEL_ROM_SIZE_BYTES) + 1 );
148
130
rom_address = OFFSET_KERNEL_MAX_ADDRESS - rom_size + 1 ;
149
131
config_str[0 ] = ' \0 ' ;
150
132
result = acl_kernel_rom_cra_read_block (kern, rom_address, config_str,
151
- (size_t )size );
133
+ (size_t )config_str_len );
152
134
153
135
if (result < 0 )
154
136
return -1 ;
155
137
// Pad autodiscovery with NULL
156
- *(config_str + (unsigned int )size ) = ' \0 ' ;
138
+ *(config_str + (unsigned int )config_str_len ) = ' \0 ' ;
157
139
// Read is verified above
158
140
// Set rom_size and r equal to support old flow and big-endian shuffle
159
- rom_size = size ;
141
+ rom_size = ( unsigned int )config_str_len ;
160
142
r = rom_size;
161
143
} else if (version == KERNEL_VERSION_ID) {
162
- rom_size = CONFIGURATION_ROM_BYTES ;
144
+ rom_size = ( unsigned int )config_str_len ;
163
145
r = kern->io .read (&kern->io , (dev_addr_t )OFFSET_CONFIGURATION_ROM,
164
- config_str, ( size_t )CONFIGURATION_ROM_BYTES );
146
+ config_str, config_str_len );
165
147
} else {
166
148
kern->io .printf (" HAL Kern: Version ID incorrect\n " );
167
149
return -1 ;
@@ -690,16 +672,16 @@ int acl_kernel_if_init(acl_kernel_if *kern, acl_bsp_io bsp_io,
690
672
description_size_msb, description_size_lsb,
691
673
size);
692
674
693
- config_str_len = size + 1 ;
675
+ config_str_len = size;
694
676
} else if (version == KERNEL_VERSION_ID) {
695
- config_str_len = CONFIGURATION_ROM_BYTES + 1 ;
677
+ config_str_len = CONFIGURATION_ROM_BYTES;
696
678
} else {
697
679
kern->io .printf (" HAL Kern: Version ID incorrect\n " );
698
680
return -1 ;
699
681
}
700
682
701
- std::vector<char > config_str (config_str_len);
702
- result |= get_auto_discovery_string (kern, config_str.data ());
683
+ std::vector<char > config_str (config_str_len+ 1 ); // +1 for null byte padding
684
+ result |= get_auto_discovery_string (kern, config_str.data (), config_str_len );
703
685
std::string config_string{config_str.data ()};
704
686
705
687
if (result != 0 ) {
0 commit comments