2 * This file is part of the coreboot project.
4 * Copyright 2015 Google Inc.
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; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
16 #include <arch/early_variables.h>
18 #include <stage_cache.h>
21 /* Stage cache uses cbmem. */
22 void stage_cache_add(int stage_id
, const struct prog
*stage
)
24 struct stage_cache
*meta
;
27 meta
= cbmem_add(CBMEM_ID_STAGEx_META
+ stage_id
, sizeof(*meta
));
30 meta
->load_addr
= (uintptr_t)prog_start(stage
);
31 meta
->entry_addr
= (uintptr_t)prog_entry(stage
);
32 meta
->arg
= (uintptr_t)prog_entry_arg(stage
);
34 c
= cbmem_add(CBMEM_ID_STAGEx_CACHE
+ stage_id
, prog_size(stage
));
38 memcpy(c
, prog_start(stage
), prog_size(stage
));
41 void stage_cache_load_stage(int stage_id
, struct prog
*stage
)
43 struct stage_cache
*meta
;
44 const struct cbmem_entry
*e
;
49 prog_set_entry(stage
, NULL
, NULL
);
51 meta
= cbmem_find(CBMEM_ID_STAGEx_META
+ stage_id
);
55 e
= cbmem_entry_find(CBMEM_ID_STAGEx_CACHE
+ stage_id
);
60 c
= cbmem_entry_start(e
);
61 size
= cbmem_entry_size(e
);
62 load_addr
= (void *)(uintptr_t)meta
->load_addr
;
64 memcpy(load_addr
, c
, size
);
66 prog_set_area(stage
, load_addr
, size
);
67 prog_set_entry(stage
, (void *)(uintptr_t)meta
->entry_addr
,
68 (void *)(uintptr_t)meta
->arg
);