代码拉取完成,页面将自动刷新
同步操作将从 YingyiTech/plat-raspi 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* Authors: Santiago Pagani <santiagopagani@gmail.com>
*
* Copyright (c) 2020, NEC Laboratories Europe GmbH, NEC Corporation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
*/
#include <uk/plat/common/bootinfo.h>
#include <arm/cpu.h>
#if CONFIG_RASPI_LCD
#include <raspi/lfb.h>
#endif
#if CONFIG_RASPI_TOUCHSCREEN
#include <raspi/touchscreen.h>
#endif
#include <raspi/console.h>
#include <raspi/time.h>
#include <raspi/irq.h>
smccc_conduit_fn_t smccc_psci_call;
static uint64_t assembly_entry;
static uint64_t hardware_init_done;
uint64_t _libraspiplat_get_reset_time(void)
{
return assembly_entry;
}
uint64_t _libraspiplat_get_hardware_init_time(void)
{
return hardware_init_done;
}
static char *cmdline;
static __sz cmdline_len;
static inline int cmdline_init(struct ukplat_bootinfo *bi)
{
char *cmdl;
if (bi->cmdline_len) {
cmdl = (char *)bi->cmdline;
cmdline_len = bi->cmdline_len;
} else {
cmdl = CONFIG_UK_NAME;
cmdline_len = sizeof(CONFIG_UK_NAME) - 1;
}
/* TODO: Only extract what we need before passing to application. */
/* This is not the original command-line, but one that will be thrashed
* by `ukplat_entry_argp` to obtain argc/argv. So mark it as a kernel
* resource instead.
*/
cmdline = ukplat_memregion_alloc(cmdline_len + 1, UKPLAT_MEMRT_KERNEL,
UKPLAT_MEMRF_READ |
UKPLAT_MEMRF_WRITE |
UKPLAT_MEMRF_MAP);
if (unlikely(!cmdline))
return -ENOMEM;
memcpy(cmdline, cmdl, cmdline_len);
cmdline[cmdline_len] = 0;
return 0;
}
static void __noreturn _ukplat_entry2(void)
{
ukplat_entry_argp(NULL, cmdline, cmdline_len);
ukplat_lcpu_halt();
}
/* Ported from plat/common/arm/lcpu.c to avoid dependency on unsupported
* librarys.
* TODO: Remove this when use unified interrupt controller and timer.
*/
void __noreturn lcpu_arch_jump_to(void *sp, ukplat_lcpu_entry_t entry)
{
__asm__ __volatile__ (
"mov sp, %0\n" /* set the sp */
"br %1\n" /* branch to the entry function */
:
: "r"(sp), "r"(entry)
: /* sp not needed */);
/* just make the compiler happy about returning function */
__builtin_unreachable();
}
void _libraspiplat_entry(uint64_t low0, uint64_t hi0, uint64_t low1,
uint64_t hi1, void *fdtp)
{
int rc;
void *bstack;
struct ukplat_bootinfo *bi;
if (hi0 == hi1) {
assembly_entry = ((hi0 << 32)&0xFFFFFFFF00000000) | (low0&0xFFFFFFFF);
} else {
assembly_entry = ((hi1 << 32)&0xFFFFFFFF00000000) | (low1&0xFFFFFFFF);
}
/* TODO: Initial console with dtb */
_libraspiplat_init_console();
ukplat_bootinfo_fdt_setup(fdtp);
bi = ukplat_bootinfo_get();
if (unlikely(!bi))
UK_CRASH("Invalid bootinfo");
uk_pr_debug("Device tree location @%p\n", bi);
rc = cmdline_init(bi);
if (unlikely(rc < 0))
UK_CRASH("Failed to initialize command-line\n");
/* Allocate boot stack */
bstack = ukplat_memregion_alloc(__STACK_SIZE, UKPLAT_MEMRT_STACK,
UKPLAT_MEMRF_READ |
UKPLAT_MEMRF_WRITE |
UKPLAT_MEMRF_MAP);
if (unlikely(!bstack))
UK_CRASH("Boot stack alloc failed\n");
bstack = (void *)((__uptr)bstack + __STACK_SIZE);
/* Initialize paging */
rc = ukplat_mem_init();
if (unlikely(rc))
UK_CRASH("Could not initialize paging (%d)\n", rc);
#if defined(CONFIG_ENFORCE_W_XOR_X) && defined(CONFIG_PAGING)
enforce_w_xor_x();
#endif /* CONFIG_ENFORCE_W_XOR_X && CONFIG_PAGING */
#if CONFIG_RASPI_LCD
lfb_init();
#endif
#if CONFIG_RASPI_TOUCHSCREEN
touchscreen_init();
#endif
hardware_init_done = get_system_timer();
/* TODO: Use unified interrupt controller instead of raspi specific one
*/
ukplat_irq_init();
/* TODO: Initialize interrupt controller */
/* Initialize logical boot CPU */
rc = lcpu_init(lcpu_get_bsp());
if (unlikely(rc))
UK_CRASH("Failed to initialize bootstrapping CPU: %d\n", rc);
/*
* Switch away from the bootstrap stack as early as possible.
*/
uk_pr_info("Switch from bootstrap stack to stack @%p\n", bstack);
/* Print boot information */
uk_pr_info("Print bootinfo before jump to entry:\n");
ukplat_bootinfo_print();
/*
* Enter Unikraft with new allocated stack.
*/
lcpu_arch_jump_to(bstack, _ukplat_entry2);
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。