| /* |
| * 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 */ |