use defines from processor header
[AROS.git] / arch / arm-raspi / kernel / kernel_intern.h
blob6fde6845dc05455102ecfe7bddbce955ad3caa0f
1 /*
2 Copyright © 2013, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #ifndef KERNEL_INTERN_H_
7 #define KERNEL_INTERN_H_
9 #include <aros/libcall.h>
10 #include <inttypes.h>
11 #include <exec/lists.h>
12 #include <exec/execbase.h>
13 #include <exec/memory.h>
14 #include <utility/tagitem.h>
15 #include <stdio.h>
16 #include <stdarg.h>
18 #include <asm/bcm2835.h>
20 #undef KernelBase
23 // Enable support for paging memory to media..
24 #define RASPI_VIRTMEMSUPPORT
27 /* Use system timer 3 for our scheduling heartbeat */
28 #define VBLANK_TIMER 3
29 #define VBLANK_INTERVAL (1000000 / 50)
31 #define KERNEL_PHYS_BASE 0x07800000
32 #define KERNEL_VIRT_BASE 0xff800000
34 #define VFPEnable 0x40000000
35 #define VFPSingle 0x300000
36 #define VFPDouble 0xC00000
38 void core_SetupMMU(void);
39 void core_SetupIntr(void);
41 void *KrnAddSysTimerHandler(struct KernelBase *);
43 intptr_t krnGetTagData(Tag tagValue, intptr_t defaultVal, const struct TagItem *tagList);
44 struct TagItem *krnFindTagItem(Tag tagValue, const struct TagItem *tagList);
45 struct TagItem *krnNextTagItem(const struct TagItem **tagListPtr);
47 struct KernelBase *getKernelBase();
49 #ifdef bug
50 #undef bug
51 #endif
52 #ifdef D
53 #undef D
54 #endif
55 #define D(x) x
57 #define __STR(x) #x
58 #define STR(x) __STR(x)
60 AROS_LD2(int, KrnBug,
61 AROS_LDA(const char *, format, A0),
62 AROS_LDA(va_list, args, A1),
63 struct KernelBase *, KernelBase, 12, Kernel);
65 static inline void bug(const char *format, ...)
67 struct KernelBase *kbase = getKernelBase();
68 va_list args;
69 va_start(args, format);
70 AROS_SLIB_ENTRY(KrnBug, Kernel, 12)(format, args, kbase);
71 va_end(args);
74 #define VECTCOMMON_START \
75 " sub sp, sp, #4*4 \n" \
76 " stmfd sp!, {r0-r12} \n" \
77 " mov r0, sp \n" \
78 " mrs r1, spsr \n" \
79 " str r1, [r0, #16*4] \n" \
80 " str lr, [r0, #15*4] \n"
82 #define VECTCOMMON_END \
83 " add r1, sp, #13*4 \n" \
84 " ldm r1, {sp}^ \n" \
85 " add r1, sp, #14*4 \n" \
86 " ldm r1, {lr}^ \n" \
87 " ldr lr, [sp, #15*4] \n" \
88 " ldr r1, [sp, #16*4] \n" \
89 " msr spsr, r1 \n" \
90 " ldmfd sp!, {r0-r12} \n" \
91 " add sp, sp, #4*4 \n" \
92 " movs pc, lr \n"
94 #define STORE_TASKSTATE(task, regs) \
95 struct ExceptionContext *ctx = task->tc_UnionETask.tc_ETask->et_RegFrame; \
96 int __task_reg_no; \
97 for (__task_reg_no = 0; __task_reg_no < 12; __task_reg_no++) \
98 { \
99 ctx->r[__task_reg_no] = ((uint32_t *)regs)[__task_reg_no]; \
101 ctx->ip = ((uint32_t *)regs)[12]; \
102 ctx->sp = task->tc_SPReg = ((uint32_t *)regs)[13]; \
103 ctx->lr = ((uint32_t *)regs)[14]; \
104 ctx->pc = ((uint32_t *)regs)[15]; \
105 ctx->cpsr = ((uint32_t *)regs)[16];
107 #define RESTORE_TASKSTATE(task, regs) \
108 struct ExceptionContext *ctx = task->tc_UnionETask.tc_ETask->et_RegFrame; \
109 int __task_reg_no; \
110 for (__task_reg_no = 0; __task_reg_no < 12; __task_reg_no++) \
112 ((uint32_t *)regs)[__task_reg_no] = ctx->r[__task_reg_no]; \
114 ((uint32_t *)regs)[12] = ctx->ip; \
115 ((uint32_t *)regs)[13] = ctx->sp = task->tc_SPReg; \
116 ((uint32_t *)regs)[14] = ctx->lr; \
117 ((uint32_t *)regs)[15] = ctx->pc; \
118 ((uint32_t *)regs)[16] = ctx->cpsr;
120 #endif /*KERNEL_INTERN_H_*/