86 lines
1.9 KiB
C
86 lines
1.9 KiB
C
/*
|
|
* Copyright (c) 2018 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#ifndef _SHARED_PAGE_H
|
|
#define _SHARED_PAGE_H
|
|
|
|
/* Defines a simple interface for sharing a single page of data across
|
|
* CPU modes and SMP cores where it can be easily found and relied
|
|
* upon.
|
|
*/
|
|
|
|
#include "xuk-config.h"
|
|
#include "x86_64-hw.h"
|
|
|
|
/* The shared block lives in the 5th page of memory, immediately after
|
|
* the 16k null guard region
|
|
*/
|
|
#define SHARED_ADDR 0x4000
|
|
|
|
/* Magic cookies passed to stub32 to tell it what's going on */
|
|
#define BOOT_MAGIC_MULTIBOOT 0x2badb002 /* initial handoff from bootloader */
|
|
#define BOOT_MAGIC_STUB16 0xaaf08df7 /* AP cpu initialization */
|
|
|
|
struct xuk_shared_mem {
|
|
/* Stack to be used by SMP cpus at startup. MUST BE FIRST. */
|
|
unsigned int smpinit_stack;
|
|
|
|
/* Spinlock used to serialize SMP initialization */
|
|
int smpinit_lock;
|
|
|
|
/* Byte address of next page to allocate */
|
|
unsigned int next_page;
|
|
|
|
/* Top-level page table address */
|
|
unsigned int base_cr3;
|
|
|
|
/* 64 bit GDT */
|
|
struct gdt64 gdt[3 + (2 * CONFIG_MP_NUM_CPUS)];
|
|
|
|
/* 64 bit IDT */
|
|
unsigned int idt_addr;
|
|
|
|
/* Precomputed GDT for the 16 bit stub */
|
|
unsigned int gdt16_addr;
|
|
|
|
/* Each pointer in these arrays is the base of the FS/GS
|
|
* segment for the indexed CPU.
|
|
*/
|
|
long long fs_ptrs[CONFIG_MP_NUM_CPUS];
|
|
long long gs_ptrs[CONFIG_MP_NUM_CPUS];
|
|
|
|
int num_active_cpus;
|
|
|
|
/* Current output column in the VGA console */
|
|
int vgacol;
|
|
};
|
|
|
|
#define _shared (*((volatile struct xuk_shared_mem *)(long)SHARED_ADDR))
|
|
|
|
static inline void shared_init(void)
|
|
{
|
|
for (int i = 0; i < sizeof(_shared)/sizeof(int); i++) {
|
|
((int *)&_shared)[i] = 0;
|
|
}
|
|
|
|
_shared.next_page = 0x5000;
|
|
_shared.vgacol = 80;
|
|
}
|
|
|
|
static inline void *alloc_page(int clear)
|
|
{
|
|
int *p = (int *)(long)_shared.next_page;
|
|
|
|
_shared.next_page += 4096U;
|
|
|
|
for (int i = 0; clear && i < 1024; i++) {
|
|
p[i] = 0;
|
|
}
|
|
|
|
return p;
|
|
}
|
|
|
|
#endif /* _SHARED_PAGE_H */
|