Patch for libcpu, introducing CPU models 'native' and 'virtual' and
implementing functions removed from score.
diff --git a/c/src/lib/libcpu/i386/Makefile.am b/c/src/lib/libcpu/i386/Makefile.am
index 0330ba3..93e83db 100644
--- a/c/src/lib/libcpu/i386/Makefile.am
+++ b/c/src/lib/libcpu/i386/Makefile.am
@@ -4,12 +4,51 @@ noinst_PROGRAMS =
 
 include $(top_srcdir)/../../../automake/compile.am
 
+if VIRT_POK
+
+
+# TODO insert virt_pok cpu includes here
+include_libcpudir = $(includedir)/libcpu
+
+include_libcpu_HEADERS = cpu.h cpuModel.h
+include_libcpu_HEADERS += ../shared/include/cache.h
+include_libcpu_HEADERS += byteorder.h
+
+include_libcpu_HEADERS += virtual/include/rtems/score/interrupts.h
+include_libcpu_HEADERS += virtual/include/cpu-score-split.h
+
+noinst_PROGRAMS += cache.rel
+cache_rel_SOURCES = cache.c cache_.h ../shared/src/cache_aligned_malloc.c \
+    ../shared/src/cache_manager.c ../shared/include/cache.h
+cache_rel_CPPFLAGS = $(AM_CPPFLAGS)
+cache_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
+
+noinst_PROGRAMS += score.rel
+score_rel_SOURCES = displayCpu.c cpuModel.S cpuModel.h idtr.S cpu.h
+score_rel_SOURCES += virtual/cpu-score-split.c
+score_rel_CPPFLAGS = $(AM_CPPFLAGS)
+score_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
+
+noinst_PROGRAMS += page.rel
+page_rel_SOURCES = page.c cpu.h
+page_rel_CPPFLAGS = $(AM_CPPFLAGS)
+page_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
+
+
+
+else # native
+
+
+
 include_libcpudir = $(includedir)/libcpu
 
 include_libcpu_HEADERS = cpu.h cpuModel.h
 include_libcpu_HEADERS += ../shared/include/cache.h
 include_libcpu_HEADERS += byteorder.h
 
+include_libcpu_HEADERS += native/include/rtems/score/interrupts.h
+include_libcpu_HEADERS += native/include/cpu-score-split.h
+
 noinst_PROGRAMS += cache.rel
 cache_rel_SOURCES = cache.c cache_.h ../shared/src/cache_aligned_malloc.c \
     ../shared/src/cache_manager.c ../shared/include/cache.h
@@ -18,6 +57,7 @@ cache_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
 
 noinst_PROGRAMS += score.rel
 score_rel_SOURCES = displayCpu.c cpuModel.S cpuModel.h idtr.S cpu.h
+score_rel_SOURCES += native/cpu-score-split.c
 score_rel_CPPFLAGS = $(AM_CPPFLAGS)
 score_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
 
@@ -26,5 +66,9 @@ page_rel_SOURCES = page.c cpu.h
 page_rel_CPPFLAGS = $(AM_CPPFLAGS)
 page_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
 
+
+
+endif
+
 include $(srcdir)/preinstall.am
 include $(top_srcdir)/../../../automake/local.am
