bootinfo64.c (bca9c87b6104219af35ae5ea4a6af098a1631bca) | bootinfo64.c (5d1531d9d4e7d1b1b706ab23ac3f864416e87522) |
---|---|
1/*- 2 * Copyright (c) 1998 Michael Smith <msmith@freebsd.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 32 unchanged lines hidden (view full) --- 41#include "libi386.h" 42#include "btxv86.h" 43 44#ifdef LOADER_GELI_SUPPORT 45#include "geliboot.h" 46#endif 47 48/* | 1/*- 2 * Copyright (c) 1998 Michael Smith <msmith@freebsd.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 32 unchanged lines hidden (view full) --- 41#include "libi386.h" 42#include "btxv86.h" 43 44#ifdef LOADER_GELI_SUPPORT 45#include "geliboot.h" 46#endif 47 48/* |
49 * We have 8 byte alignment for 64-bit targets. This code is compiled as 64-bit 50 * code... 51 */ 52#define MOD_ALIGN(l) roundup(l, sizeof(uint64_t)) 53 54static vm_offset_t 55bi_copymodules64(vm_offset_t addr) 56{ 57 struct preloaded_file *fp; 58 struct file_metadata *md; 59 int c; 60 uint64_t v; 61 62 c = addr != 0; 63 /* start with the first module on the list, should be the kernel */ 64 for (fp = file_findfile(NULL, NULL); fp != NULL; fp = fp->f_next) { 65 66 MOD_NAME(addr, fp->f_name, c); /* this field must come first */ 67 MOD_TYPE(addr, fp->f_type, c); 68 if (fp->f_args) 69 MOD_ARGS(addr, fp->f_args, c); 70 v = fp->f_addr; 71 MOD_ADDR(addr, v, c); 72 v = fp->f_size; 73 MOD_SIZE(addr, v, c); 74 for (md = fp->f_metadata; md != NULL; md = md->md_next) 75 if (!(md->md_type & MODINFOMD_NOCOPY)) 76 MOD_METADATA(addr, md, c); 77 } 78 MOD_END(addr, c); 79 return(addr); 80} 81 82/* | |
83 * Check to see if this CPU supports long mode. 84 */ 85static int 86bi_checkcpu(void) 87{ 88 char *cpu_vendor; 89 int vendor[3]; 90 int eflags; --- 101 unchanged lines hidden (view full) --- 192 file_addmetadata(kfp, MODINFOMD_MODULEP, sizeof module, &module); 193 if (add_smap != 0) 194 bios_addsmapdata(kfp); 195#ifdef LOADER_GELI_SUPPORT 196 geli_export_key_metadata(kfp); 197#endif 198 bi_load_vbe_data(kfp); 199 | 49 * Check to see if this CPU supports long mode. 50 */ 51static int 52bi_checkcpu(void) 53{ 54 char *cpu_vendor; 55 int vendor[3]; 56 int eflags; --- 101 unchanged lines hidden (view full) --- 158 file_addmetadata(kfp, MODINFOMD_MODULEP, sizeof module, &module); 159 if (add_smap != 0) 160 bios_addsmapdata(kfp); 161#ifdef LOADER_GELI_SUPPORT 162 geli_export_key_metadata(kfp); 163#endif 164 bi_load_vbe_data(kfp); 165 |
200 size = bi_copymodules64(0); | 166 size = md_copymodules(0, true); |
201 202 /* copy our environment */ 203 envp = roundup(addr + size, PAGE_SIZE); 204 addr = bi_copyenv(envp); 205 206 /* set kernend */ 207 kernend = roundup(addr, PAGE_SIZE); 208 *kernendp = kernend; 209 210 /* patch MODINFOMD_KERNEND */ 211 md = file_findmetadata(kfp, MODINFOMD_KERNEND); 212 bcopy(&kernend, md->md_data, sizeof kernend); 213 214 /* patch MODINFOMD_ENVP */ 215 md = file_findmetadata(kfp, MODINFOMD_ENVP); 216 bcopy(&envp, md->md_data, sizeof envp); 217 218 /* copy module list and metadata */ | 167 168 /* copy our environment */ 169 envp = roundup(addr + size, PAGE_SIZE); 170 addr = bi_copyenv(envp); 171 172 /* set kernend */ 173 kernend = roundup(addr, PAGE_SIZE); 174 *kernendp = kernend; 175 176 /* patch MODINFOMD_KERNEND */ 177 md = file_findmetadata(kfp, MODINFOMD_KERNEND); 178 bcopy(&kernend, md->md_data, sizeof kernend); 179 180 /* patch MODINFOMD_ENVP */ 181 md = file_findmetadata(kfp, MODINFOMD_ENVP); 182 bcopy(&envp, md->md_data, sizeof envp); 183 184 /* copy module list and metadata */ |
219 (void)bi_copymodules64(*modulep); | 185 (void)md_copymodules(*modulep, true); |
220 221 return(0); 222} | 186 187 return(0); 188} |