Browse Source

[pk] added --disable-fp-emulation option for code size

cs250
Andrew Waterman 15 years ago
parent
commit
0cf0242c3b
  1. 3
      config.h.in
  2. 15
      configure
  3. 14
      pk/fp.c
  4. 6
      pk/handlers.c
  5. 5
      pk/pk.ac

3
config.h.in

@ -21,6 +21,9 @@
/* Define if subproject MCPPBS_SPROJ_NORM is enabled */
#undef PK_ENABLED
/* Define if floating-point emulation is enabled */
#undef PK_ENABLE_FP_EMULATION
/* Define if the kernel runs in 64-bit mode */
#undef PK_ENABLE_KERNEL_64BIT

15
configure

@ -638,6 +638,7 @@ enable_optional_subprojects
enable_vm
enable_kernel_64bit
enable_user_64bit
enable_fp_emulation
'
ac_precious_vars='build_alias
host_alias
@ -1273,6 +1274,7 @@ Optional Features:
--disable-vm Disable virtual memory
--disable-kernel-64bit Disable 64-bit kernel operation
--disable-user-64bit Disable 64-bit user operation
--disable-fp-emulation Disable floating-point emulation
Some influential environment variables:
CC C compiler command
@ -4017,6 +4019,19 @@ if test "x$enable_user_64bit" != "xno"; then :
$as_echo "#define PK_ENABLE_USER_64BIT /**/" >>confdefs.h
fi
# Check whether --enable-fp-emulation was given.
if test "${enable_fp_emulation+set}" = set; then :
enableval=$enable_fp_emulation;
fi
if test "x$enable_fp_emulation" != "xno"; then :
$as_echo "#define PK_ENABLE_FP_EMULATION /**/" >>confdefs.h
fi

14
pk/fp.c

@ -1,8 +1,13 @@
#include "pk.h"
#include "pcr.h"
#include "fp.h"
static fp_state_t fp_state;
#ifdef PK_ENABLE_FP_EMULATION
#include "softfloat.h"
#include "riscv-opc.h"
#include "pk.h"
#include "fp.h"
#include <stdint.h>
#define noisy 0
@ -10,8 +15,6 @@
static void set_fp_reg(unsigned int which, unsigned int dp, uint64_t val);
static uint64_t get_fp_reg(unsigned int which, unsigned int dp);
static fp_state_t fp_state;
static inline void
validate_address(trapframe_t* tf, long addr, int size, int store)
{
@ -252,6 +255,8 @@ get_fp_reg(unsigned int which, unsigned int dp)
return val;
}
#endif
void init_fp_regs()
{
long sr = mfpcr(PCR_SR);
@ -259,4 +264,3 @@ void init_fp_regs()
put_fp_state(fp_state.fpr,fp_state.fsr);
mtpcr(sr, PCR_SR);
}

6
pk/handlers.c

@ -19,11 +19,15 @@ void handle_fp_disabled(trapframe_t* tf)
}
else
{
#ifdef PK_ENABLE_FP_EMULATION
if(emulate_fp(tf) != 0)
{
dump_tf(tf);
panic("FPU emulation failed!");
}
#else
panic("FPU emulation disabled! pc %lx, insn %x",tf->epc,(uint32_t)tf->insn);
#endif
}
}
@ -41,8 +45,10 @@ void handle_privileged_instruction(trapframe_t* tf)
void handle_illegal_instruction(trapframe_t* tf)
{
#ifdef PK_ENABLE_FP_EMULATION
if(emulate_fp(tf) == 0)
return;
#endif
dump_tf(tf);
panic("An illegal instruction was executed!");

5
pk/pk.ac

@ -15,3 +15,8 @@ AC_ARG_ENABLE([user-64bit], AS_HELP_STRING([--disable-user-64bit], [Disable 64-b
AS_IF([test "x$enable_user_64bit" != "xno"], [
AC_DEFINE([PK_ENABLE_USER_64BIT],,[Define if the user runs in 64-bit mode])
])
AC_ARG_ENABLE([fp-emulation], AS_HELP_STRING([--disable-fp-emulation], [Disable floating-point emulation]))
AS_IF([test "x$enable_fp_emulation" != "xno"], [
AC_DEFINE([PK_ENABLE_FP_EMULATION],,[Define if floating-point emulation is enabled])
])

Loading…
Cancel
Save