diff --git a/c/src/lib/libcpu/i386/configure.ac b/c/src/lib/libcpu/i386/configure.ac
index 5bc68c1..25e49e0 100644
--- a/c/src/lib/libcpu/i386/configure.ac
+++ b/c/src/lib/libcpu/i386/configure.ac
@@ -2,6 +2,7 @@
 
 AC_PREREQ([2.69])
 AC_INIT([rtems-c-src-lib-libcpu-i386],[_RTEMS_VERSION],[http://www.rtems.org/bugzilla])
+# TODO check ac_config_srcdir cpuModel.h -- replacement necessary?
 AC_CONFIG_SRCDIR([cpuModel.h])
 RTEMS_TOP([../../../../..],[../../..])
 
@@ -19,6 +20,9 @@ AM_PROG_CC_C_O
 RTEMS_CANONICALIZE_TOOLS
 RTEMS_PROG_CCAS
 
+AM_CONDITIONAL([VIRT_POK],[test x"$RTEMS_CPU_MODEL" = x"virt-pok"])
+
+
 RTEMS_AMPOLISH3
 
 # Explicitly list all Makefiles here
diff --git a/c/src/lib/libcpu/i386/cpu.h b/c/src/lib/libcpu/i386/cpu.h
index a14ed46..1b39194 100644
--- a/c/src/lib/libcpu/i386/cpu.h
+++ b/c/src/lib/libcpu/i386/cpu.h
@@ -26,7 +26,7 @@
 /*
  *  Interrupt Level Macros
  */
-#include <rtems/score/interrupts.h>
+#include <libcpu/interrupts.h>
 
 /*
  *  Segment Access Routines
diff --git a/c/src/lib/libcpu/i386/native/cpu-score-split.c b/c/src/lib/libcpu/i386/native/cpu-score-split.c
new file mode 100644
index 0000000..cdb95cb
--- /dev/null
+++ b/c/src/lib/libcpu/i386/native/cpu-score-split.c
@@ -0,0 +1,39 @@
+/**
+ *  @file
+ *
+ *  @brief Virtualization Sensitive Intel i386 Dependent Source
+ *
+ *  Part of cpu.c that must be replaced with a virtualization acceptable way to
+ *  idle. On i386 "hlt" is used, which is priviledged and causes a GPF.
+ */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#include <rtems/score/cpu.h>	// function definition
+
+
+
+/**
+ * @brief Idle thread executes idle operation
+ *
+ * If used in a virtualized environment, this executes a call to the
+ * virtualization layer.
+ */
+
+void *_CPU_Thread_Idle_body( uintptr_t ignored )
+{
+  while(1)
+  {
+    __asm__ volatile ("hlt");
+  }
+  return NULL;
+}
+
+
+#ifdef __cpluplus
+}
+#endif 
diff --git a/c/src/lib/libcpu/i386/native/include/cpu-score-split.h b/c/src/lib/libcpu/i386/native/include/cpu-score-split.h
new file mode 100644
index 0000000..8f24349
--- /dev/null
+++ b/c/src/lib/libcpu/i386/native/include/cpu-score-split.h
@@ -0,0 +1,62 @@
+/**
+ * @file
+ * 
+ * @brief Virtualized Sensitive Intel I386 CPU Dependent Source
+ * 
+ * This include file contains information for the virtualized i386
+ * architecture. 
+ */
+
+#ifndef _RTEMS_LIBCPU_CPU_H
+#define _RTEMS_LIBCPU_CPU_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/i386.h>
+
+
+
+#ifndef ASM
+/*
+ *  ISR handler macros
+ *
+ *  These macros perform the following functions:
+ *     + set a particular level
+ */
+
+
+#define _CPU_ISR_Set_level( _new_level ) \
+  { \
+    if ( _new_level ) __asm__ volatile ( "cli" ); \
+    else              __asm__ volatile ( "sti" ); \
+  }
+
+
+
+/*
+ *  Fatal Error manager macros
+ *
+ *  These macros perform the following functions:
+ *    + disable interrupts and halt the CPU
+ */
+
+#define _CPU_Fatal_halt( _error ) \
+  { \
+    __asm__ volatile ( "cli ; \
+                    movl %0,%%eax ; \
+                    hlt" \
+                    : "=r" ((_error)) : "0" ((_error)) \
+    ); \
+  }
+
+#endif /* ASM */  
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _RTEMS_LIBCPU_CPU_H */
diff --git a/c/src/lib/libcpu/i386/native/include/rtems/score/interrupts.h b/c/src/lib/libcpu/i386/native/include/rtems/score/interrupts.h
new file mode 100644
index 0000000..bed6330
--- /dev/null
+++ b/c/src/lib/libcpu/i386/native/include/rtems/score/interrupts.h
@@ -0,0 +1,81 @@
+/**
+ * @file
+ * 
+ * @brief Intel I386 Interrupt Macros
+ *
+ * Formerly contained in and extracted from libcpu/i386/cpu.h
+ */
+
+/*
+ *  COPYRIGHT (c) 1998 vale...@crf.canon.fr
+ *
+ *  The license and distribution terms for this file may be
+ *  found in the file LICENSE in this distribution or at
+ *  http://www.rtems.com/license/LICENSE.
+ *
+ *  Applications must not include this file directly.
+ */
+
+#ifndef _RTEMS_SCORE_INTERRUPTS_H
+#define _RTEMS_SCORE_INTERRUPTS_H
+
+#ifndef ASM
+
+struct 	__rtems_raw_irq_connect_data__;
+
+typedef void (*rtems_raw_irq_hdl)		(void);
+typedef void (*rtems_raw_irq_enable)		(const struct __rtems_raw_irq_connect_data__*);
+typedef void (*rtems_raw_irq_disable)		(const struct __rtems_raw_irq_connect_data__*);
+typedef int  (*rtems_raw_irq_is_enabled)	(const struct __rtems_raw_irq_connect_data__*);
+
+/**
+ * @name Interrupt Level Macros
+ * 
+ */
+/**@{**/
+
+#define i386_disable_interrupts( _level ) \
+  { \
+    __asm__ volatile ( "pushf ; \
+                    cli ; \
+                    pop %0" \
+                   : "=rm" ((_level)) \
+    ); \
+  }
+
+#define i386_enable_interrupts( _level )  \
+  { \
+    __asm__ volatile ( "push %0 ; \
+                    popf" \
+                    : : "rm" ((_level)) : "cc" \
+    ); \
+  }
+
+#define i386_flash_interrupts( _level ) \
+  { \
+    __asm__ volatile ( "push %0 ; \
+                    popf ; \
+                    cli" \
+                    : : "rm" ((_level)) : "cc" \
+    ); \
+  }
+
+#define i386_get_interrupt_level( _level ) \
+  do { \
+    register uint32_t   _eflags; \
+    \
+    __asm__ volatile ( "pushf ; \
+                    pop %0" \
+                    : "=rm" ((_eflags)) \
+    ); \
+    \
+    _level = (_eflags & EFLAGS_INTR_ENABLE) ? 0 : 1; \
+  } while (0)
+
+#define _CPU_ISR_Disable( _level ) i386_disable_interrupts( _level )
+#define _CPU_ISR_Enable( _level ) i386_enable_interrupts( _level )
+
+/** @} */
+
+#endif
+#endif
diff --git a/c/src/lib/libcpu/i386/preinstall.am b/c/src/lib/libcpu/i386/preinstall.am
index 6f4af52..c749294 100644
--- a/c/src/lib/libcpu/i386/preinstall.am
+++ b/c/src/lib/libcpu/i386/preinstall.am
@@ -13,6 +13,7 @@ all-am: $(PREINSTALL_FILES)
 PREINSTALL_FILES =
 CLEANFILES = $(PREINSTALL_FILES)
 
+if VIRT_POK
 $(PROJECT_INCLUDE)/libcpu/$(dirstamp):
 	@$(MKDIR_P) $(PROJECT_INCLUDE)/libcpu
 	@: > $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
@@ -34,3 +35,41 @@ $(PROJECT_INCLUDE)/libcpu/byteorder.h: byteorder.h $(PROJECT_INCLUDE)/libcpu/$(d
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/byteorder.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/byteorder.h
 
+$(PROJECT_INCLUDE)/libcpu/interrupts.h: virtual/include/rtems/score/interrupts.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/interrupts.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/interrupts.h
+
+$(PROJECT_INCLUDE)/libcpu/cpu-score-split.h: virtual/include/cpu-score-split.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/cpu-score-split.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/cpu-score-split.h
+
+else # native
+$(PROJECT_INCLUDE)/libcpu/$(dirstamp):
+	@$(MKDIR_P) $(PROJECT_INCLUDE)/libcpu
+	@: > $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
+PREINSTALL_DIRS += $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
+
+$(PROJECT_INCLUDE)/libcpu/cpu.h: cpu.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/cpu.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/cpu.h
+
+$(PROJECT_INCLUDE)/libcpu/cpuModel.h: cpuModel.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/cpuModel.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/cpuModel.h
+
+$(PROJECT_INCLUDE)/libcpu/cache.h: ../shared/include/cache.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/cache.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/cache.h
+
+$(PROJECT_INCLUDE)/libcpu/byteorder.h: byteorder.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/byteorder.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/byteorder.h
+
+$(PROJECT_INCLUDE)/libcpu/interrupts.h: native/include/rtems/score/interrupts.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/interrupts.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/interrupts.h
+
+$(PROJECT_INCLUDE)/libcpu/cpu-score-split.h: native/include/cpu-score-split.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/cpu-score-split.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/cpu-score-split.h
+endif
diff --git a/c/src/lib/libcpu/i386/virtual/cpu-score-split.c b/c/src/lib/libcpu/i386/virtual/cpu-score-split.c
new file mode 100644
index 0000000..9848d6f
--- /dev/null
+++ b/c/src/lib/libcpu/i386/virtual/cpu-score-split.c
@@ -0,0 +1,39 @@
+/**
+ *  @file
+ *
+ *  @brief Virtualization Sensitive Intel i386 Dependent Source
+ *
+ *  Part of cpu.c that must be replaced with a virtualization acceptable way to
+ *  idle. On i386 "hlt" is used, which is priviledged and causes a GPF.
+ */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#include <rtems/score/cpu.h>	// function definition
+#include <virtLayerCPU.h>
+
+
+/**
+ * @brief Idle thread executes idle operation
+ *
+ * If used in a virtualized environment, this executes a call to the
+ * virtualization layer.
+ */
+
+void *_CPU_Thread_Idle_body( uintptr_t ignored )
+{
+  while(1)
+  {
+    virt_idleThread();
+  }
+  return NULL;
+}
+
+
+#ifdef __cpluplus
+}
+#endif 
diff --git a/c/src/lib/libcpu/i386/virtual/include/cpu-score-split.h b/c/src/lib/libcpu/i386/virtual/include/cpu-score-split.h
new file mode 100644
index 0000000..605eaf3
--- /dev/null
+++ b/c/src/lib/libcpu/i386/virtual/include/cpu-score-split.h
@@ -0,0 +1,63 @@
+/**
+ * @file
+ * 
+ * @brief Virtualized Sensitive Intel I386 CPU Dependent Source
+ * 
+ * This include file contains information for the virtualized i386
+ * architecture. 
+ *
+ * Author:  Philipp Eppelt
+ * Date:    06/19/2013
+ */
+
+#ifndef _RTEMS_LIBCPU_CPU_H
+#define _RTEMS_LIBCPU_CPU_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/i386.h>
+#include <virtLayerCPU.h>
+
+
+
+#ifndef ASM
+/*
+ *  ISR handler macros
+ *
+ *  These macros perform the following functions:
+ *     + set a particular level
+ */
+
+
+#define _CPU_ISR_Set_level( _new_level ) \
+  { \
+    if ( _new_level ) virt_closeInterrupts();  \
+    else              virt_openInterrupts(); \
+  }
+
+
+
+/*
+ *  Fatal Error manager macros
+ *
+ *  These macros perform the following functions:
+ *    + disable interrupts and halt the CPU
+ */
+
+#define _CPU_Fatal_halt( _error ) \
+  { \
+    virt_closeInterrupts(); \
+    virt_execStopError( _error ); \
+  }
+
+#endif /* ASM */  
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _RTEMS_LIBCPU_CPU_H */
diff --git a/c/src/lib/libcpu/i386/virtual/include/rtems/score/interrupts.h b/c/src/lib/libcpu/i386/virtual/include/rtems/score/interrupts.h
new file mode 100644
index 0000000..522306a
--- /dev/null
+++ b/c/src/lib/libcpu/i386/virtual/include/rtems/score/interrupts.h
@@ -0,0 +1,67 @@
+/**
+ * @file
+ * 
+ * @brief Intel I386 Interrupt Macros
+ *
+ * Formerly contained in and extracted from libcpu/i386/cpu.h
+ */
+
+/*
+ *  COPYRIGHT (c) 1998 vale...@crf.canon.fr
+ *
+ *  The license and distribution terms for this file may be
+ *  found in the file LICENSE in this distribution or at
+ *  http://www.rtems.com/license/LICENSE.
+ *
+ *  Applications must not include this file directly.
+ */
+
+#ifndef _RTEMS_SCORE_INTERRUPTS_H
+#define _RTEMS_SCORE_INTERRUPTS_H
+
+#ifndef ASM
+
+struct 	__rtems_raw_irq_connect_data__;
+
+typedef void (*rtems_raw_irq_hdl)		(void);
+typedef void (*rtems_raw_irq_enable)		(const struct __rtems_raw_irq_connect_data__*);
+typedef void (*rtems_raw_irq_disable)		(const struct __rtems_raw_irq_connect_data__*);
+typedef int  (*rtems_raw_irq_is_enabled)	(const struct __rtems_raw_irq_connect_data__*);
+
+#include <virtLayerCPU.h>
+
+
+/**
+ * @name Interrupt Level Macros
+ * 
+ */
+/**@{**/
+
+#define i386_disable_interrupts( _level ) \
+  { \
+    virt_disableInterrupts( _level ); \
+  }
+
+#define i386_enable_interrupts( _level )  \
+  { \
+    virt_enableInterrupts( _level ); \
+  }
+
+#define i386_flash_interrupts( _level ) \
+  { \
+    virt_enableInterrupts(_level); \
+    virt_disableInterrupts(_level); \
+  }
+
+#define i386_get_interrupt_level( _level ) \
+  { \
+    virt_getInterruptLevel( _level ); \
+  }
+
+#define _CPU_ISR_Disable( _level ) i386_disable_interrupts( _level )
+#define _CPU_ISR_Enable( _level ) i386_enable_interrupts( _level )
+
+/** @} */
+
+#endif
+#endif
_______________________________________________
rtems-devel mailing list
rtems-devel@rtems.org
http://www.rtems.org/mailman/listinfo/rtems-devel

Reply via email to