From 03589d0573ffe8070c6bd592e0a09b8bb24ce25e Mon Sep 17 00:00:00 2001 From: hzc1998 <2323168280@qq.com> Date: Wed, 12 Oct 2022 02:06:01 +0800 Subject: [PATCH] feat: add ASM FUNC and ENDFUNC --- src/arch/riscv64/kernel/context.S | 9 +- src/arch/riscv64/kernel/interrupt.S | 18 +- src/arch/riscv64/kernel/process.S | 21 +- src/arch/riscv64/kernel/sbi_entry.S | 8 +- src/arch/riscv64/utils/memory.S | 16 +- src/arch/x86/include/multiboot2.h | 427 ++++++++++++++++++++++++++++ src/arch/x86/kernel/context.S | 11 +- src/arch/x86/kernel/i386.S | 9 +- src/arch/x86/kernel/interrupt.S | 15 +- src/arch/x86/kernel/multiboot2.S | 93 ++++++ src/arch/x86/kernel/process.S | 27 +- src/include/base/defines.h | 28 ++ src/platform/i386 | 2 +- 13 files changed, 623 insertions(+), 61 deletions(-) create mode 100644 src/arch/x86/include/multiboot2.h create mode 100644 src/arch/x86/kernel/multiboot2.S diff --git a/src/arch/riscv64/kernel/context.S b/src/arch/riscv64/kernel/context.S index 8912810..64d49a9 100644 --- a/src/arch/riscv64/kernel/context.S +++ b/src/arch/riscv64/kernel/context.S @@ -14,22 +14,22 @@ #define __ASSEMBLY__ #include #include +#include /** * void NX_HalContextSwitchNext(NX_Addr nextSP); */ -.globl NX_HalContextSwitchNext -NX_HalContextSwitchNext: +NX_FUNC(NX_HalContextSwitchNext) LOAD sp, (a0) /* sp = *nextSP */ RESTORE_CONTEXT sret +NX_ENDFUNC(NX_HalContextSwitchNext) /** * void NX_HalContextSwitchPrevNext(NX_Addr prevSP, NX_Addr nextSP); */ -.globl NX_HalContextSwitchPrevNext -NX_HalContextSwitchPrevNext: +NX_FUNC(NX_HalContextSwitchPrevNext) mv t0, sp /** @@ -65,3 +65,4 @@ NX_HalContextSwitchPrevNext: /* supervisor return, `pc` = `sepc` */ sret +NX_ENDFUNC(NX_HalContextSwitchPrevNext) diff --git a/src/arch/riscv64/kernel/interrupt.S b/src/arch/riscv64/kernel/interrupt.S index 9abbbbd..ff96ee8 100644 --- a/src/arch/riscv64/kernel/interrupt.S +++ b/src/arch/riscv64/kernel/interrupt.S @@ -12,6 +12,7 @@ #define __ASSEMBLY__ #include #include +#include .text @@ -32,7 +33,7 @@ .globl gTrapEntry4 .align 2 # TrapEntry must aligin with 4 byte -gTrapEntry0: +NX_FUNC(gTrapEntry0) /* save sp to sscratch reg, sscratch saved old sp from user/kernel */ csrrw sp, sscratch, sp /* switch to cpu stack as temp stack */ @@ -40,30 +41,30 @@ gTrapEntry0: j TrapEntry .align 2 -gTrapEntry1: +NX_FUNC(gTrapEntry1) csrrw sp, sscratch, sp la sp, gStackTop1 j TrapEntry .align 2 -gTrapEntry2: +NX_FUNC(gTrapEntry2) csrrw sp, sscratch, sp la sp, gStackTop2 j TrapEntry .align 2 -gTrapEntry3: +NX_FUNC(gTrapEntry3) csrrw sp, sscratch, sp la sp, gStackTop3 j TrapEntry .align 2 -gTrapEntry4: +NX_FUNC(gTrapEntry4) csrrw sp, sscratch, sp la sp, gStackTop4 j TrapEntry -TrapEntry: +NX_FUNC(TrapEntry) /* save context to cpu stack */ SAVE_CONTEXT @@ -83,10 +84,9 @@ TrapEntry: tail TrapReturn -.globl TrapReturn -TrapReturn: - +NX_FUNC(TrapReturn) /* restore context will restore sp */ RESTORE_CONTEXT /* return from supervisor call */ sret +NX_ENDFUNC(TrapEntry) diff --git a/src/arch/riscv64/kernel/process.S b/src/arch/riscv64/kernel/process.S index 957d43a..ed1d453 100644 --- a/src/arch/riscv64/kernel/process.S +++ b/src/arch/riscv64/kernel/process.S @@ -11,13 +11,13 @@ #define __ASSEMBLY__ #include +#include /* * void NX_HalProcessEnterUserMode(args, text, userStack, returnAddr); */ .align 3 -.global NX_HalProcessEnterUserMode -NX_HalProcessEnterUserMode: +NX_FUNC(NX_HalProcessEnterUserMode) /* set as user mode, close interrupt */ li t0, SSTATUS_SPP | SSTATUS_SIE csrc sstatus, t0 @@ -30,24 +30,25 @@ NX_HalProcessEnterUserMode: mv sp, a2 /* set sp */ mv ra, a3 /* set return addr */ sret /* enter user mode */ +NX_ENDFUNC(NX_HalProcessEnterUserMode) .align 3 -.global NX_HalUserThreadReturnCodeBegin -NX_HalUserThreadReturnCodeBegin: +NX_FUNC(NX_HalUserThreadReturnCodeBegin) li a0, 0 // a0 = exit code li a7, 48 // a7 = 48, SysThreadExit ecall +NX_ENDFUNC(NX_HalUserThreadReturnCodeBegin) .align 3 -.global NX_HalUserThreadReturnCodeEnd -NX_HalUserThreadReturnCodeEnd: +NX_FUNC(NX_HalUserThreadReturnCodeEnd) +NX_ENDFUNC(NX_HalUserThreadReturnCodeEnd) .align 3 -.global NX_HalSignalReturnCodeBegin -NX_HalSignalReturnCodeBegin: +NX_FUNC(NX_HalSignalReturnCodeBegin) li a7, 0xF00000 // a7 = SysSignalReturn, hide for user ecall +NX_ENDFUNC(NX_HalSignalReturnCodeBegin) .align 3 -.global NX_HalSignalReturnCodeEnd -NX_HalSignalReturnCodeEnd: +NX_FUNC(NX_HalSignalReturnCodeEnd) +NX_ENDFUNC(NX_HalSignalReturnCodeEnd) diff --git a/src/arch/riscv64/kernel/sbi_entry.S b/src/arch/riscv64/kernel/sbi_entry.S index 299f592..02f48fc 100644 --- a/src/arch/riscv64/kernel/sbi_entry.S +++ b/src/arch/riscv64/kernel/sbi_entry.S @@ -10,6 +10,9 @@ * 2022-05-01 JasonHu support boot from u-boot */ +#define __ASSEMBLY__ +#include + .section .text.start .extern __NX_EarlyMain .extern __firstBootMagic @@ -21,9 +24,7 @@ .globl gStackTop3 .globl gStackTop4 - .global _Start -_Start: - +NX_FUNC(_Start) csrc sstatus, 0x2 /* disable interrupt */ /* set global pointer */ @@ -84,6 +85,7 @@ _EnterMain: loop: j loop +NX_ENDFUNC(_Start) /* set in data seciton, avoid clear bss to clean stack */ .section .data.stack diff --git a/src/arch/riscv64/utils/memory.S b/src/arch/riscv64/utils/memory.S index 944e2d9..38a7f76 100644 --- a/src/arch/riscv64/utils/memory.S +++ b/src/arch/riscv64/utils/memory.S @@ -13,10 +13,10 @@ #define __ASSEMBLY__ #include +#include /* void *NX_MemSet(void *dest, NX_U8 value, NX_Size sz) */ -.globl NX_MemSet -NX_MemSet: +NX_FUNC(NX_MemSet) /* Preserve return value */ move t0, a0 @@ -114,11 +114,10 @@ NX_MemSet: bltu t0, a3, 5b 6: ret -/* End of NX_MemSet */ +NX_ENDFUNC(NX_MemSet) /* void *NX_MemCopy(void *dest, const void *src, NX_Size sz) */ -.globl NX_MemCopy -NX_MemCopy: +NX_FUNC(NX_MemCopy) /* Preserve return value */ move t6, a0 @@ -216,11 +215,10 @@ NX_MemCopy: bltu a1, a3, 5b 6: ret -/* End of NX_MemCopy */ +NX_ENDFUNC(NX_MemCopy) /* void *NX_MemMove(void *dest, const void *src, NX_Size n) */ -.globl NX_MemMove -NX_MemMove: +NX_FUNC(NX_MemMove) /* * Returns * a0 - dest @@ -524,4 +522,4 @@ ByteCopyReverse: ReturnFromMemMove: ret -/* End of NX_MemMove */ +NX_ENDFUNC(NX_MemMove) diff --git a/src/arch/x86/include/multiboot2.h b/src/arch/x86/include/multiboot2.h new file mode 100644 index 0000000..3ba5b3c --- /dev/null +++ b/src/arch/x86/include/multiboot2.h @@ -0,0 +1,427 @@ +/** + * Copyright (c) 2018-2022, NXOS Development Team + * SPDX-License-Identifier: Apache-2.0 + * + * Contains: Multiboot2 header file + * + * Change Logs: + * Date Author Notes + * 2021-9-17 JasonHu Init + */ + +/* Copyright (C) 1999,2003,2007,2008,2009,2010 Free Software Foundation, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY + * DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR + * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __MULTIBOOT_HEADER__ +#define __MULTIBOOT_HEADER__ + +/* How many bytes from the start of the file we search for the header. */ +#define MULTIBOOT_SEARCH 32768 +#define MULTIBOOT_HEADER_ALIGN 8 + +/* The magic field should contain this. */ +#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6 + +/* This should be in %eax. */ +#define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289 + +/* Alignment of multiboot modules. */ +#define MULTIBOOT_MOD_ALIGN 0x00001000 + +/* Alignment of the multiboot info structure. */ +#define MULTIBOOT_INFO_ALIGN 0x00000008 + +/* Flags set in the ’flags’ member of the multiboot header. */ + +#define MULTIBOOT_TAG_ALIGN 8 +#define MULTIBOOT_TAG_TYPE_END 0 +#define MULTIBOOT_TAG_TYPE_CMDLINE 1 +#define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2 +#define MULTIBOOT_TAG_TYPE_MODULE 3 +#define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4 +#define MULTIBOOT_TAG_TYPE_BOOTDEV 5 +#define MULTIBOOT_TAG_TYPE_MMAP 6 +#define MULTIBOOT_TAG_TYPE_VBE 7 +#define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8 +#define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9 +#define MULTIBOOT_TAG_TYPE_APM 10 +#define MULTIBOOT_TAG_TYPE_EFI32 11 +#define MULTIBOOT_TAG_TYPE_EFI64 12 +#define MULTIBOOT_TAG_TYPE_SMBIOS 13 +#define MULTIBOOT_TAG_TYPE_ACPI_OLD 14 +#define MULTIBOOT_TAG_TYPE_ACPI_NEW 15 +#define MULTIBOOT_TAG_TYPE_NETWORK 16 +#define MULTIBOOT_TAG_TYPE_EFI_MMAP 17 +#define MULTIBOOT_TAG_TYPE_EFI_BS 18 +#define MULTIBOOT_TAG_TYPE_EFI32_IH 19 +#define MULTIBOOT_TAG_TYPE_EFI64_IH 20 +#define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21 + +#define MULTIBOOT_HEADER_TAG_END 0 +#define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1 +#define MULTIBOOT_HEADER_TAG_ADDRESS 2 +#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3 +#define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4 +#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5 +#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6 +#define MULTIBOOT_HEADER_TAG_EFI_BS 7 +#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 8 +#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9 +#define MULTIBOOT_HEADER_TAG_RELOCATABLE 10 + +#define MULTIBOOT_ARCHITECTURE_I386 0 +#define MULTIBOOT_ARCHITECTURE_MIPS32 4 +#define MULTIBOOT_HEADER_TAG_OPTIONAL 1 + +#define MULTIBOOT_LOAD_PREFERENCE_NONE 0 +#define MULTIBOOT_LOAD_PREFERENCE_LOW 1 +#define MULTIBOOT_LOAD_PREFERENCE_HIGH 2 + +#define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1 +#define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2 + +#ifndef __ASSEMBLY__ + +typedef unsigned char multiboot_uint8_t; +typedef unsigned short multiboot_uint16_t; +typedef unsigned int multiboot_uint32_t; +typedef unsigned long long multiboot_uint64_t; + +struct multiboot_header +{ + /* Must be MULTIBOOT_MAGIC - see above. */ + multiboot_uint32_t magic; + + /* ISA */ + multiboot_uint32_t architecture; + + /* Total header length. */ + multiboot_uint32_t header_length; + + /* The above fields plus this one must equal 0 mod 2^32. */ + multiboot_uint32_t checksum; +}; + +struct multiboot_header_tag +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; +}; + +struct multiboot_header_tag_information_request +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; + multiboot_uint32_t requests[0]; +}; + +struct multiboot_header_tag_address +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; + multiboot_uint32_t header_addr; + multiboot_uint32_t load_addr; + multiboot_uint32_t load_end_addr; + multiboot_uint32_t bss_end_addr; +}; + +struct multiboot_header_tag_entry_address +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; + multiboot_uint32_t entry_addr; +}; + +struct multiboot_header_tag_console_flags +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; + multiboot_uint32_t console_flags; +}; + +struct multiboot_header_tag_framebuffer +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; + multiboot_uint32_t width; + multiboot_uint32_t height; + multiboot_uint32_t depth; +}; + +struct multiboot_header_tag_module_align +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; +}; + +struct multiboot_header_tag_relocatable +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; + multiboot_uint32_t min_addr; + multiboot_uint32_t max_addr; + multiboot_uint32_t align; + multiboot_uint32_t preference; +}; + +struct multiboot_color +{ + multiboot_uint8_t red; + multiboot_uint8_t green; + multiboot_uint8_t blue; +}; + +struct multiboot_mmap_entry +{ + multiboot_uint64_t addr; + multiboot_uint64_t len; +#define MULTIBOOT_MEMORY_AVAILABLE 1 +#define MULTIBOOT_MEMORY_RESERVED 2 +#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3 +#define MULTIBOOT_MEMORY_NVS 4 +#define MULTIBOOT_MEMORY_BADRAM 5 + multiboot_uint32_t type; + multiboot_uint32_t zero; +}; +typedef struct multiboot_mmap_entry multiboot_memory_map_t; + +struct multiboot_tag +{ + multiboot_uint32_t type; + multiboot_uint32_t size; +}; + +struct multiboot_tag_string +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + char string[0]; +}; + +struct multiboot_tag_module +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t mod_start; + multiboot_uint32_t mod_end; + char cmdline[0]; +}; + +struct multiboot_tag_basic_meminfo +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t mem_lower; + multiboot_uint32_t mem_upper; +}; + +struct multiboot_tag_bootdev +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t biosdev; + multiboot_uint32_t slice; + multiboot_uint32_t part; +}; + +struct multiboot_tag_mmap +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t entry_Size; + multiboot_uint32_t entry_version; + struct multiboot_mmap_entry entries[0]; +}; + +struct multiboot_vbe_info_block +{ + multiboot_uint8_t external_specification[512]; +}; + +struct multiboot_vbe_mode_info_block +{ + multiboot_uint8_t external_specification[256]; +}; + +struct multiboot_tag_vbe +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + + multiboot_uint16_t vbe_mode; + multiboot_uint16_t vbe_interface_seg; + multiboot_uint16_t vbe_interface_off; + multiboot_uint16_t vbe_interface_len; + + struct multiboot_vbe_info_block vbe_control_info; + struct multiboot_vbe_mode_info_block vbe_mode_info; +}; + +struct multiboot_tag_framebuffer_common +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + + multiboot_uint64_t framebuffer_addr; + multiboot_uint32_t framebuffer_pitch; + multiboot_uint32_t framebuffer_width; + multiboot_uint32_t framebuffer_height; + multiboot_uint8_t framebuffer_bpp; +#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0 +#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1 +#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2 + multiboot_uint8_t framebuffer_type; + multiboot_uint16_t reserved; +}; + +struct multiboot_tag_framebuffer +{ + struct multiboot_tag_framebuffer_common common; + + union + { + struct + { + multiboot_uint16_t framebuffer_palette_num_colors; + struct multiboot_color framebuffer_palette[0]; + }; + struct + { + multiboot_uint8_t framebuffer_red_field_position; + multiboot_uint8_t framebuffer_red_mask_Size; + multiboot_uint8_t framebuffer_green_field_position; + multiboot_uint8_t framebuffer_green_mask_Size; + multiboot_uint8_t framebuffer_blue_field_position; + multiboot_uint8_t framebuffer_blue_mask_Size; + }; + }; +}; + +struct multiboot_tag_elf_sections +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t num; + multiboot_uint32_t entSize; + multiboot_uint32_t shndx; + char sections[0]; +}; + +struct multiboot_tag_apm +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint16_t version; + multiboot_uint16_t cseg; + multiboot_uint32_t offset; + multiboot_uint16_t cseg_16; + multiboot_uint16_t dseg; + multiboot_uint16_t flags; + multiboot_uint16_t cseg_len; + multiboot_uint16_t cseg_16_len; + multiboot_uint16_t dseg_len; +}; + +struct multiboot_tag_efi32 +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t pointer; +}; + +struct multiboot_tag_efi64 +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint64_t pointer; +}; + +struct multiboot_tag_smbios +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint8_t major; + multiboot_uint8_t minor; + multiboot_uint8_t reserved[6]; + multiboot_uint8_t tables[0]; +}; + +struct multiboot_tag_old_acpi +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint8_t rsdp[0]; +}; + +struct multiboot_tag_new_acpi +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint8_t rsdp[0]; +}; + +struct multiboot_tag_network +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint8_t dhcpack[0]; +}; + +struct multiboot_tag_efi_mmap +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t descr_Size; + multiboot_uint32_t descr_vers; + multiboot_uint8_t efi_mmap[0]; +}; + +struct multiboot_tag_efi32_ih +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t pointer; +}; + +struct multiboot_tag_efi64_ih +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint64_t pointer; +}; + +struct multiboot_tag_load_base_addr +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t load_base_addr; +}; + +#endif /* ! __ASSEMBLY__ */ + +#endif /* ! __MULTIBOOT_HEADER__ */ \ No newline at end of file diff --git a/src/arch/x86/kernel/context.S b/src/arch/x86/kernel/context.S index 25de131..37981b1 100644 --- a/src/arch/x86/kernel/context.S +++ b/src/arch/x86/kernel/context.S @@ -9,14 +9,16 @@ * 2021-10-16 JasonHu Init */ +#define __ASSEMBLY__ +#include + .code32 .text /** * void NX_HalContextSwitchNext(NX_Addr nextSP); */ -.globl NX_HalContextSwitchNext -NX_HalContextSwitchNext: +NX_FUNC(NX_HalContextSwitchNext) movl 0x4(%esp), %eax // get thread "nextSP" movl (%eax), %esp // restore sp @@ -25,12 +27,12 @@ NX_HalContextSwitchNext: popl %edi popl %esi ret +NX_ENDFUNC(NX_HalContextSwitchNext) /** * void NX_HalContextSwitchPrevNext(NX_Addr prevSP, NX_Addr nextSP); */ -.globl NX_HalContextSwitchPrevNext -NX_HalContextSwitchPrevNext: +NX_FUNC(NX_HalContextSwitchPrevNext) pushl %esi pushl %edi pushl %ebx @@ -47,3 +49,4 @@ NX_HalContextSwitchPrevNext: popl %edi popl %esi ret +NX_ENDFUNC(NX_HalContextSwitchPrevNext) diff --git a/src/arch/x86/kernel/i386.S b/src/arch/x86/kernel/i386.S index d2195e4..c324003 100644 --- a/src/arch/x86/kernel/i386.S +++ b/src/arch/x86/kernel/i386.S @@ -9,19 +9,19 @@ #define __ASSEMBLY__ #include +#include .code32 .text -.global CPU_LoadIDT -CPU_LoadIDT: +NX_FUNC(CPU_LoadIDT) movl 4(%esp), %eax movw %ax, 6(%esp) lidt 6(%esp) ret +NX_ENDFUNC(CPU_LoadIDT) -.global CPU_LoadGDT -CPU_LoadGDT: +NX_FUNC(CPU_LoadGDT) movl 4(%esp), %eax movw %ax, 6(%esp) lgdt 6(%esp) @@ -37,3 +37,4 @@ CPU_LoadGDT: ljmp $KERNEL_CODE_SEL, $.1 .1: ret +NX_ENDFUNC(CPU_LoadGDT) diff --git a/src/arch/x86/kernel/interrupt.S b/src/arch/x86/kernel/interrupt.S index 3484ecf..522c5e1 100644 --- a/src/arch/x86/kernel/interrupt.S +++ b/src/arch/x86/kernel/interrupt.S @@ -9,6 +9,9 @@ * 2022/2/9 JasonHu add NX_HalProcessEnterUserMode */ +#define __ASSEMBLY__ +#include + .code32 .text @@ -117,8 +120,7 @@ CPU_TrapEntryNoErrCode 0x2f .extern NX_HalProcessSyscallDispatch -.global CPU_SyscallEntry -CPU_SyscallEntry: +NX_FUNC(CPU_SyscallEntry) pushl $0x00 pushl %ds @@ -144,11 +146,8 @@ CPU_SyscallEntry: jmp NX_HalInterruptExit -.global NX_HalSyscallExit -NX_HalSyscallExit: -.global NX_HalInterruptExit -NX_HalInterruptExit: - +NX_FUNC(NX_HalSyscallExit) +NX_FUNC(NX_HalInterruptExit) /* irq over check */ pushl %esp /* sp arg */ call NX_IRQ_OverCheck @@ -167,3 +166,5 @@ NX_HalInterruptExit: addl $4, %esp /* skip error_code */ iretl + +NX_ENDFUNC(CPU_SyscallEntry) diff --git a/src/arch/x86/kernel/multiboot2.S b/src/arch/x86/kernel/multiboot2.S new file mode 100644 index 0000000..e115bca --- /dev/null +++ b/src/arch/x86/kernel/multiboot2.S @@ -0,0 +1,93 @@ +/** + * Copyright (c) 2018-2022, BookOS Development Team + * SPDX-License-Identifier: Apache-2.0 + * + * Contains: Multiboot2 start file + * + * Change Logs: + * Date Author Notes + * 2021-9-17 JasonHu Init + * 2022-06-03 JasonHu Add framebuffer support + */ + +#define __ASSEMBLY__ +#include +#include + +# the NX_USize of bootStack is 16KB +#define BOOT_STACK_SIZE 0x4000 + +.code32 + +.section .text.start +.extern NX_Main +.extern NX_HalBootSetting + +NX_FUNC(Start) +NX_FUNC(_start) + jmp MultibootEntry + +.align 8 +MultibootHeader: + .long MULTIBOOT2_HEADER_MAGIC # magic number (multiboot 2) + .long MULTIBOOT_ARCHITECTURE_I386 # architecture 0 (protected mode i386) + .long MultibootHeaderEnd - MultibootHeader # header length + # checksum + .long -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + (MultibootHeaderEnd - MultibootHeader)) + # insert optional multiboot tags here + +#ifdef CONFIG_NX_HARDWARE_VBE + .align 8 + TagFramebuffer: + .short MULTIBOOT_HEADER_TAG_FRAMEBUFFER + .short MULTIBOOT_HEADER_TAG_OPTIONAL + .long TagFramebufferEnd - TagFramebuffer + .long CONFIG_NX_HARDWARE_VBE_WIDTH # screen width + .long CONFIG_NX_HARDWARE_VBE_HEIGHT # screen height + .long CONFIG_NX_HARDWARE_VBE_BPP # bit per pixel + TagFramebufferEnd: +#endif /* CONFIG_NX_HARDWARE_VBE */ + + # required end tag + .align 8 + .short MULTIBOOT_HEADER_TAG_END # type + .short 0 # flags + .long 8 # NX_USize +MultibootHeaderEnd: +MultibootEntry: + # initialize the bootStack pointer + movl $(bootStack + BOOT_STACK_SIZE), %esp + + # reset EFLAGS + pushl $0 + popf + + # push the pointer to the Multiboot information structure + pushl %ebx + # push the magic value + pushl %eax + + call NX_HalBootSetting + cmpl $-1, %eax + je BootSetupFail + + add $8, %esp + + # call os main + call NX_Main + jmp MultibootHlt + +BootSetupFail: + # print "Error!" in protected mode + movl $0xcf72cf45, 0xb8000 + movl $0xcf6fcf72, 0xb8004 + movl $0xcf21cf72, 0xb8008 + +MultibootHlt: + hlt + jmp MultibootHlt + +NX_ENDFUNC(Start) +NX_ENDFUNC(_start) + + .comm bootStack, BOOT_STACK_SIZE diff --git a/src/arch/x86/kernel/process.S b/src/arch/x86/kernel/process.S index c464cd5..64b96ff 100644 --- a/src/arch/x86/kernel/process.S +++ b/src/arch/x86/kernel/process.S @@ -9,14 +9,16 @@ * 2022-05-15 JasonHu Init */ +#define __ASSEMBLY__ +#include + .code32 .text /* * void NX_HalProcessEnterUserMode(frame); */ -.global NX_HalProcessEnterUserMode -NX_HalProcessEnterUserMode: +NX_FUNC(NX_HalProcessEnterUserMode) movl 0x4(%esp), %esp addl $4,%esp // skip intr no popal @@ -26,22 +28,27 @@ NX_HalProcessEnterUserMode: popl %ds addl $4, %esp // skip error code iret // enter to user mode +NX_ENDFUNC(NX_HalProcessEnterUserMode) .align 4 -.global NX_HalUserThreadReturnCodeBegin -NX_HalUserThreadReturnCodeBegin: + +NX_FUNC(NX_HalUserThreadReturnCodeBegin) movl %eax, %ebx // ebx = eax = exit code movl $48, %eax // eax = 48, SysThreadExit int $0x80 +NX_ENDFUNC(NX_HalUserThreadReturnCodeBegin) + .align 4 -.global NX_HalUserThreadReturnCodeEnd -NX_HalUserThreadReturnCodeEnd: +NX_FUNC(NX_HalUserThreadReturnCodeEnd) +NX_ENDFUNC(NX_HalUserThreadReturnCodeEnd) .align 4 -.global NX_HalSignalReturnCodeBegin -NX_HalSignalReturnCodeBegin: + +NX_FUNC(NX_HalSignalReturnCodeBegin) movl $0xF00000, %eax // eax = SysSignalReturn, hide for user int $0x80 +NX_ENDFUNC(NX_HalSignalReturnCodeBegin) + .align 4 -.global NX_HalSignalReturnCodeEnd -NX_HalSignalReturnCodeEnd: +NX_FUNC(NX_HalSignalReturnCodeEnd) +NX_ENDFUNC(NX_HalSignalReturnCodeEnd) diff --git a/src/include/base/defines.h b/src/include/base/defines.h index fe8cc44..c87b247 100644 --- a/src/include/base/defines.h +++ b/src/include/base/defines.h @@ -118,4 +118,32 @@ #define NX_ALIGN(n) __attribute__((aligned(n))) #define NX_PACKED __attribute__((packed)) +#ifdef __ASSEMBLY__ +/** + * new line for toolchain + */ +#ifndef NX_ASM_NEWLINE +#define NX_ASM_NEWLINE ; +#endif /* NX_ASM_NEWLINE */ + +/** + * for asm function start + */ +#ifndef NX_FUNC +#define NX_FUNC(name) \ + .globl name NX_ASM_NEWLINE \ + name: +#endif /* NX_FUNC */ + +/** + * for asm function return + */ +#ifndef NX_ENDFUNC +#define NX_ENDFUNC(name) \ + .type name, @function NX_ASM_NEWLINE \ + .size name, .-name +#endif /* NX_ENDFUNC */ + +#endif /* __ASSEMBLY__ */ + #endif /* __XBOOK_DEFINES__ */ diff --git a/src/platform/i386 b/src/platform/i386 index 6eb04fe..7260ac6 160000 --- a/src/platform/i386 +++ b/src/platform/i386 @@ -1 +1 @@ -Subproject commit 6eb04fe7cd4c7eea858c2a0d56a17a05709b89fb +Subproject commit 7260ac62980c2cd435edce39522481c663588ff4 -- Gitee