⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 context.c

📁 open source bios with linux platform, very good and can be reused.
💻 C
字号:
/* * context switching * 2003-10 by SONE Takeshi */#include "openbios/config.h"#include "openbios/kernel.h"#include "context.h"#define MAIN_STACK_SIZE 16384#define IMAGE_STACK_SIZE 4096#define debug printkstatic void start_main(void); /* forward decl. */void __exit_context(void); /* assembly routine *//* * Main context structure  * It is placed at the bottom of our stack, and loaded by assembly routine * to start us up. */const struct context main_ctx = {    .regs[REG_SP] = (uint64_t) &_estack - 2047 - 96,    .pc = (uint64_t) start_main,    .npc = (uint64_t) start_main + 4,    .return_addr = (uint64_t) __exit_context,};/* This is used by assembly routine to load/store the context which * it is to switch/switched.  */struct context *__context = &main_ctx;/* Stack for loaded ELF image */static uint8_t image_stack[IMAGE_STACK_SIZE];/* Pointer to startup context (physical address) */unsigned long __boot_ctx;/* * Main starter * This is the C function that runs first. */static void start_main(void){    int retval;    extern int openbios(void);    /* Save startup context, so we can refer to it later.     * We have to keep it in physical address since we will relocate. */    __boot_ctx = virt_to_phys(__context);    /* Start the real fun */    retval = openbios();    /* Pass return value to startup context. Bootloader may see it. */    //boot_ctx->eax = retval;    /* Returning from here should jump to __exit_context */    __context = boot_ctx;}/* Setup a new context using the given stack. */struct context *init_context(uint8_t *stack, uint64_t stack_size, int num_params){    struct context *ctx;    ctx = (struct context *)	(stack + stack_size - (sizeof(*ctx) + num_params*sizeof(uint32_t)));    memset(ctx, 0, sizeof(*ctx));    /* Fill in reasonable default for flat memory model */    ctx->regs[REG_SP] = virt_to_phys(SP_LOC(ctx));    ctx->return_addr = virt_to_phys(__exit_context);    return ctx;}/* Switch to another context. */struct context *switch_to(struct context *ctx){    struct context *save, *ret;    debug("switching to new context:\n");    save = __context;    __context = ctx;    //asm ("pushl %cs; call __switch_context");    ret = __context;    __context = save;    return ret;}/* Start ELF Boot image */uint64_t start_elf(uint64_t entry_point, uint64_t param){    struct context *ctx;    ctx = init_context(image_stack, sizeof image_stack, 1);    ctx->pc = entry_point;    ctx->param[0] = param;    //ctx->eax = 0xe1fb007;    //ctx->ebx = param;    ctx = switch_to(ctx);    //return ctx->eax;    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -