From 29542e98d2cf2cbd0fb60fde9c7983d6247ec3e1 Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Mon, 20 Dec 2021 11:14:40 +0500 Subject: [PATCH] Split and --- Makefile.am | 8 +-- README.md | 24 +++++---- configure.ac | 8 +-- include/Makefile.am | 2 + include/kernaux.h | 14 ++++-- include/kernaux/arch/i386.h | 53 ------------------- include/kernaux/asm/i386.h | 67 +++++++++++++++++++++++++ include/kernaux/asm/x86_64.h | 14 ++++++ src/arch/i386/asm.S | 38 -------------- src/asm/i386.S | 38 ++++++++++++++ src/{arch/x86_64/asm.S => asm/x86_64.S} | 0 src/console.c | 8 +-- 12 files changed, 157 insertions(+), 117 deletions(-) create mode 100644 include/kernaux/asm/i386.h create mode 100644 include/kernaux/asm/x86_64.h delete mode 100644 src/arch/i386/asm.S create mode 100644 src/asm/i386.S rename src/{arch/x86_64/asm.S => asm/x86_64.S} (100%) diff --git a/Makefile.am b/Makefile.am index 4074e97..c818307 100644 --- a/Makefile.am +++ b/Makefile.am @@ -25,12 +25,12 @@ libkernaux_a_SOURCES = \ src/libc.c \ src/printf.c -if ARCH_I386 -libkernaux_a_SOURCES += src/arch/i386/asm.S +if ASM_I386 +libkernaux_a_SOURCES += src/asm/i386.S endif -if ARCH_X86_64 -libkernaux_a_SOURCES += src/arch/x86_64/asm.S +if ASM_X86_64 +libkernaux_a_SOURCES += src/asm/x86_64.S endif if WITH_CMDLINE diff --git a/README.md b/README.md index 5dacff1..e584324 100644 --- a/README.md +++ b/README.md @@ -30,10 +30,12 @@ API --- * Runtime environment + * Architecture-specific code + * [Declarations](/include/kernaux/arch/) + * [Functions](/include/kernaux/asm/) * [Assertions](/include/kernaux/assert.h) * [Simple](/examples/assert_simple.c) * [Guards](/examples/assert_guards.c) - * [Architecture-specific helpers](/include/kernaux/arch/) * Device drivers (for debugging only) * [Serial console](/include/kernaux/console.h) * Framebuffer *(planned)* @@ -177,39 +179,39 @@ To install into specific directory use full path: `DESTDIR="$(pwd)/dest" sudo make install-exec install-data` instead of `DESTDIR=dest sudo make install-exec install-data`. -Check if compilation targets i386: `objdump -d src/arch/i386/asm.o`. It should -output something like this: +Check if compilation targets i386: `objdump -d src/asm/i386.o`. It should output +something like this: ``` -src/arch/i386/asm.o: file format elf32-i386 +src/asm/i386.o: file format elf32-i386 Disassembly of section .text: -00000000 : +00000000 : 0: fa cli 1: f4 hlt - 2: eb fc jmp 0 + 2: eb fc jmp 0 -00000004 : +00000004 : 4: 0f 20 c0 mov %cr0,%eax 7: c3 ret -00000008 : +00000008 : 8: 0f 20 e0 mov %cr4,%eax b: c3 ret -0000000c : +0000000c : c: 8b 44 24 04 mov 0x4(%esp),%eax 10: 0f 22 c0 mov %eax,%cr0 13: c3 ret -00000014 : +00000014 : 14: 8b 44 24 04 mov 0x4(%esp),%eax 18: 0f 22 d8 mov %eax,%cr3 1b: c3 ret -0000001c : +0000001c : 1c: 8b 44 24 04 mov 0x4(%esp),%eax 20: 0f 22 e0 mov %eax,%cr4 23: c3 ret diff --git a/configure.ac b/configure.ac index b003298..a6d008d 100644 --- a/configure.ac +++ b/configure.ac @@ -52,8 +52,8 @@ AS_IF([test "$with_libc" = yes], do_with_libc) dnl Architecture -AM_CONDITIONAL([ARCH_I386], [test "$host_cpu" = i386]) -AM_CONDITIONAL([ARCH_X86_64], [test "$host_cpu" = x86_64]) +AM_CONDITIONAL([ASM_I386], [test "$host_cpu" = i386]) +AM_CONDITIONAL([ASM_X86_64], [test "$host_cpu" = x86_64]) dnl Features (disabled by default) AM_CONDITIONAL([ENABLE_ASSERT], [test "$enable_assert" = yes]) @@ -76,8 +76,8 @@ AM_CONDITIONAL([WITH_LIBC_STRLEN], [test "$with_libc_strlen" = yes]) dnl Architecture -AS_IF([test "$host_cpu" = i386], [AC_DEFINE([ARCH_I386], [1], [architecture is i386])]) -AS_IF([test "$host_cpu" = x86_64], [AC_DEFINE([ARCH_X86_64], [1], [architecture is x86_64])]) +AS_IF([test "$host_cpu" = i386], [AC_DEFINE([ASM_I386], [1], [architecture is i386])]) +AS_IF([test "$host_cpu" = x86_64], [AC_DEFINE([ASM_X86_64], [1], [architecture is x86_64])]) dnl Features (disabled by default) AS_IF([test "$enable_assert" = yes], [AC_DEFINE([KERNAUX_ENABLE_ASSERT], [1], [enabled runtime assertions])]) diff --git a/include/Makefile.am b/include/Makefile.am index 89dd026..d0933e9 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -2,6 +2,8 @@ nobase_include_HEADERS = \ kernaux.h \ kernaux/arch/i386.h \ kernaux/arch/x86_64.h \ + kernaux/asm/i386.h \ + kernaux/asm/x86_64.h \ kernaux/assert.h \ kernaux/cmdline.h \ kernaux/console.h \ diff --git a/include/kernaux.h b/include/kernaux.h index 65673f7..bd627a5 100644 --- a/include/kernaux.h +++ b/include/kernaux.h @@ -1,3 +1,14 @@ +/* + We don't include because they + contain architecture-specific assembly functions. + + We don't include because it may + conflict with actual freestanding or hosted libc. +*/ + +#include +#include + #include #include #include @@ -7,6 +18,3 @@ #include #include #include - -// We don't include because it may -// conflict with actual freestanding or hosted libc. diff --git a/include/kernaux/arch/i386.h b/include/kernaux/arch/i386.h index 2f360b8..aec25c3 100644 --- a/include/kernaux/arch/i386.h +++ b/include/kernaux/arch/i386.h @@ -99,59 +99,6 @@ struct KernAux_Arch_I386_PageTable { } __attribute__((packed)); -inline static uint8_t kernaux_arch_i386_inportb(uint16_t port); -inline static uint16_t kernaux_arch_i386_inportw(uint16_t port); -inline static uint32_t kernaux_arch_i386_inportd(uint16_t port); - -inline static void kernaux_arch_i386_outportb(uint16_t port, uint8_t value); -inline static void kernaux_arch_i386_outportw(uint16_t port, uint16_t value); -inline static void kernaux_arch_i386_outportd(uint16_t port, uint32_t value); - -void kernaux_arch_i386_hang() __attribute__((noreturn)); - -uint32_t kernaux_arch_i386_read_cr0(); -uint32_t kernaux_arch_i386_read_cr4(); - -void kernaux_arch_i386_write_cr0(volatile uint32_t value); -void kernaux_arch_i386_write_cr3(volatile uint32_t value); -void kernaux_arch_i386_write_cr4(volatile uint32_t value); - -uint8_t kernaux_arch_i386_inportb(const uint16_t port) -{ - register uint8_t result; - __asm__ volatile("inb %1, %0" : "=a" (result) : "dN" (port)); - return result; -} - -uint16_t kernaux_arch_i386_inportw(const uint16_t port) -{ - register uint16_t result; - __asm__ volatile("inw %1, %0" : "=a" (result) : "dN" (port)); - return result; -} - -uint32_t kernaux_arch_i386_inportd(const uint16_t port) -{ - register uint32_t result; - __asm__ volatile("ind %1, %0" : "=a" (result) : "dN" (port)); - return result; -} - -void kernaux_arch_i386_outportb(const uint16_t port, const uint8_t value) -{ - __asm__ volatile("outb %1, %0" : : "dN" (port), "a" (value)); -} - -void kernaux_arch_i386_outportw(const uint16_t port, const uint16_t value) -{ - __asm__ volatile("outw %1, %0" : : "dN" (port), "a" (value)); -} - -void kernaux_arch_i386_outportd(const uint16_t port, const uint32_t value) -{ - __asm__ volatile("outd %1, %0" : : "dN" (port), "a" (value)); -} - #ifdef __cplusplus } #endif diff --git a/include/kernaux/asm/i386.h b/include/kernaux/asm/i386.h new file mode 100644 index 0000000..68e933f --- /dev/null +++ b/include/kernaux/asm/i386.h @@ -0,0 +1,67 @@ +#ifndef KERNAUX_INCLUDED_ASM_I386 +#define KERNAUX_INCLUDED_ASM_I386 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +void kernaux_asm_i386_hang() __attribute__((noreturn)); + +inline static uint8_t kernaux_asm_i386_inportb(uint16_t port); +inline static uint16_t kernaux_asm_i386_inportw(uint16_t port); +inline static uint32_t kernaux_asm_i386_inportd(uint16_t port); + +inline static void kernaux_asm_i386_outportb(uint16_t port, uint8_t value); +inline static void kernaux_asm_i386_outportw(uint16_t port, uint16_t value); +inline static void kernaux_asm_i386_outportd(uint16_t port, uint32_t value); + +uint32_t kernaux_asm_i386_read_cr0(); +uint32_t kernaux_asm_i386_read_cr4(); + +void kernaux_asm_i386_write_cr0(volatile uint32_t value); +void kernaux_asm_i386_write_cr3(volatile uint32_t value); +void kernaux_asm_i386_write_cr4(volatile uint32_t value); + +uint8_t kernaux_asm_i386_inportb(const uint16_t port) +{ + register uint8_t result; + __asm__ volatile("inb %1, %0" : "=a" (result) : "dN" (port)); + return result; +} + +uint16_t kernaux_asm_i386_inportw(const uint16_t port) +{ + register uint16_t result; + __asm__ volatile("inw %1, %0" : "=a" (result) : "dN" (port)); + return result; +} + +uint32_t kernaux_asm_i386_inportd(const uint16_t port) +{ + register uint32_t result; + __asm__ volatile("ind %1, %0" : "=a" (result) : "dN" (port)); + return result; +} + +void kernaux_asm_i386_outportb(const uint16_t port, const uint8_t value) +{ + __asm__ volatile("outb %1, %0" : : "dN" (port), "a" (value)); +} + +void kernaux_asm_i386_outportw(const uint16_t port, const uint16_t value) +{ + __asm__ volatile("outw %1, %0" : : "dN" (port), "a" (value)); +} + +void kernaux_asm_i386_outportd(const uint16_t port, const uint32_t value) +{ + __asm__ volatile("outd %1, %0" : : "dN" (port), "a" (value)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/kernaux/asm/x86_64.h b/include/kernaux/asm/x86_64.h new file mode 100644 index 0000000..c9ebdd1 --- /dev/null +++ b/include/kernaux/asm/x86_64.h @@ -0,0 +1,14 @@ +#ifndef KERNAUX_INCLUDED_ASM_X86_64 +#define KERNAUX_INCLUDED_ASM_X86_64 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/arch/i386/asm.S b/src/arch/i386/asm.S deleted file mode 100644 index 2ac0b5b..0000000 --- a/src/arch/i386/asm.S +++ /dev/null @@ -1,38 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -.global kernaux_arch_i386_hang -.global kernaux_arch_i386_read_cr0 -.global kernaux_arch_i386_read_cr4 -.global kernaux_arch_i386_write_cr0 -.global kernaux_arch_i386_write_cr3 -.global kernaux_arch_i386_write_cr4 - -kernaux_arch_i386_hang: - cli - hlt - jmp kernaux_arch_i386_hang - -kernaux_arch_i386_read_cr0: - mov %cr0, %eax - ret - -kernaux_arch_i386_read_cr4: - mov %cr4, %eax - ret - -kernaux_arch_i386_write_cr0: - mov 4(%esp), %eax - mov %eax, %cr0 - ret - -kernaux_arch_i386_write_cr3: - mov 4(%esp), %eax - mov %eax, %cr3 - ret - -kernaux_arch_i386_write_cr4: - mov 4(%esp), %eax - mov %eax, %cr4 - ret diff --git a/src/asm/i386.S b/src/asm/i386.S new file mode 100644 index 0000000..f6cb51e --- /dev/null +++ b/src/asm/i386.S @@ -0,0 +1,38 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +.global kernaux_asm_i386_hang +.global kernaux_asm_i386_read_cr0 +.global kernaux_asm_i386_read_cr4 +.global kernaux_asm_i386_write_cr0 +.global kernaux_asm_i386_write_cr3 +.global kernaux_asm_i386_write_cr4 + +kernaux_asm_i386_hang: + cli + hlt + jmp kernaux_asm_i386_hang + +kernaux_asm_i386_read_cr0: + mov %cr0, %eax + ret + +kernaux_asm_i386_read_cr4: + mov %cr4, %eax + ret + +kernaux_asm_i386_write_cr0: + mov 4(%esp), %eax + mov %eax, %cr0 + ret + +kernaux_asm_i386_write_cr3: + mov 4(%esp), %eax + mov %eax, %cr3 + ret + +kernaux_asm_i386_write_cr4: + mov 4(%esp), %eax + mov %eax, %cr4 + ret diff --git a/src/arch/x86_64/asm.S b/src/asm/x86_64.S similarity index 100% rename from src/arch/x86_64/asm.S rename to src/asm/x86_64.S diff --git a/src/console.c b/src/console.c index 0140418..ae41f10 100644 --- a/src/console.c +++ b/src/console.c @@ -2,8 +2,8 @@ #include "config.h" #endif -#ifdef ARCH_I386 -#include +#ifdef ASM_I386 +#include #endif #include @@ -17,8 +17,8 @@ void kernaux_console_print(const char *const s) void kernaux_console_putc(const char c __attribute__((unused))) { -#ifdef ARCH_I386 - kernaux_arch_i386_outportb(0x3F8, c); +#ifdef ASM_I386 + kernaux_asm_i386_outportb(0x3F8, c); #endif }