Subversion Repositories HelenOS

Rev

Rev 2300 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2300 Rev 2304
Line 52... Line 52...
52
 
52
 
53
bootinfo_t bootinfo;
53
bootinfo_t bootinfo;
54
// // uintptr_t supervisor_sp /*__attribute__ ((section (".text")))*/;
54
// // uintptr_t supervisor_sp /*__attribute__ ((section (".text")))*/;
55
extern uintptr_t supervisor_sp;
55
extern uintptr_t supervisor_sp;
56
 
56
 
57
//TODO: Remove include and move into exceptio.c
-
 
58
#include <arch/exception.h>
-
 
59
 
-
 
60
#include <syscall/syscall.h>
-
 
61
void tmp_swi_exception(int exc_no, istate_t* istate);
-
 
62
void tmp_swi_exception(int exc_no, istate_t* istate)
-
 
63
{
-
 
64
    ASSERT(exc_no == EXC_SWI);
-
 
65
    ASSERT(istate);
-
 
66
    // TODO: Alf ... remove aftet swi_exception is tested
-
 
67
    dprintf("\nSWI - istate dump input :\n");
-
 
68
    dprintf("    r0:%X    r1:%X    r2:%X    r3:%X\n", istate->r0,  istate->r1, istate->r2,  istate->r3);
-
 
69
    dprintf("    r4:%X    r5:%X    r6:%X    r7:%X\n", istate->r4,  istate->r5, istate->r6,  istate->r7);
-
 
70
    dprintf("    r8:%X    r8:%X   r10:%X   r11:%X\n", istate->r8,  istate->r9, istate->r10, istate->r11);
-
 
71
    dprintf("   r12:%X    r13:%X    lr:%X  spsr:%X\n", istate->r12, istate->sp, istate->lr,  istate->spsr);
-
 
72
//  dprintf("   prev_lr:%X    prev_sp:%X\n", istate->r12, istate->prev_lr, istate->prev_sp);
-
 
73
    // call kernel to serve syscall
-
 
74
    istate->r0 = syscall_handler(
-
 
75
        istate->r0,
-
 
76
        istate->r1,
-
 
77
        istate->r2,
-
 
78
        istate->r3,
-
 
79
        istate->r4);
-
 
80
 
-
 
81
    // TODO: Alf ... remove aftet swi_exception is tested
-
 
82
    dprintf("\nSWI - Istate dump after :\n");
-
 
83
    dprintf("    r0:%X    r1:%X    r2:%X    r3:%X\n", istate->r0,  istate->r1, istate->r2,  istate->r3);
-
 
84
    dprintf("    r4:%X    r5:%X    r6:%X    r7:%X\n", istate->r4,  istate->r5, istate->r6,  istate->r7);
-
 
85
    dprintf("    r8:%X    r8:%X   r10:%X   r11:%X\n", istate->r8,  istate->r9, istate->r10, istate->r11);
-
 
86
    dprintf("   r12:%X    r13:%X    lr:%X  spsr:%X\n", istate->r12, istate->sp, istate->lr,  istate->spsr);
-
 
87
//  dprintf("   prev_lr:%X    prev_sp:%X\n", istate->r12, istate->prev_lr, istate->prev_sp);
-
 
88
}
-
 
89
 
-
 
90
 
-
 
91
void arch_pre_main(void)
57
void arch_pre_main(void)
92
{
58
{
93
    int i;
59
    int i;
94
 
60
 
95
    init.cnt = bootinfo.cnt;
61
    init.cnt = bootinfo.cnt;
Line 124... Line 90...
124
    console_init(device_assign_devno());
90
    console_init(device_assign_devno());
125
   
91
   
126
    //fb_init(0x12000000, 640, 480, 1920, VISUAL_RGB_8_8_8);
92
    //fb_init(0x12000000, 640, 480, 1920, VISUAL_RGB_8_8_8);
127
   
93
   
128
    interrupts_enable();
94
    interrupts_enable();
-
 
95
 
129
}
96
}
130
 
97
 
