summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/i386
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2000-06-13 21:53:38 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2000-06-13 21:53:38 +0000
commitcf1f72ea339287cf6f780b2e34b8092ce08da6b0 (patch)
tree3b6eee762364ef5304ebae3bf5da4e9296eafa29 /c/src/lib/libcpu/i386
parentAdded .cvsignore. (diff)
downloadrtems-cf1f72ea339287cf6f780b2e34b8092ce08da6b0.tar.bz2
Moved i386 and m68k cache management code to libcpu. Everything
now is an implementation of the prototypes in rtems/rtems/cache.h. The libcpu/i386/wrapup directory is no longer needed. The PowerPC needs this done to it.
Diffstat (limited to 'c/src/lib/libcpu/i386')
-rw-r--r--c/src/lib/libcpu/i386/Makefile.am28
-rw-r--r--c/src/lib/libcpu/i386/cache.c99
-rw-r--r--c/src/lib/libcpu/i386/cache_.h16
-rw-r--r--c/src/lib/libcpu/i386/idtr.S (renamed from c/src/lib/libcpu/i386/cpu_asm.S)0
4 files changed, 127 insertions, 16 deletions
diff --git a/c/src/lib/libcpu/i386/Makefile.am b/c/src/lib/libcpu/i386/Makefile.am
index 90e2d0bc8b..361711a181 100644
--- a/c/src/lib/libcpu/i386/Makefile.am
+++ b/c/src/lib/libcpu/i386/Makefile.am
@@ -5,15 +5,15 @@
AUTOMAKE_OPTIONS = foreign 1.4
ACLOCAL_AMFLAGS = -I $(RTEMS_TOPdir)/aclocal
-LIBNAME = libcpu
-LIB = $(ARCH)/$(LIBNAME).a
+VPATH = @srcdir@:@srcdir@/../shared/src
-C_FILES = cpu.c displayCpu.c page.c
+C_FILES = cache.c cache_aligned_malloc.c cache_manager.c displayCpu.c idt.c page.c
C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o)
-H_FILES = cpu.h registers.h cpuModel.h
+H_FILES = cache_.h
+INSTALLED_H_FILES = cpu.h registers.h cpuModel.h
-S_FILES = cpu_asm.S cpuModel.S
+S_FILES = cpuModel.S idtr.S
S_O_FILES = $(S_FILES:%.S=$(ARCH)/%.o)
OBJS = $(C_O_FILES) $(S_O_FILES)
@@ -21,8 +21,7 @@ OBJS = $(C_O_FILES) $(S_O_FILES)
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
include $(top_srcdir)/../../../../../automake/lib.am
-$(LIB): $(OBJS)
- $(make-library)
+AM_CPPFLAGS += -I$(srcdir)
$(PROJECT_INCLUDE)/libcpu:
$(mkinstalldirs) $@
@@ -30,19 +29,16 @@ $(PROJECT_INCLUDE)/libcpu:
$(PROJECT_INCLUDE)/libcpu/%.h: %.h
$(INSTALL_DATA) $< $@
-$(PROJECT_RELEASE)/lib/$(LIBNAME)$(LIB_VARIANT).a: $(LIB)
+$(PROJECT_INCLUDE)/libcpu/cache.h: $(top_srcdir)/../shared/include/cache.h
$(INSTALL_DATA) $< $@
PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu \
- $(H_FILES:%=$(PROJECT_INCLUDE)/libcpu/%)
+ $(PROJECT_INCLUDE)/libcpu/cache.h \
+ $(INSTALLED_H_FILES:%=$(PROJECT_INCLUDE)/libcpu/%)
-TMPINSTALL_FILES += $(PROJECT_RELEASE)/lib/$(LIBNAME)$(LIB_VARIANT).a
+all-local: $(ARCH) $(PREINSTALL_FILES) $(OBJS)
-all-local: $(ARCH) $(PREINSTALL_FILES) $(OBJS) $(LIB) $(TMPINSTALL_FILES)
-
-.PRECIOUS: $(LIB)
-
-EXTRA_DIST = cpu.c cpu.h cpuModel.S cpuModel.h cpu_asm.S displayCpu.c page.c \
- registers.h
+EXTRA_DIST = cache.c cache_.h cpu.h cpuModel.S cpuModel.h \
+ displayCpu.c idt.c idtr.S page.c registers.h
include $(top_srcdir)/../../../../../automake/local.am
diff --git a/c/src/lib/libcpu/i386/cache.c b/c/src/lib/libcpu/i386/cache.c
new file mode 100644
index 0000000000..f462b58a1b
--- /dev/null
+++ b/c/src/lib/libcpu/i386/cache.c
@@ -0,0 +1,99 @@
+/*
+ * Cache Management Support Routines for the i386
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <libcpu/registers.h>
+#include "cache_.h"
+
+void _CPU_disable_cache() {
+ cr0 regCr0;
+
+ regCr0.i = i386_get_cr0();
+ regCr0.cr0.page_level_cache_disable = 1;
+ regCr0.cr0.no_write_through = 1;
+ i386_set_cr0( regCr0.i );
+ rtems_flush_entire_data_cache();
+}
+
+/*
+ * Enable the entire cache
+ */
+
+void _CPU_enable_cache() {
+ cr0 regCr0;
+
+ regCr0.i = i386_get_cr0();
+ regCr0.cr0.page_level_cache_disable = 0;
+ regCr0.cr0.no_write_through = 0;
+ i386_set_cr0( regCr0.i );
+ /*rtems_flush_entire_data_cache();*/
+}
+
+/*
+ * CACHE MANAGER: The following functions are CPU-specific.
+ * They provide the basic implementation for the rtems_* cache
+ * management routines. If a given function has no meaning for the CPU,
+ * it does nothing by default.
+ *
+ * FIXME: Definitions for I386_CACHE_ALIGNMENT are missing above for
+ * each CPU. The routines below should be implemented per CPU,
+ * to accomodate the capabilities of each.
+ */
+
+/* FIXME: I don't belong here. */
+#define I386_CACHE_ALIGNMENT 16
+
+#if defined(I386_CACHE_ALIGNMENT)
+#define _CPU_DATA_CACHE_ALIGNMENT I386_CACHE_ALIGNMENT
+#define _CPU_INST_CACHE_ALIGNEMNT I386_CACHE_ALIGNMENT
+
+void _CPU_flush_1_data_cache_line(const void *d_addr) {}
+void _CPU_invalidate_1_data_cache_line(const void *d_addr) {}
+void _CPU_freeze_data_cache(void) {}
+void _CPU_unfreeze_data_cache(void) {}
+void _CPU_invalidate_1_inst_cache_line ( const void *d_addr ) {}
+void _CPU_freeze_inst_cache(void) {}
+void _CPU_unfreeze_inst_cache(void) {}
+
+void _CPU_flush_entire_data_cache(
+ const void * d_addr
+)
+{
+ asm volatile ("wbinvd");
+}
+void _CPU_invalidate_entire_data_cache(
+ const void * d_addr
+)
+{
+ asm volatile ("invd");
+}
+
+void _CPU_enable_data_cache(void)
+{
+ _CPU_enable_cache();
+}
+
+void _CPU_disable_data_cache(void)
+{
+ _CPU_disable_cache();
+}
+
+void _CPU_invalidate_entire_inst_cache(void)
+{
+ asm volatile ("invd");
+}
+
+void _CPU_enable_inst_cache(void)
+{
+ _CPU_enable_cache();
+}
+
+void _CPU_disable_inst_cache( void )
+{
+ _CPU_disable_cache();
+}
+#endif
+
diff --git a/c/src/lib/libcpu/i386/cache_.h b/c/src/lib/libcpu/i386/cache_.h
new file mode 100644
index 0000000000..03ad537025
--- /dev/null
+++ b/c/src/lib/libcpu/i386/cache_.h
@@ -0,0 +1,16 @@
+/*
+ * i386 Cache Manager Wrapper
+ */
+
+#ifndef __i386_CACHE_h
+#define __i386_CACHE_h
+
+#define I386_CACHE_ALIGNMENT 16
+#define _CPU_DATA_CACHE_ALIGNMENT I386_CACHE_ALIGNMENT
+#define _CPU_INST_CACHE_ALIGNEMNT I386_CACHE_ALIGNMENT
+
+#include <libcpu/cache_.h>
+
+#endif
+/* end of include file */
+
diff --git a/c/src/lib/libcpu/i386/cpu_asm.S b/c/src/lib/libcpu/i386/idtr.S
index 38dc7318ae..38dc7318ae 100644
--- a/c/src/lib/libcpu/i386/cpu_asm.S
+++ b/c/src/lib/libcpu/i386/idtr.S