154 lines
3 KiB
C
154 lines
3 KiB
C
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
/*
|
|
* Copyright 2018-2019 IBM Corp.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <malloc.h>
|
|
#include <stdint.h>
|
|
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
#include <fcntl.h>
|
|
#include <assert.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <stdint.h>
|
|
|
|
|
|
#include <interrupts.h>
|
|
#include <bitutils.h>
|
|
|
|
#include <compiler.h>
|
|
|
|
/*
|
|
* Skiboot malloc stubs
|
|
*
|
|
* The actual prototypes for these are defined in mem_region-malloc.h,
|
|
* but that file also #defines malloc, and friends so we don't pull that in
|
|
* directly.
|
|
*/
|
|
|
|
#define DEFAULT_ALIGN __alignof__(long)
|
|
|
|
void *__memalign(size_t blocksize, size_t bytes, const char *location __unused);
|
|
void *__memalign(size_t blocksize, size_t bytes, const char *location __unused)
|
|
{
|
|
return memalign(blocksize, bytes);
|
|
}
|
|
|
|
void *__malloc(size_t bytes, const char *location);
|
|
void *__malloc(size_t bytes, const char *location)
|
|
{
|
|
return __memalign(DEFAULT_ALIGN, bytes, location);
|
|
}
|
|
|
|
void __free(void *p, const char *location __unused);
|
|
void __free(void *p, const char *location __unused)
|
|
{
|
|
free(p);
|
|
}
|
|
|
|
void *__realloc(void *ptr, size_t size, const char *location __unused);
|
|
void *__realloc(void *ptr, size_t size, const char *location __unused)
|
|
{
|
|
return realloc(ptr, size);
|
|
}
|
|
|
|
void *__zalloc(size_t bytes, const char *location);
|
|
void *__zalloc(size_t bytes, const char *location)
|
|
{
|
|
void *p = __malloc(bytes, location);
|
|
|
|
if (p)
|
|
memset(p, 0, bytes);
|
|
return p;
|
|
}
|
|
|
|
#include <mem_region-malloc.h>
|
|
|
|
#include <opal-api.h>
|
|
|
|
#include "../../libfdt/fdt.c"
|
|
#include "../../libfdt/fdt_ro.c"
|
|
#include "../../libfdt/fdt_sw.c"
|
|
#include "../../libfdt/fdt_strerror.c"
|
|
|
|
#include "../../core/device.c"
|
|
|
|
#include "../../libstb/container-utils.h"
|
|
#include "../../libstb/container.h"
|
|
#include "../../libstb/container.c"
|
|
|
|
#include "../flash-firmware-versions.c"
|
|
#include <assert.h>
|
|
|
|
char __rodata_start[1], __rodata_end[1];
|
|
|
|
const char version[]="Hello world!";
|
|
|
|
enum proc_gen proc_gen = proc_gen_p8;
|
|
|
|
static char *loaded_version_buf;
|
|
static size_t loaded_version_buf_size;
|
|
|
|
#define min(x,y) ((x) < (y) ? x : y)
|
|
|
|
int start_preload_resource(enum resource_id id, uint32_t subid,
|
|
void *buf, size_t *len)
|
|
{
|
|
(void)id;
|
|
(void)subid;
|
|
(void)buf;
|
|
if (loaded_version_buf) {
|
|
*len = min(*len, loaded_version_buf_size);
|
|
memcpy(buf, loaded_version_buf, *len);
|
|
} else {
|
|
*len = 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int wait_for_resource_loaded(enum resource_id id, uint32_t idx)
|
|
{
|
|
(void)id;
|
|
(void)idx;
|
|
return 0;
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
int fd;
|
|
struct stat ver_st;
|
|
int r;
|
|
|
|
dt_root = dt_new_root("");
|
|
|
|
if (argc > 1) {
|
|
fd = open(argv[1], O_RDONLY);
|
|
|
|
assert(fd > 0);
|
|
r = fstat(fd, &ver_st);
|
|
assert(r == 0);
|
|
|
|
loaded_version_buf = mmap(NULL, ver_st.st_size,
|
|
PROT_READ, MAP_PRIVATE, fd, 0);
|
|
assert(loaded_version_buf != (char*)-1);
|
|
loaded_version_buf_size = ver_st.st_size;
|
|
}
|
|
|
|
flash_fw_version_preload();
|
|
|
|
proc_gen = proc_gen_p9;
|
|
flash_fw_version_preload();
|
|
flash_dt_add_fw_version();
|
|
|
|
return 0;
|
|
}
|
|
|