Rev 577 | Rev 938 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 577 | Rev 919 | ||
---|---|---|---|
Line 29... | Line 29... | ||
29 | #include <arch.h> |
29 | #include <arch.h> |
30 | #include <arch/ski/ski.h> |
30 | #include <arch/ski/ski.h> |
31 | #include <arch/drivers/it.h> |
31 | #include <arch/drivers/it.h> |
32 | #include <arch/interrupt.h> |
32 | #include <arch/interrupt.h> |
33 | #include <arch/barrier.h> |
33 | #include <arch/barrier.h> |
- | 34 | #include <arch/asm.h> |
|
- | 35 | #include <arch/register.h> |
|
34 | #include <arch/types.h> |
36 | #include <arch/types.h> |
35 | - | ||
- | 37 | #include <arch/context.h> |
|
- | 38 | #include <arch/mm/page.h> |
|
- | 39 | #include <mm/as.h> |
|
- | 40 | #include <config.h> |
|
- | 41 | #include <userspace.h> |
|
36 | #include <console/console.h> |
42 | #include <console/console.h> |
37 | 43 | ||
38 | void arch_pre_mm_init(void) |
44 | void arch_pre_mm_init(void) |
39 | { |
45 | { |
40 | /* Set Interruption Vector Address (i.e. location of interruption vector table). */ |
46 | /* Set Interruption Vector Address (i.e. location of interruption vector table). */ |
41 | iva_write((__address) &ivt); |
47 | iva_write((__address) &ivt); |
42 | srlz_d(); |
48 | srlz_d(); |
43 | 49 | ||
44 | ski_init_console(); |
50 | ski_init_console(); |
45 | it_init(); |
51 | it_init(); |
- | 52 | config.init_addr = INIT_ADDRESS; |
|
- | 53 | config.init_size = INIT_SIZE; |
|
46 | } |
54 | } |
47 | 55 | ||
48 | void arch_post_mm_init(void) |
56 | void arch_post_mm_init(void) |
49 | { |
57 | { |
50 | } |
58 | } |
51 | 59 | ||
52 | void arch_pre_smp_init(void) |
60 | void arch_pre_smp_init(void) |
53 | { |
61 | { |
54 | } |
62 | } |
55 | 63 | ||
56 | - | ||
57 | void arch_post_smp_init(void) |
64 | void arch_post_smp_init(void) |
58 | { |
65 | { |
59 | } |
66 | } |
- | 67 | ||
- | 68 | /** Enter userspace and never return. */ |
|
- | 69 | void userspace(void) |
|
- | 70 | { |
|
- | 71 | psr_t psr; |
|
- | 72 | rsc_t rsc; |
|
- | 73 | ||
- | 74 | psr.value = psr_read(); |
|
- | 75 | psr.cpl = PL_USER; |
|
- | 76 | psr.i = true; /* start with interrupts enabled */ |
|
- | 77 | psr.ic = true; |
|
- | 78 | psr.ri = 0; /* start with instruction #0 */ |
|
- | 79 | ||
- | 80 | __asm__ volatile ("mov %0 = ar.rsc\n" : "=r" (rsc.value)); |
|
- | 81 | rsc.loadrs = 0; |
|
- | 82 | rsc.be = false; |
|
- | 83 | rsc.pl = PL_USER; |
|
- | 84 | rsc.mode = 3; /* eager mode */ |
|
- | 85 | ||
- | 86 | switch_to_userspace(UTEXT_ADDRESS, USTACK_ADDRESS+PAGE_SIZE-1, USTACK_ADDRESS, psr.value, rsc.value); |
|
- | 87 | ||
- | 88 | while (1) { |
|
- | 89 | ; |
|
- | 90 | } |
|
- | 91 | } |