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}