return slots_fetch_random();
}
-unsigned char *choose_random_location(unsigned char *input,
+unsigned char *choose_random_location(unsigned char *input_ptr,
unsigned long input_size,
- unsigned char *output,
+ unsigned char *output_ptr,
unsigned long output_size)
{
- unsigned long choice = (unsigned long)output;
+ /*
+ * The caller of choose_random_location() uses unsigned char * for
+ * buffer pointers since it performs decompression, elf parsing, etc.
+ * Since this code examines addresses much more numerically,
+ * unsigned long is used internally here. Instead of sprinkling
+ * more casts into extract_kernel, do them here and at return.
+ */
+ unsigned long input = (unsigned long)input_ptr;
+ unsigned long output = (unsigned long)output_ptr;
+ unsigned long choice = output;
unsigned long random_addr;
#ifdef CONFIG_HIBERNATION
boot_params->hdr.loadflags |= KASLR_FLAG;
/* Record the various known unsafe memory ranges. */
- mem_avoid_init((unsigned long)input, input_size,
- (unsigned long)output, output_size);
+ mem_avoid_init(input, input_size, output, output_size);
/* Walk e820 and find a random address. */
- random_addr = find_random_addr(choice, output_size);
+ random_addr = find_random_addr(output, output_size);
if (!random_addr) {
warn("KASLR disabled: could not find suitable E820 region!");
goto out;
#if CONFIG_RANDOMIZE_BASE
/* kaslr.c */
-unsigned char *choose_random_location(unsigned char *input,
+unsigned char *choose_random_location(unsigned char *input_ptr,
unsigned long input_size,
- unsigned char *output,
+ unsigned char *output_ptr,
unsigned long output_size);
/* cpuflags.c */
bool has_cpuflag(int flag);
#else
static inline
-unsigned char *choose_random_location(unsigned char *input,
+unsigned char *choose_random_location(unsigned char *input_ptr,
unsigned long input_size,
- unsigned char *output,
+ unsigned char *output_ptr,
unsigned long output_size)
{
- return output;
+ return output_ptr;
}
#endif