Browse Source

fix(port, kmods): make kmods aligned to 16bytes, make inl volatile

greatbridf 1 năm trước cách đây
mục cha
commit
f998f5ec25
2 tập tin đã thay đổi với 7 bổ sung6 xóa
  1. 6 6
      include/kernel/hw/port.hpp
  2. 1 0
      src/kernel.ld

+ 6 - 6
include/kernel/hw/port.hpp

@@ -7,7 +7,7 @@ namespace kernel::hw {
 inline uint32_t inl(uint16_t pn)
 {
     uint32_t ret;
-    asm("inl %1, %0"
+    asm volatile("inl %1, %0"
         : "=a"(ret)
         : "d"(pn));
     return ret;
@@ -15,7 +15,7 @@ inline uint32_t inl(uint16_t pn)
 
 inline uint32_t outl(uint16_t pn, uint32_t n)
 {
-    asm("outl %1, %0"
+    asm volatile("outl %1, %0"
         :
         : "d"(pn), "a"(n));
     return n;
@@ -24,7 +24,7 @@ inline uint32_t outl(uint16_t pn, uint32_t n)
 inline uint16_t inw(uint16_t pn)
 {
     uint16_t ret;
-    asm("inw %1, %0"
+    asm volatile("inw %1, %0"
         : "=a"(ret)
         : "d"(pn));
     return ret;
@@ -32,7 +32,7 @@ inline uint16_t inw(uint16_t pn)
 
 inline uint16_t outw(uint16_t pn, uint16_t n)
 {
-    asm("outw %1, %0"
+    asm volatile("outw %1, %0"
         :
         : "d"(pn), "a"(n));
     return n;
@@ -41,7 +41,7 @@ inline uint16_t outw(uint16_t pn, uint16_t n)
 inline uint8_t inb(uint16_t pn)
 {
     uint8_t ret;
-    asm("inb %1, %0"
+    asm volatile("inb %1, %0"
         : "=a"(ret)
         : "d"(pn));
     return ret;
@@ -49,7 +49,7 @@ inline uint8_t inb(uint16_t pn)
 
 inline uint8_t outb(uint16_t pn, uint8_t n)
 {
-    asm("outb %1, %0"
+    asm volatile("outb %1, %0"
         :
         : "d"(pn), "a"(n));
     return n;

+ 1 - 0
src/kernel.ld

@@ -76,6 +76,7 @@ SECTIONS
         *(.rodata)
         *(.rodata*)
 
+        . = ALIGN(16);
         kmod_loaders_start = .;
 
         *(.kmods)