1 /* 2 * Payload initialisation functions. 3 * 4 * Copyright (C) 2018 Paul Boddie <paul@boddie.org.uk> 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 #include <stdint.h> 21 22 23 24 extern uint8_t _data_original, _data, _bss; 25 26 /* These are defined using SIZEOF and their table entries contain actual values. 27 The "address" provided by each entry is therefore the value! */ 28 29 extern uint32_t _data_size, _bss_size; 30 31 /* Relocate the .data section's contents to initialise mutable structures. */ 32 33 void relocate_data(void) 34 { 35 uint8_t *original = &_data_original, *current = &_data, 36 *limit = original + (uint32_t) &_data_size; 37 38 /* Copy data from program memory to the relocated data area in RAM. */ 39 40 while (original < limit) 41 *current++ = *original++; 42 } 43 44 /* Clear the .bss section. */ 45 46 void init_bss(void) 47 { 48 uint8_t *current = &_bss, *limit = current + (uint32_t) &_bss_size; 49 50 while (current < limit) 51 *current++ = 0; 52 }