Improve formatting and enable FLOATING_POINT_ERR
This commit is contained in:
+18
-14
@@ -9,13 +9,13 @@
|
|||||||
#define __DEBUG_LEVEL__ LOGLEVEL_NOTICE ///< Set log level.
|
#define __DEBUG_LEVEL__ LOGLEVEL_NOTICE ///< Set log level.
|
||||||
#include "io/debug.h" // Include debugging functions.
|
#include "io/debug.h" // Include debugging functions.
|
||||||
|
|
||||||
#include "devices/fpu.h"
|
|
||||||
#include "descriptor_tables/isr.h"
|
|
||||||
#include "string.h"
|
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
#include "process/scheduler.h"
|
#include "descriptor_tables/isr.h"
|
||||||
|
#include "devices/fpu.h"
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
#include "process/process.h"
|
#include "process/process.h"
|
||||||
|
#include "process/scheduler.h"
|
||||||
|
#include "string.h"
|
||||||
#include "system/signal.h"
|
#include "system/signal.h"
|
||||||
|
|
||||||
/// Pointerst to the current thread using the FPU.
|
/// Pointerst to the current thread using the FPU.
|
||||||
@@ -36,12 +36,12 @@ static inline void __enable_fpu()
|
|||||||
__asm__ __volatile__("clts");
|
__asm__ __volatile__("clts");
|
||||||
size_t t;
|
size_t t;
|
||||||
__asm__ __volatile__("mov %%cr0, %0"
|
__asm__ __volatile__("mov %%cr0, %0"
|
||||||
: "=r"(t));
|
: "=r"(t));
|
||||||
t &= ~(1U << 2U);
|
t &= ~(1U << 2U);
|
||||||
t |= (1U << 1U);
|
t |= (1U << 1U);
|
||||||
__asm__ __volatile__("mov %0, %%cr0" ::"r"(t));
|
__asm__ __volatile__("mov %0, %%cr0" ::"r"(t));
|
||||||
__asm__ __volatile__("mov %%cr4, %0"
|
__asm__ __volatile__("mov %%cr4, %0"
|
||||||
: "=r"(t));
|
: "=r"(t));
|
||||||
t |= 3U << 9U;
|
t |= 3U << 9U;
|
||||||
__asm__ __volatile__("mov %0, %%cr4" ::"r"(t));
|
__asm__ __volatile__("mov %0, %%cr4" ::"r"(t));
|
||||||
}
|
}
|
||||||
@@ -52,7 +52,7 @@ static inline void __disable_fpu()
|
|||||||
size_t t;
|
size_t t;
|
||||||
|
|
||||||
__asm__ __volatile__("mov %%cr0, %0"
|
__asm__ __volatile__("mov %%cr0, %0"
|
||||||
: "=r"(t));
|
: "=r"(t));
|
||||||
|
|
||||||
t |= 1U << 3U;
|
t |= 1U << 3U;
|
||||||
|
|
||||||
@@ -116,7 +116,7 @@ static inline void __invalid_op(pt_regs *f)
|
|||||||
|
|
||||||
/// Kernel trap for various integer and floating-point errors
|
/// Kernel trap for various integer and floating-point errors
|
||||||
/// @param f The interrupt stack frame.
|
/// @param f The interrupt stack frame.
|
||||||
static inline void __sigfpe_handler(pt_regs* f)
|
static inline void __sigfpe_handler(pt_regs *f)
|
||||||
{
|
{
|
||||||
pr_debug("__sigfpe_handler(%p)\n", f);
|
pr_debug("__sigfpe_handler(%p)\n", f);
|
||||||
|
|
||||||
@@ -125,7 +125,6 @@ static inline void __sigfpe_handler(pt_regs* f)
|
|||||||
sys_kill(thread_using_fpu->pid, SIGFPE);
|
sys_kill(thread_using_fpu->pid, SIGFPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// @brief Ensure basic FPU functionality works.
|
/// @brief Ensure basic FPU functionality works.
|
||||||
/// @details
|
/// @details
|
||||||
/// For processors without a FPU, this tests that maths libraries link
|
/// For processors without a FPU, this tests that maths libraries link
|
||||||
@@ -137,17 +136,21 @@ static int __fpu_test()
|
|||||||
for (int i = 0; i < 10000; i++) {
|
for (int i = 0; i < 10000; i++) {
|
||||||
a = a * 1.123 + (a / 3);
|
a = a * 1.123 + (a / 3);
|
||||||
a /= 1.111;
|
a /= 1.111;
|
||||||
while (a > 100.0)
|
while (a > 100.0) {
|
||||||
a /= 3.1234563212;
|
a /= 3.1234563212;
|
||||||
while (a < 2.0)
|
}
|
||||||
|
while (a < 2.0) {
|
||||||
a += 1.1232132131;
|
a += 1.1232132131;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (a != 50.11095685350556294679336133413)
|
if (a != 50.11095685350556294679336133413) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
// Second test.
|
// Second test.
|
||||||
a = M_PI;
|
a = M_PI;
|
||||||
for (int i = 0; i < 100; i++)
|
for (int i = 0; i < 100; i++) {
|
||||||
a = a * 3 + (a / 3);
|
a = a * 3 + (a / 3);
|
||||||
|
}
|
||||||
return (a == 60957114488184560000000000000000000000000000000000000.0);
|
return (a == 60957114488184560000000000000000000000000000000000000.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,9 +176,10 @@ int fpu_install()
|
|||||||
// Install handlers for floating points and integers errors
|
// Install handlers for floating points and integers errors
|
||||||
isr_install_handler(DIVIDE_ERROR, &__sigfpe_handler, "divide error");
|
isr_install_handler(DIVIDE_ERROR, &__sigfpe_handler, "divide error");
|
||||||
|
|
||||||
|
isr_install_handler(FLOATING_POINT_ERR, &__sigfpe_handler, "floating point error");
|
||||||
|
|
||||||
// NB: The exceptions bolow don't seems to ever trigger
|
// NB: The exceptions bolow don't seems to ever trigger
|
||||||
//isr_install_handler(OVERFLOW, &__sigfpe_handler, "overflow");
|
//isr_install_handler(OVERFLOW, &__sigfpe_handler, "overflow");
|
||||||
//isr_install_handler(FLOATING_POINT_ERR, &__sigfpe_handler, "floating point error");
|
|
||||||
|
|
||||||
return __fpu_test();
|
return __fpu_test();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,21 +12,31 @@
|
|||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
|
||||||
void sig_handler(int sig)
|
void sig_handler(int sig)
|
||||||
{
|
{
|
||||||
printf("handler(%d) : Starting handler.\n", sig);
|
printf("handler(%d) : Starting handler.\n", sig);
|
||||||
if (sig == SIGFPE) {
|
if (sig == SIGFPE) {
|
||||||
printf("handler(%d) : Correct signal. FPE\n", sig);
|
printf("handler(%d) : Correct signal. FPE\n", sig);
|
||||||
printf("handler(%d) : Exiting\n", sig);
|
printf("handler(%d) : Exiting\n", sig);
|
||||||
exit(1);
|
// exit(1);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
printf("handler(%d) : Wrong signal.\n", sig);
|
printf("handler(%d) : Wrong signal.\n", sig);
|
||||||
}
|
}
|
||||||
printf("handler(%d) : Ending handler.\n", sig);
|
printf("handler(%d) : Ending handler.\n", sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long int fact(int n)
|
||||||
|
{
|
||||||
|
if (n == 0 || n == 1) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
long int pro = 1;
|
||||||
|
while (n != 1) {
|
||||||
|
pro *= n--;
|
||||||
|
}
|
||||||
|
return pro;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
sigaction_t action;
|
sigaction_t action;
|
||||||
@@ -42,9 +52,9 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
// Should trigger ALU error, fighting the compiler...
|
// Should trigger ALU error, fighting the compiler...
|
||||||
int d = 1, e = 1;
|
int d = 1, e = 1;
|
||||||
while (1) {
|
d /= e;
|
||||||
d /= e;
|
e -= 1;
|
||||||
e -= 1;
|
d /= e;
|
||||||
}
|
e -= 1;
|
||||||
printf("d: %d, e: %d\n", d, e);
|
printf("d: %d, e: %d\n", d, e);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user