Date:2013-05-12 15:46:11 (10 years 10 months ago)
Author:Bas Wijnen
Commit:b06e011a077a5df20e0f856d2598e70ca3496cb5
Message:Make it compile again; fixed poweroff problem

Files: .gitignore (1 diff)
Makefile.am (7 diffs)
alloc.ccp (1 diff)
mips/arch.ccp (2 diffs)
mips/arch.hhp (2 diffs)
mips/entry.S (2 diffs)
mips/init.ccp (3 diffs)
mips/interrupts.ccp (3 diffs)
mips/nanonote/board.ccp (5 diffs)
mips/start.S (1 diff)
panic.ccp (1 diff)
schedule.ccp (1 diff)
source/alarm.ccp (2 diffs)
source/rtc.ccp (2 diffs)
source/sdmmc.ccp (2 diffs)
source/udc.ccp (2 diffs)

Change Details

.gitignore
99source/charset.data
1010mips/nanonote/sdram-setup.raw
1111nanonote-boot
12mips/nanonote/server/.deps/
13mips/nanonote/server/Makefile
14mips/nanonote/server/Makefile.in
15mips/nanonote/server/aclocal.m4
16mips/nanonote/server/autom4te.cache/
17mips/nanonote/server/config.log
18mips/nanonote/server/config.status
19mips/nanonote/server/configure
20mips/nanonote/server/depcomp
21mips/nanonote/server/install-sh
22mips/nanonote/server/missing
12.deps/
13.dirstamp
14mips/.dirstamp
15source/.dirstamp
16Makefile
17Makefile.in
18aclocal.m4
19autom4te.cache/
20config.log
21config.status
22configure
23depcomp
24install-sh
25missing
2326mips/nanonote/server/usb-server
27mips/start-hack.S
28threadlist.S
29native/usb-server
2430fs/
2531iris-sd.tar
2632unbrick
Makefile.am
2424junk = mdebug.abi32 reginfo comment pdr note.gnu.build-id
2525objcopyflags = -S $(addprefix --remove-section=.,$(junk))
2626
27start_load = 0x80400000
27start_load = 0x80003000
2828load = 0x80000000
2929
3030noinst_DATA = iris.raw mips/start.raw mips/start-hack.S mips/nanonote/sdram-setup.raw
...... 
3838boot_threads = udc
3939else
4040if UNBRICK
41boot_threads = nand sdmmc usbmassstorage
41boot_threads = sdmmc usbmassstorage
4242else
4343boot_threads = sdmmc partition fat
44noinst_DATA += iris.tar.gz
4445endif
4546endif
4647
...... 
6768mips_nanonote_sdram_setup_elf_SOURCES = mips/nanonote/sdram-setup.cc
6869
6970program_targets = \
71    source/alarm.elf \
72    source/ball.elf \
73    source/boot.elf \
74    source/booter.elf \
75    source/bootinit.elf \
76    source/bsquare.elf \
77    source/buzzer.elf \
78    source/elfrun.elf \
79    source/fat.elf \
80    source/font.elf \
81    source/gpio.elf \
82    source/gui.elf \
83    source/init.elf \
84    source/lcd.elf \
85    source/metronome.elf \
86    source/nand.elf \
87    source/partition.elf \
88    source/rtc.elf \
89    source/sdmmc.elf \
90    source/test.elf \
91    source/udc.elf \
92    source/usbmassstorage.elf
93
94fs_targets = \
7095    fs/alarm.elf \
7196    fs/ball.elf \
7297    fs/boot.elf \
...... 
91116    fs/usbmassstorage.elf
92117
93118noinst_PROGRAMS += $(program_targets)
119noinst_DATA += $(fs_targets)
94120AM_CPPFLAGS = -O5 -fno-inline -I. -I./mips -I./mips/nanonote -Wa,-mips32 -DNANONOTE
95121AM_CXXFLAGS = -Wno-unused-parameter -fno-strict-aliasing -fno-builtin -ggdb3
96122AM_LDFLAGS = -nostdlib
...... 
113139fs/%: %
114140    ln -s ../$< $@
115141
116fs_alarm_elf_SOURCES = source/crt0.cc source/alarm.cc ${headers}
117fs_ball_elf_SOURCES = source/crt0.cc source/ball.cc ${headers}
118fs_boot_elf_SOURCES = source/crt0.cc source/boot.cc ${headers}
119fs_booter_elf_SOURCES = source/crt0.cc source/booter.cc ${headers}
120fs_bootinit_elf_SOURCES = source/crt0.cc source/bootinit.cc ${headers}
121fs_bsquare_elf_SOURCES = source/crt0.cc source/bsquare.cc ${headers}
122fs_buzzer_elf_SOURCES = source/crt0.cc source/buzzer.cc ${headers}
123fs_elfrun_elf_SOURCES = source/crt0.cc source/elfrun.cc ${headers}
124fs_fat_elf_SOURCES = source/crt0.cc source/fat.cc ${headers}
125fs_font_elf_SOURCES = source/crt0.cc source/font.cc ${headers}
126fs_gpio_elf_SOURCES = source/crt0.cc source/gpio.cc ${headers}
127fs_gui_elf_SOURCES = source/crt0.cc source/gui.cc ${headers}
128fs_init_elf_SOURCES = source/crt0.cc source/init.cc ${headers}
129fs_lcd_elf_SOURCES = source/crt0.cc source/lcd.cc ${headers}
130fs_metronome_elf_SOURCES = source/crt0.cc source/metronome.cc ${headers}
131fs_nand_elf_SOURCES = source/crt0.cc source/nand.cc ${headers}
132fs_partition_elf_SOURCES = source/crt0.cc source/partition.cc ${headers}
133fs_rtc_elf_SOURCES = source/crt0.cc source/rtc.cc ${headers}
134fs_sdmmc_elf_SOURCES = source/crt0.cc source/sdmmc.cc ${headers}
135fs_test_elf_SOURCES = source/crt0.cc source/test.cc ${headers}
136fs_udc_elf_SOURCES = source/crt0.cc source/udc.cc ${headers}
137fs_usbmassstorage_elf_SOURCES = source/crt0.cc source/usbmassstorage.cc ${headers}
142fs/%.elf: source/%.elf
143    $(OBJCOPY) -S $< $@
144
145source_alarm_elf_SOURCES = source/crt0.cc source/alarm.cc ${headers}
146source_ball_elf_SOURCES = source/crt0.cc source/ball.cc ${headers}
147source_boot_elf_SOURCES = source/crt0.cc source/boot.cc ${headers}
148source_booter_elf_SOURCES = source/crt0.cc source/booter.cc ${headers}
149source_bootinit_elf_SOURCES = source/crt0.cc source/bootinit.cc ${headers}
150source_bsquare_elf_SOURCES = source/crt0.cc source/bsquare.cc ${headers}
151source_buzzer_elf_SOURCES = source/crt0.cc source/buzzer.cc ${headers}
152source_elfrun_elf_SOURCES = source/crt0.cc source/elfrun.cc ${headers}
153source_fat_elf_SOURCES = source/crt0.cc source/fat.cc ${headers}
154source_font_elf_SOURCES = source/crt0.cc source/font.cc ${headers}
155source_gpio_elf_SOURCES = source/crt0.cc source/gpio.cc ${headers}
156source_gui_elf_SOURCES = source/crt0.cc source/gui.cc ${headers}
157source_init_elf_SOURCES = source/crt0.cc source/init.cc ${headers}
158source_lcd_elf_SOURCES = source/crt0.cc source/lcd.cc ${headers}
159source_metronome_elf_SOURCES = source/crt0.cc source/metronome.cc ${headers}
160source_nand_elf_SOURCES = source/crt0.cc source/nand.cc ${headers}
161source_partition_elf_SOURCES = source/crt0.cc source/partition.cc ${headers}
162source_rtc_elf_SOURCES = source/crt0.cc source/rtc.cc ${headers}
163source_sdmmc_elf_SOURCES = source/crt0.cc source/sdmmc.cc ${headers}
164source_test_elf_SOURCES = source/crt0.cc source/test.cc ${headers}
165source_udc_elf_SOURCES = source/crt0.cc source/udc.cc ${headers}
166source_usbmassstorage_elf_SOURCES = source/crt0.cc source/usbmassstorage.cc ${headers}
138167
139168server:
140169    test -e native/Makefile || native/autogen.sh
...... 
146175    native/usb-server
147176    echo 'reboot $(start_load) 0x$(shell /bin/sh -c '$(OBJDUMP) -t mips/start.elf | grep __start$$ | cut -b1-8') mips/start.raw' | nc localhost 5050
148177
178# SD boot stuff
179iris.tar.gz: mips/start.raw.gz mips/start.elf $(fs_targets) fs/init.config fs/font.dat
180    test -d fs/boot || mkdir fs/boot
181    mkimage -A mips -T kernel -a $(start_load) -e $(shell /bin/sh -c '$(OBJDUMP) -t mips/start.elf | grep __start$$ | cut -b1-8') -n Iris -d mips/start.raw.gz fs/boot/uImage | sed -e 's/:/;/g'
182    cd fs && tar czvf ../$@ --dereference *
183%.gz: %
184    gzip < $< > $@
185
149186sources = \
150187    source/alarm.cc \
151188    source/ball.cc \
...... 
170207    source/udc.cc \
171208    source/usbmassstorage.cc
172209
210debug:
211    stty -F $(SERIAL) 57600 raw
212    cat $(SERIAL)
213
173214autoclean: maintainer-clean
174215    $(MAKE) -C native autoclean
175216    rm -rf aclocal.m4 configure depcomp fs install-sh iris.raw iris-sd.tar Makefile.in missing $(iris_sources) $(boot_sources) $(sources) $(headers) mips/start-hack.S mips/start.raw
alloc.ccp
528528    // No kPage is paying for this frame anymore.
529529    raw_pfree (frame)
530530    kPage *next
531    for p = share_prev, next = (p ? p->share_prev : NULL); p; p = next, next = p->share_prev:
531    for p = share_prev, next = (p ? p->share_prev : NULL); p; p = next, next = p ? p->share_prev : NULL:
532532        p->frame = NULL
533533        p->share_prev = NULL
534534        p->share_next = NULL
mips/arch.ccp
2323    thread->arch.at = 0
2424    for unsigned i = 0; i < 2; ++i:
2525        thread->arch.v[i] = 0
26        thread->arch.k[i] = 0
2726    for unsigned i = 0; i < 4; ++i:
2827        thread->arch.a[i] = 0
2928    for unsigned i = 0; i < 10; ++i:
...... 
9998        case 25:
10099            return &thread->arch.t[9]
101100        case 26:
102            return &thread->arch.k[0]
103        case 27:
104            return &thread->arch.k[1]
105        case 28:
106101            return &thread->arch.gp
107        case 29:
102        case 27:
108103            return &thread->sp
109        case 30:
104        case 28:
110105            return &thread->arch.fp
111        case 31:
106        case 29:
112107            return &thread->arch.ra
113108        default:
114109            return NULL
mips/arch.hhp
8383#define SAVE_RA (SAVE_FP + 4)
8484#define SAVE_HI (SAVE_RA + 4)
8585#define SAVE_LO (SAVE_HI + 4)
86#define SAVE_K (SAVE_LO + 4)
8786
8887#ifndef ASM
8988
...... 
9190void arch_flush_cache ()
9291
9392struct kThread_arch:
94    unsigned at, v[2], a[4], t[10], s[8], gp, fp, ra, hi, lo, k[2]
93    unsigned at, v[2], a[4], t[10], s[8], gp, fp, ra, hi, lo
9594
9695// The following is used for page mapping.
9796// Each Memory has a directory with 0x400 page tables.
mips/entry.S
3232addr_000:
3333#if 0
3434    // TLB refill
35    bne $zero, $k1, slow_refill
36    nop
37    bne $zero, $k0, slow_refill
38    lw $k1, -0xd94($zero)
35    lui $k0, 0x8000
36    lw $k1, 0x174($k0) // directory
3937    mfc0 $k0, $CP0_ENTRY_HI
4038    srl $k0, $k0, 19
41    and $k0, $k0, 0x3fc
39    and $k0, $k0, 0xffc
4240    addu $k0, $k0, $k1
4341    beq $zero, $k0, zero_refill
4442    lw $k0, 0($k0)
4543    mfc0 $k1, $CP0_ENTRY_HI
4644    srl $k1, $k1, 10
47    and $k1, $k1, 0x1f8
45    and $k1, $k1, 0xff8
4846    add $k0, $k0, $k1
4947    lw $k1, 0($k0)
5048    mtc0 $k1, $CP0_ENTRY_LO0
5149    lw $k1, 4($k0)
5250    mtc0 $k1, $CP0_ENTRY_LO1
53511: tlbwr
54    move $zero, $k0
55    move $zero, $k1
52    move $k0, $zero
53    move $k1, $zero
5654    eret
5755
5856zero_refill:
59    mtc0 $zero, $CP_ENTRY_LO0
57    mtc0 $zero, $CP0_ENTRY_LO0
6058    b 1b
61    mtc0 $zero, $CP_ENTRY_LO1
62
63slow_refill:
64    move $k1, $zero
65#endif
66    sw $ra, -0xd88($zero)
59    mtc0 $zero, $CP0_ENTRY_LO1
60#else
61    // Slow refill: use C code (which calls kdebug etc)
62    move $k1, $ra
6763    bal save_regs
6864    nop
6965    la $t9, tlb_refill
7066    jr $t9
7167    nop
68#endif
7269    .fill 0x100 - (. - addr_000)
7370addr_100:
7471    // Cache error
75    sw $ra, -0xd88($zero)
72    move $k1, $ra
7673    bal save_regs
7774    nop
7875    la $t9, cache_error
7976    jr $t9
8077    nop
81    .fill 0x180 - (. - addr_000)
78    .fill 0x180 - (. - addr_000) - 3 * 4
79
80directory: // 0x174
81    .word 0
82current: // 0x178
83    .word idle
84        // 0x17c
85    .word _gp
86
8287addr_180:
8388    // General exception
84    sw $ra, -0xd88($zero)
89    move $k1, $ra
8590    bal save_regs
8691    nop
8792    la $t9, exception
8893    jr $t9
8994    nop
90    .fill 0x200 - (. - addr_000) - 8
91    .word 0x0000001e // 1f8 EntryLo data for idle page.
95    // This is annoying; it must fill it up so addr_200 is right. For some
96    // reason .fill 0x200 - (. - addr_000) - 2 * 4 doesn't work here.
97    .fill 0x60
98    .word 0x00000012 // 1f8 EntryLo data for idle page.
9299    .word 0x80000000 // 1fc A pointer to the current page.
93100addr_200:
94101    // Interrupt
95    sw $ra, -0xd88($zero)
102    move $k1, $ra
96103    bal save_regs
97104    nop
98105    la $t9, interrupt
99106    jr $t9
100107    nop
101    .fill 0x280 - (. - addr_000) - 20
102
103directory:
104    .word 0 // -d94 == directory
105    // space for save_regs
106    .word 0 // -d90 == k0
107    .word idle // -d8c == current
108    .word 0 // -d88 == ra
109    .word _gp // -d84 == gp
108    .fill 0x280 - (. - addr_000)
110109
111110start_idle: // 280
112111    // Wait for the next interrupt, then the first thread will be scheduled.
...... 
118117
119118// TODO: save only fragile registers now, the rest on task switch.
120119kernel_exit:
120    move $k0, $v0
121    lui $k1, 0x8000
122    sw $v0, 0x178($k1) // current
123    lw $k1, SAVE_PC($k0)
124    mtc0 $k1, $CP0_EPC
125    lw $k1, SAVE_LO($k0)
126    mtlo $k1
127    lw $k1, SAVE_HI($k0)
128    mthi $k1
129    lw $v0, SAVE_V + 0 * 4($k0)
130    lw $v1, SAVE_V + 1 * 4($k0)
131    lw $a0, SAVE_A + 0 * 4($k0)
132    lw $a1, SAVE_A + 1 * 4($k0)
133    lw $a2, SAVE_A + 2 * 4($k0)
134    lw $a3, SAVE_A + 3 * 4($k0)
135    lw $t0, SAVE_T + 0 * 4($k0)
136    lw $t1, SAVE_T + 1 * 4($k0)
137    lw $t2, SAVE_T + 2 * 4($k0)
138    lw $t3, SAVE_T + 3 * 4($k0)
139    lw $t4, SAVE_T + 4 * 4($k0)
140    lw $t5, SAVE_T + 5 * 4($k0)
141    lw $t6, SAVE_T + 6 * 4($k0)
142    lw $t7, SAVE_T + 7 * 4($k0)
143    lw $t8, SAVE_T + 8 * 4($k0)
144    lw $t9, SAVE_T + 9 * 4($k0)
145    lw $s0, SAVE_S + 0 * 4($k0)
146    lw $s1, SAVE_S + 1 * 4($k0)
147    lw $s2, SAVE_S + 2 * 4($k0)
148    lw $s3, SAVE_S + 3 * 4($k0)
149    lw $s4, SAVE_S + 4 * 4($k0)
150    lw $s5, SAVE_S + 5 * 4($k0)
151    lw $s6, SAVE_S + 6 * 4($k0)
152    lw $s7, SAVE_S + 7 * 4($k0)
153    lw $fp, SAVE_FP($k0)
154    lw $at, SAVE_AT($k0)
155    lw $sp, SAVE_SP($k0)
156    lw $gp, SAVE_GP($k0)
157    lw $ra, SAVE_RA($k0)
121158#ifndef NDEBUG
122159    // Exceptions were enabled in the kernel; set them to usermode setting again.
123    mfc0 $k0, $CP0_STATUS
124    ori $k0, $k0, 0xff13
125    mtc0 $k0, $CP0_STATUS
160    mfc0 $k1, $CP0_STATUS
161    ori $k1, $k1, 0xff13
162    mtc0 $k1, $CP0_STATUS
126163#endif
127    sw $v0, -0xd8c($zero)
128    lw $k0, SAVE_PC($v0)
129    mtc0 $k0, $CP0_EPC
130    lw $k0, SAVE_LO($v0)
131    lw $k1, SAVE_HI($v0)
132    mtlo $k0
133    mthi $k1
134    lw $v1, SAVE_V + 1 * 4($v0)
135    lw $a0, SAVE_A + 0 * 4($v0)
136    lw $a1, SAVE_A + 1 * 4($v0)
137    lw $a2, SAVE_A + 2 * 4($v0)
138    lw $a3, SAVE_A + 3 * 4($v0)
139    lw $t0, SAVE_T + 0 * 4($v0)
140    lw $t1, SAVE_T + 1 * 4($v0)
141    lw $t2, SAVE_T + 2 * 4($v0)
142    lw $t3, SAVE_T + 3 * 4($v0)
143    lw $t4, SAVE_T + 4 * 4($v0)
144    lw $t5, SAVE_T + 5 * 4($v0)
145    lw $t6, SAVE_T + 6 * 4($v0)
146    lw $t7, SAVE_T + 7 * 4($v0)
147    lw $t8, SAVE_T + 8 * 4($v0)
148    lw $t9, SAVE_T + 9 * 4($v0)
149    lw $s0, SAVE_S + 0 * 4($v0)
150    lw $s1, SAVE_S + 1 * 4($v0)
151    lw $s2, SAVE_S + 2 * 4($v0)
152    lw $s3, SAVE_S + 3 * 4($v0)
153    lw $s4, SAVE_S + 4 * 4($v0)
154    lw $s5, SAVE_S + 5 * 4($v0)
155    lw $s6, SAVE_S + 6 * 4($v0)
156    lw $s7, SAVE_S + 7 * 4($v0)
157    lw $fp, SAVE_FP($v0)
158    lw $ra, SAVE_RA($v0)
159    lw $at, SAVE_AT($v0)
160    lw $k0, SAVE_K + 0 * 4($v0)
161    lw $k1, SAVE_V + 0 * 4($v0)
162    sw $k1, -0xd90($zero)
163    lw $k1, SAVE_K + 1 * 4($v0)
164    lw $sp, SAVE_SP($v0)
165    lw $gp, SAVE_GP($v0)
166    lw $v0, -0xd90($zero)
164    move $k0, $zero
165    move $k1, $zero
167166    eret
168167
169168save_regs:
170    sw $k0, -0xd90($zero)
171    lw $k0, -0xd8c($zero)
169    lui $k0, 0x8000
170    lw $k0, 0x178($k0) // current
172171
173    sw $at, SAVE_AT($k0)
172    sw $k1, SAVE_RA($k0)
174173    sw $gp, SAVE_GP($k0)
175174    sw $sp, SAVE_SP($k0)
175    sw $at, SAVE_AT($k0)
176176    sw $fp, SAVE_FP($k0)
177
178    sw $k1, SAVE_K + 4($k0)
179    lw $k1, -0xd90($zero)
180    sw $k1, SAVE_K + 0($k0)
181
182    lw $k1, -0xd88($zero)
183    sw $k1, SAVE_RA($k0)
184    sw $v0, SAVE_V + 0 * 4($k0)
185    sw $v1, SAVE_V + 1 * 4($k0)
186    sw $a0, SAVE_A + 0 * 4($k0)
187    sw $a1, SAVE_A + 1 * 4($k0)
188    sw $a2, SAVE_A + 2 * 4($k0)
189    sw $a3, SAVE_A + 3 * 4($k0)
190    sw $t0, SAVE_T + 0 * 4($k0)
191    sw $t1, SAVE_T + 1 * 4($k0)
192    sw $t2, SAVE_T + 2 * 4($k0)
193    sw $t3, SAVE_T + 3 * 4($k0)
194    sw $t4, SAVE_T + 4 * 4($k0)
195    sw $t5, SAVE_T + 5 * 4($k0)
196    sw $t6, SAVE_T + 6 * 4($k0)
197    sw $t7, SAVE_T + 7 * 4($k0)
198    sw $t8, SAVE_T + 8 * 4($k0)
199    sw $t9, SAVE_T + 9 * 4($k0)
200    sw $s0, SAVE_S + 0 * 4($k0)
201    sw $s1, SAVE_S + 1 * 4($k0)
202    sw $s2, SAVE_S + 2 * 4($k0)
203    sw $s3, SAVE_S + 3 * 4($k0)
204    sw $s4, SAVE_S + 4 * 4($k0)
205    sw $s5, SAVE_S + 5 * 4($k0)
206    sw $s6, SAVE_S + 6 * 4($k0)
207177    sw $s7, SAVE_S + 7 * 4($k0)
208    mfhi $v0
209    mflo $v1
210    sw $v0, SAVE_HI($k0)
211    sw $v1, SAVE_LO($k0)
178    sw $s6, SAVE_S + 6 * 4($k0)
179    sw $s5, SAVE_S + 5 * 4($k0)
180    sw $s4, SAVE_S + 4 * 4($k0)
181    sw $s3, SAVE_S + 3 * 4($k0)
182    sw $s2, SAVE_S + 2 * 4($k0)
183    sw $s1, SAVE_S + 1 * 4($k0)
184    sw $s0, SAVE_S + 0 * 4($k0)
185    sw $t9, SAVE_T + 9 * 4($k0)
186    sw $t8, SAVE_T + 8 * 4($k0)
187    sw $t7, SAVE_T + 7 * 4($k0)
188    sw $t6, SAVE_T + 6 * 4($k0)
189    sw $t5, SAVE_T + 5 * 4($k0)
190    sw $t4, SAVE_T + 4 * 4($k0)
191    sw $t3, SAVE_T + 3 * 4($k0)
192    sw $t2, SAVE_T + 2 * 4($k0)
193    sw $t1, SAVE_T + 1 * 4($k0)
194    sw $t0, SAVE_T + 0 * 4($k0)
195    sw $a3, SAVE_A + 3 * 4($k0)
196    sw $a2, SAVE_A + 2 * 4($k0)
197    sw $a1, SAVE_A + 1 * 4($k0)
198    sw $a0, SAVE_A + 0 * 4($k0)
199    sw $v1, SAVE_V + 1 * 4($k0)
200    sw $v0, SAVE_V + 0 * 4($k0)
201    mfhi $k1
202    sw $k1, SAVE_HI($k0)
203    mflo $k1
204    sw $k1, SAVE_LO($k0)
212205    mfc0 $k1, $CP0_EPC
213206    sw $k1, SAVE_PC($k0)
214207
215    lw $gp, -0xd84($zero)
216    la $sp, kernel_stack + KERNEL_STACK_SIZE
217
218208#ifndef NDEBUG
219209    // Allow kernel bugs to set EPC and friends.
220210    mfc0 $k0, $CP0_STATUS
221    li $k1, 0x10000000
211    lui $k1, 0x1000
222212    and $k0, $k0, $k1
223213    mtc0 $k0, $CP0_STATUS
224214#endif
225215
216    lui $k0, 0x8000
217    lw $gp, 0x17c($k0)
218    la $sp, kernel_stack + KERNEL_STACK_SIZE
219
226220    move $t9, $ra
227221    la $ra, kernel_exit
228222    jr $t9
mips/init.ccp
11#pypp 0
2// vim: set filetype=cpp : //
23// Iris: micro-kernel for a capability-based operating system.
34// mips/init.ccp: mips-specific boot code.
45// Copyright 2009 Bas Wijnen <wijnen@debian.org>
...... 
7374    // Use non-vectored interrupts.
7475    cp0_set0 (CP0_INT_CTL)
7576
76    // clear the tlb, hardwire page 0 to 0xffffffff
77    // and soft-wire it to (0x294 << 20) + (0x290 << 10)
78    // (for the idle task).
79
80    cp0_set (CP0_WIRED, 1)
81    cp0_set0 (CP0_PAGE_MASK)
82    cp0_set0 (CP0_ENTRY_LO0)
83    cp0_set0 (CP0_ENTRY_LO1)
8477    // Get number of tlb entries (is 31).
8578    unsigned num
8679    cp0_get (CP0_CONFIG1, num)
8780    num >>= 25
8881    num &= 0x3f
8982    // Clear the tlb.
90    for unsigned i = 1; i <= num; ++i:
83    cp0_set (CP0_WIRED, 0)
84    cp0_set0 (CP0_PAGE_MASK)
85    cp0_set0 (CP0_ENTRY_LO0)
86    cp0_set0 (CP0_ENTRY_LO1)
87    for unsigned i = 0; i <= num; ++i:
9188        // with asid 0, no page faults will be triggered, so it's safe to map memory anywhere.
92        cp0_set (CP0_ENTRY_HI, 0x2000 * i)
89        // And it's set to invalid anyway.
90        cp0_set (CP0_ENTRY_HI, 0x2000 * (i + 1))
9391        cp0_set (CP0_INDEX, i)
9492        // write the data.
9593        __asm__ volatile ("tlbwi")
96    // Fill the upper page in kseg3.
97    cp0_set (CP0_ENTRY_HI, 0xffffe000)
98    cp0_set (CP0_ENTRY_LO0, 0x1d)
99    cp0_set (CP0_ENTRY_LO1, 0x1f)
100    cp0_set0 (CP0_INDEX)
101    __asm__ volatile ("tlbwi")
10294    // Fill the idle task's page in useg. Set it to non-cachable.
10395    // its directory entry is at 1fc, so it's number 7f (0fe00000).
10496    // its table entry is at 1f8, so it's number 7e (0007e000).
10597    // its address is 280 (00000280), used below for EPC.
10698    unsigned const idle_entry_hi = 0x0fe7e000
10799    cp0_set (CP0_ENTRY_HI, idle_entry_hi)
108    cp0_set (CP0_ENTRY_LO0, 0x16)
109    cp0_set (CP0_ENTRY_LO1, 0x14)
100    cp0_set (CP0_ENTRY_LO0, 0x00000012)
101    // The following value doesn't make much sense, but it is what is
102    // filled in at run-time. So for robustness it's used here as well.
103    cp0_set (CP0_ENTRY_LO1, 0x80000000)
110104    __asm__ volatile ("tlbwr")
111105    // Allow eret to be used to jump to the idle task.
112106    cp0_set (CP0_EPC, (idle_entry_hi & PAGE_MASK) | 0x280)
...... 
318312    // All interrupts enter the CPU through the interrupt controller at IP2, so enable that.
319313    cp0_set (CP0_STATUS, 0x1000ff13)
320314
315    kdebug ("entering idle task\n")
321316    // Done; return to user space (the idle task).
322317    __asm__ volatile ("eret")
mips/interrupts.ccp
11#pypp 0
2// vim: set filetype=cpp : //
23// Iris: micro-kernel for a capability-based operating system.
34// mips/interrupts.ccp: Functions called by mips/entry.S.
45// Copyright 2009 Bas Wijnen <wijnen@debian.org>
...... 
7273/// Otherwise, the ultra-fast code in entry.S is used.
7374kThread *tlb_refill ():
7475    ++dbg_code.h
76    kdebug_num ((unsigned)directory)
7577    old_current = current
7678    if !directory:
7779        unsigned addr
...... 
8082        return handle_exit ()
8183    unsigned EntryHi
8284    cp0_get (CP0_ENTRY_HI, EntryHi)
85    kdebug (" tlb ")
86    kdebug_num (EntryHi)
87    kdebug ("\n")
8388    Table *t = directory[EntryHi >> 21]
8489    if !t:
8590        unsigned addr
mips/nanonote/board.ccp
11#pypp 0
2// vim: set filetype=cpp ://
23// Iris: micro-kernel for a capability-based operating system.
34// mips/nanonote/board.ccp: nanonote-specific definitions.
45// Copyright 2009 Bas Wijnen <wijnen@debian.org>
...... 
2223
2324void board_init ():
2425    pll_init ()
25    cpm_stop_all ()
26    cpm_start_all ()
2627    // Timer interrupts and buzzer.
2728    cpm_start_tcu ()
2829    // sdram memory.
...... 
3839    // buzzer.
3940    gpio_as_pwm4 ()
4041    // Set up memory.
41    //setup_sdram ()
42    setup_sdram ()
4243    // Use some gpio pins for lcd.
4344    gpio_as_gpio (2, (1 << 21) | (1 << 22) | (1 << 23))
4445    gpio_as_output (2, (1 << 21) | (1 << 22) | (1 << 23))
...... 
5253    // Set up keyboard: this breaks uart receive.
5354    gpio_as_gpio (3, 0x05fc0000)
5455    // Set up timed interrupts.
56    tcu_start_timer_clock (0)
5557    tcu_stop_counter (0)
5658    tcu_select_extalclk (0)
5759    tcu_select_clk_div4 (0)
...... 
104106    while !rtc_write_ready ():
105107    rtc_enabled ()
106108    while !rtc_write_ready ():
109    rtc_set_hrcr_val (0x7f)
110    while !rtc_write_ready ():
107111    kdebug ("Power down.\n")
108112    sync_serial ()
109113    rtc_power_down ()
mips/start.S
1616// along with this program. If not, see <http://www.gnu.org/licenses/>.
1717
1818// This program is a wrapper around the kernel.
19// It is linked for loading at 0x80600000; however, it it position-independant and may be loaded anywhere.
19// It is position-independant and may be loaded anywhere.
2020// It does not use gp. This means that li and la must not be used.
2121    .globl __start
2222    .set noreorder
panic.ccp
136136        kdebug_num (old_current->arch.hi)
137137        kdebug (" lo=")
138138        kdebug_num (old_current->arch.lo)
139        kdebug ("\nk=")
140        kdebug_num (old_current->arch.k[0])
141        kdebug (" ")
142        kdebug_num (old_current->arch.k[1])
143139        kdebug ('\n')
140    kdebug ("Directory: ")
141    kdebug_num ((unsigned)directory)
144142    kdebug ("; ")
145143    kdebug (name)
146144    kdebug (':')
schedule.ccp
11#pypp 0
2// vim: set filetype=cpp : //
23// Iris: micro-kernel for a capability-based operating system.
34// schedule.ccp: Thread scheduling.
45// Copyright 2009 Bas Wijnen <wijnen@debian.org>
source/alarm.ccp
2323    Iris::my_parent.provide_capability <Iris::Event> (self)
2424    cap = Iris::my_receiver.create_capability (INTERRUPT)
2525    Iris::my_parent.init_done ()
26    font.printf ("Press a key to attempt reboot.\n")
2627    while true:
2728        Iris::wait ()
2829        switch Iris::recv.protected_data.l:
...... 
3839                font.printf ("alarm: control event\n")
3940                break
4041            case KBD:
41                // Key press
42                unsigned time = rtc.get_time ()
43                unsigned alarm = rtc.get_alarm ()
44                unsigned enabled = Iris::recv.data[1].l
45                font.printf ("%d %d %d", time, alarm, enabled)
46                rtc.set_alarm (time + 10, cap)
47                Iris::poweroff ()
42                if Iris::recv.data[0].l & Iris::Keyboard::RELEASE:
43                    // Key release.
44                    Iris::poweroff ()
45                else:
46                    // Key press.
47                    unsigned time = rtc.get_time ()
48                    rtc.set_alarm (time + 5, cap)
49                    unsigned alarm = rtc.get_alarm ()
50                    unsigned enabled = Iris::recv.data[1].l
51                    font.printf ("Debug: %d %d %d\n", time, alarm, enabled)
4852                break
4953            default:
5054                Iris::panic (Iris::recv.protected_data.l, "invalid request for alarm")
source/rtc.ccp
5151        rtc_set_adjc_val (0)
5252        ready ()
5353        rtc_set_second (0)
54    ready ()
55    rtc_disable_1Hz_irq ()
54        ready ()
55        rtc_set_alarm_second (0)
5656    ready ()
5757    rtc_disable_alarm ()
5858    ready ()
...... 
6060    ready ()
6161    rtc_enable_alarm_irq ()
6262    ready ()
63    rtc_disable_1Hz_irq ()
64    ready ()
6365    rtc_set_hwfcr_val (0)
6466    ready ()
6567    rtc_set_hrcr_val (0)
source/sdmmc.ccp
459459    offset &= ~PAGE_MASK & ~3
460460    if size + offset > PAGE_SIZE:
461461        size = PAGE_SIZE - offset
462    page.set_flags (Iris::Page::PAYING | Iris::Page::FRAME)
462463    page.share (buffer_page)
463464    buffer_page.set_flags (Iris::Page::PAYING | Iris::Page::FRAME)
465    page.set_flags (0, Iris::Page::PAYING)
464466    for unsigned i = 0; i < size; i += 4:
465467        ((unsigned *)buffer)[(offset + i) >> 2] = current_block[(start_pos + i) >> 2]
466468
...... 
475477    offset &= ~PAGE_MASK & ~3
476478    if size + offset > PAGE_SIZE:
477479        size = PAGE_SIZE - offset
480    page.set_flags (Iris::Page::PAYING | Iris::Page::FRAME)
478481    page.share (buffer_page)
479482    buffer_page.set_flags (Iris::Page::PAYING | Iris::Page::FRAME)
483    page.set_flags (0, Iris::Page::PAYING)
480484    for unsigned i = 0; i < size; i += 4:
481485        current_block[(start_pos + i) >> 2] = ((unsigned *)buffer)[(offset + i) >> 2]
482486    dirty = true
source/udc.ccp
11#pypp 0
2// vim: set filetype=cpp : //
23// Iris: micro-kernel for a capability-based operating system.
34// boot-programs/udc.ccp: USB device controller driver.
45// Copyright 2009 Bas Wijnen <wijnen@debian.org>
...... 
551552    NAME
552553
553554Iris::Num start ():
555    Iris::debug ("udc started")
554556    map_udc ()
555557    map_gpio ()
556558    map_cpm ()
557559    Udc udc
558560
559561    //Iris::Cap logcap = Iris::my_receiver.create_capability (LOG)
560    //__asm__ volatile ("li $a0, 1\nlw $a1, %0\nbreak" :: "m"(logcap.code): "a0", "a1", "memory")
562    //__asm__ volatile ("li $a0, 1\nlw $a1, %0\nbreak" :: "m"(logcap.code): "a0", "a1")
561563    Iris::Directory dir = Iris::my_receiver.create_capability (DIRECTORY)
562564    Iris::my_parent.provide_capability <Iris::Directory> (dir.copy ())
563565    Iris::free_cap (dir)

Archive Download the corresponding diff file

Branches:
master



interactive