131
void arch_post_cpu_init(void)
98
void arch_post_cpu_init(void)
132
{
99
{
133
    /* TODO */
100
    /* TODO */
Line 186... Line 153...
186
    "ldr pc, =0x7000000"
153
    "ldr pc, =0x7000000"
187
 );
154
 );
188
 
155
 
189
}
156
}
190
 
157
 
191
/** Change processor mode and jump into addres specified in
158
/** Changes processor mode and jumps to the address specified in the first parameter.
192
 *  kernel_uarg.uspace_entry
159
 *
193
 * \param kernel_uarg information needed for correct setting of userspace
160
 *  \param kernel_uarg   userspace settings (entry point, stack, ...)
194
 */
161
 */
195
void userspace(uspace_arg_t *kernel_uarg)
162
void userspace(uspace_arg_t *kernel_uarg)
196
{
163
{
197
    dprintf("userspace\n");
-
 
198
 
-
 
199
    dprintf("userspce krnl_uard  .uspace_uarg(%X), .uspace_entry(%X), .uspace_stack(%X)\n",
164
    dprintf("Userspace:  .uspace_uarg(%X), .uspace_entry(%X), .uspace_stack(%X)\n",
200
      (unsigned int)(kernel_uarg->uspace_uarg),
165
        (unsigned int)(kernel_uarg->uspace_uarg), kernel_uarg->uspace_entry,
201
      kernel_uarg->uspace_entry,
-
 
202
      kernel_uarg->uspace_stack);
166
        kernel_uarg->uspace_stack);
203
 
167
 
204
        volatile ustate_t ustate;
168
    volatile ustate_t ustate;
205
 
169
 
206
    //Step 1 ... prepare user space environment
-
 
207
    //set first paramater
170
    // set first parameter
208
    ustate.r0 = (uintptr_t) kernel_uarg->uspace_uarg;
171
    ustate.r0 = (uintptr_t) kernel_uarg->uspace_uarg;
209
 
172
 
210
    //clear other registers
173
    // clear other registers
211
    ustate.r1 = ustate.r2  = ustate.r3  = ustate.r4  =
174
    ustate.r1 = ustate.r2  = ustate.r3  = ustate.r4  =
212
        ustate.r5 = ustate.r6  = ustate.r7  = ustate.r8  =
175
        ustate.r5 = ustate.r6  = ustate.r7  = ustate.r8  =
213
        ustate.r9 = ustate.r10 = ustate.r11 = ustate.r12 = 1;
176
        ustate.r9 = ustate.r10 = ustate.r11 = ustate.r12 = 1;
214
        ustate.lr = 3;
-
 
215
 
177
 
216
    //set user stack
178
    ustate.lr = 3;
217
        ustate.sp = ((uint32_t)kernel_uarg->uspace_stack)+PAGE_SIZE;
-
 
218
 
179
 
219
    //set where uspace executin starts
180
    //set user stack
220
        ustate.pc = (uintptr_t) kernel_uarg->uspace_entry;
181
    ustate.sp = ((uint32_t)kernel_uarg->uspace_stack) + PAGE_SIZE;
221
 
182
 
-
 
183
    //set where uspace execution starts
-
 
184
    ustate.pc = (uintptr_t) kernel_uarg->uspace_entry;
222
 
185
 
223
    //status register in user mode
186
    //status register in user mode
224
    ipl_t cpsr = current_status_reg_read();
187
    ipl_t cpsr = current_status_reg_read();
225
        cpsr &= ~STATUS_REG_MODE_MASK | USER_MODE;
188
    cpsr &= ~STATUS_REG_MODE_MASK | USER_MODE;
226
   
189
   
227
    ipl_t tmpsr = (cpsr & ~STATUS_REG_MODE_MASK) | SUPERVISOR_MODE;
190
    ipl_t tmpsr = (cpsr & ~STATUS_REG_MODE_MASK) | SUPERVISOR_MODE;
228
 
191
 
229
    asm __volatile__ (
192
    asm __volatile__ (
230
        // save pointer into ustate struct
193
        // save pointer into ustate struct