Skip to content

Commit e5d7d2d

Browse files
binbinwu1lijinxia
authored andcommitted
dm: start vsbl from reset vector
vsbl layout has been changed. Previously, vsbl start from 64bit mode. This patch changes the vsbl load code according to the layout change of vSBL. The new vsbl binary added reset vector support. It will start from reset vector in real mode. Signed-off-by: Binbin Wu <binbin.wu@intel.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Acked-by: Xu, Anthony <anthony.xu@intel.com>
1 parent 417cff5 commit e5d7d2d

File tree

1 file changed

+27
-10
lines changed

1 file changed

+27
-10
lines changed

devicemodel/core/sw_load_vsbl.c

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,31 @@
6363
* +--------------------------------------------------+
6464
*/
6565

66+
/* vsbl binary layout:
67+
*
68+
* +--------------------------------------------------+ <--vSBL Top
69+
* | |offset: Top - 0x10 (reset vector) |
70+
* + STAGEINIT |------------------------------------+
71+
* | (0x10000) |other |
72+
* +--------------------------------------------------+
73+
* | |
74+
* + PAYLOAD +
75+
* |(0x100000) |
76+
* +--------------------------------------------------+
77+
* | |
78+
* + vFastboot +
79+
* |(0x200000) |
80+
* +--------------------------------------------------+
81+
*/
82+
6683
/* Check default e820 table in sw_load_common.c for info about ctx->lowmem */
6784
#define CONFIGPAGE_OFF(ctx) ((ctx)->lowmem - 4*KB)
6885
#define VSBL_ENTRY_OFF(ctx) ((ctx)->lowmem - 6*KB)
6986
#define BOOTARGS_OFF(ctx) ((ctx)->lowmem - 8*KB)
7087
#define E820_TABLE_OFF(ctx) ((ctx)->lowmem - 12*KB)
7188
#define GUEST_PART_INFO_OFF(ctx) ((ctx)->lowmem - 16*KB)
72-
/* vsbl real entry is saved in the first 4 bytes of vsbl image */
73-
#define VSBL_OFF(ctx) (16*MB)
89+
/* vsbl real entry is reset vector, which is (VSBL_TOP - 16) */
90+
#define VSBL_TOP(ctx) (64*MB)
7491

7592
struct vsbl_para {
7693
uint64_t e820_table_address;
@@ -149,7 +166,7 @@ acrn_prepare_guest_part_info(struct vmctx *ctx)
149166
guest_part_info_size = len;
150167

151168
fseek(fp, 0, SEEK_SET);
152-
read = fread(ctx->baseaddr + GUEST_PART_INFO_OFF(ctx),
169+
read = fread(ctx->baseaddr + GUEST_PART_INFO_OFF(ctx),
153170
sizeof(char), len, fp);
154171
if (read < len) {
155172
fprintf(stderr,
@@ -199,7 +216,7 @@ acrn_prepare_vsbl(struct vmctx *ctx)
199216

200217
fseek(fp, 0, SEEK_END);
201218
len = ftell(fp);
202-
if ((len + VSBL_OFF(ctx)) > GUEST_PART_INFO_OFF(ctx)) {
219+
if (len > (8*MB)) {
203220
fprintf(stderr,
204221
"SW_LOAD ERR: too large vsbl file\n");
205222
fclose(fp);
@@ -209,7 +226,7 @@ acrn_prepare_vsbl(struct vmctx *ctx)
209226
vsbl_size = len;
210227

211228
fseek(fp, 0, SEEK_SET);
212-
read = fread(ctx->baseaddr + VSBL_OFF(ctx),
229+
read = fread(ctx->baseaddr + VSBL_TOP(ctx) - vsbl_size,
213230
sizeof(char), len, fp);
214231
if (read < len) {
215232
fprintf(stderr,
@@ -219,7 +236,7 @@ acrn_prepare_vsbl(struct vmctx *ctx)
219236
}
220237
fclose(fp);
221238
printf("SW_LOAD: partition blob %s size %d copy to guest 0x%lx\n",
222-
vsbl_path, vsbl_size, VSBL_OFF(ctx));
239+
vsbl_path, vsbl_size, VSBL_TOP(ctx) - vsbl_size);
223240

224241
return 0;
225242
}
@@ -230,8 +247,6 @@ acrn_sw_load_vsbl(struct vmctx *ctx)
230247
int ret;
231248
struct e820_entry *e820;
232249
struct vsbl_para *vsbl_para;
233-
uint64_t vsbl_start_addr =
234-
(uint64_t)ctx->baseaddr + VSBL_OFF(ctx);
235250
uint64_t *vsbl_entry =
236251
(uint64_t *)(ctx->baseaddr + VSBL_ENTRY_OFF(ctx));
237252
uint64_t *cfg_offset =
@@ -275,13 +290,15 @@ acrn_sw_load_vsbl(struct vmctx *ctx)
275290
if (ret)
276291
return ret;
277292

278-
vsbl_para->vsbl_address = VSBL_OFF(ctx);
293+
vsbl_para->vsbl_address = VSBL_TOP(ctx) - vsbl_size;
279294
vsbl_para->vsbl_size = vsbl_size;
280295

281296
vsbl_para->e820_entries = add_e820_entry(e820, vsbl_para->e820_entries,
282297
vsbl_para->vsbl_address, vsbl_size, E820_TYPE_RESERVED);
283298

284-
*vsbl_entry = *((uint32_t *) vsbl_start_addr);
299+
300+
*vsbl_entry = VSBL_TOP(ctx) - 16; /* reset vector */
301+
printf("SW_LOAD: vsbl_entry 0x%lx\n", *vsbl_entry);
285302

286303
vsbl_para->boot_device_address = boot_blk_bdf;
287304
vsbl_para->trusty_enabled = trusty_enabled;

0 commit comments

Comments
 (0)