mirror of
git://projects.qi-hardware.com/iris.git
synced 2024-11-17 00:37:31 +02:00
Make it work with new gcc version; use linker script to force entry code in page 0.
This commit is contained in:
parent
fa021a80f0
commit
2d803d5650
5
.gitignore
vendored
5
.gitignore
vendored
@ -6,17 +6,18 @@ uimage
|
|||||||
*.hh
|
*.hh
|
||||||
*.gz
|
*.gz
|
||||||
*.raw
|
*.raw
|
||||||
source/charset.data
|
userspace/data/charset.data
|
||||||
mips/nanonote/sdram-setup.raw
|
mips/nanonote/sdram-setup.raw
|
||||||
nanonote-boot
|
nanonote-boot
|
||||||
.deps/
|
.deps/
|
||||||
.dirstamp
|
.dirstamp
|
||||||
mips/.dirstamp
|
mips/.dirstamp
|
||||||
source/.dirstamp
|
userspace/.dirstamp
|
||||||
Makefile
|
Makefile
|
||||||
Makefile.in
|
Makefile.in
|
||||||
aclocal.m4
|
aclocal.m4
|
||||||
autom4te.cache/
|
autom4te.cache/
|
||||||
|
compile
|
||||||
config.log
|
config.log
|
||||||
config.status
|
config.status
|
||||||
configure
|
configure
|
||||||
|
178
Makefile.am
178
Makefile.am
@ -20,12 +20,11 @@ AUTOMAKE_OPTIONS = subdir-objects foreign
|
|||||||
# Define some variables.
|
# Define some variables.
|
||||||
OBJDUMP = $(host_alias)-objdump
|
OBJDUMP = $(host_alias)-objdump
|
||||||
OBJCOPY = $(host_alias)-objcopy
|
OBJCOPY = $(host_alias)-objcopy
|
||||||
SERIAL = /dev/ttyUSB0
|
SERIAL ?= /dev/ttyUSB0
|
||||||
junk = mdebug.abi32 reginfo comment pdr note.gnu.build-id
|
junk = mdebug.abi32 gnu.attributes ctors eh_frame eh_frame_hdr MIPS.abiflags reginfo comment pdr note.gnu.build-id
|
||||||
objcopyflags = -S $(addprefix --remove-section=.,$(junk))
|
objcopyflags = -S $(addprefix --remove-section=.,$(junk))
|
||||||
|
|
||||||
start_load = 0x80003000
|
start_load = 0x80100000
|
||||||
load = 0x80000000
|
|
||||||
|
|
||||||
noinst_DATA = iris.raw mips/start.raw mips/start-hack.S mips/board/sdram-setup.raw
|
noinst_DATA = iris.raw mips/start.raw mips/start-hack.S mips/board/sdram-setup.raw
|
||||||
noinst_PROGRAMS = iris.elf mips/start.elf mips/board/sdram-setup.elf
|
noinst_PROGRAMS = iris.elf mips/start.elf mips/board/sdram-setup.elf
|
||||||
@ -46,15 +45,16 @@ endif
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# Threadlist must be the last file on the line below.
|
# Threadlist must be the last file on the line below.
|
||||||
iris_sources = kernel/panic.cc kernel/data.cc kernel/alloc.cc kernel/memory.cc kernel/invoke.cc kernel/schedule.cc mips/interrupts.cc mips/arch.cc source/boot/threadlist.S
|
iris_sources = kernel/panic.cc kernel/data.cc kernel/alloc.cc kernel/memory.cc kernel/invoke.cc kernel/schedule.cc mips/interrupts.cc mips/arch.cc userspace/boot/threadlist.S
|
||||||
boot_sources = mips/init.cc mips/board/board.cc
|
boot_sources = mips/init.cc mips/board/board.cc
|
||||||
headers = include/kernel.hh include/iris.hh include/devices.hh include/ui.hh include/keys.hh mips/arch.hh mips/board/jz4740.hh mips/board/board.hh mips/nand.hh
|
headers = include/kernel.hh include/iris.hh include/devices.hh include/keys.hh mips/arch.hh mips/board/jz4740.hh mips/board/board.hh mips/nand.hh
|
||||||
iris_elf_CPPFLAGS = -O5 -fno-inline -Iinclude -Imips -Imips/board -Wa,-mips32 -DNANONOTE -DUSE_SERIAL
|
iris_elf_DEPENDENCIES = mips/board/iris.ld
|
||||||
iris_elf_CXXFLAGS = -Wno-unused-parameter -fno-strict-aliasing -fno-builtin -ggdb3
|
iris_elf_CPPFLAGS = -fno-inline -Iinclude -Imips -Imips/board -mips32 -DNANONOTE -DUSE_SERIAL
|
||||||
iris_elf_LDFLAGS = -Wl,--omagic -Wl,-Ttext -Wl,$(load) -nostdlib
|
iris_elf_CXXFLAGS = -O5 -Wno-unused-parameter -fno-strict-aliasing -fno-builtin -ggdb3 -fno-exceptions -fno-common
|
||||||
|
iris_elf_LDFLAGS = -Wl,--omagic -nostdlib -T mips/board/iris.ld
|
||||||
iris_elf_SOURCES = mips/entry.S ${iris_sources} mips/boot.S ${boot_sources} ${headers}
|
iris_elf_SOURCES = mips/entry.S ${iris_sources} mips/boot.S ${boot_sources} ${headers}
|
||||||
|
|
||||||
mips_start_elf_CPPFLAGS = -O5 -fno-inline -Wa,-mips32 -DSTART="0x$(shell /bin/sh -c '$(OBJDUMP) -t iris.elf | grep __start$$ | cut -b1-8')"
|
mips_start_elf_CPPFLAGS = -fno-inline -mips32 -DSTART="0x$(shell /bin/sh -c '$(OBJDUMP) -t iris.elf | grep __start$$ | cut -b1-8')" -DADDR0="0x$(shell /bin/sh -c '$(OBJDUMP) -t iris.elf | grep addr000$$ | cut -b1-8')"
|
||||||
mips_start_elf_LDFLAGS = -Wl,--omagic -Wl,-Ttext -Wl,$(start_load) -nostdlib
|
mips_start_elf_LDFLAGS = -Wl,--omagic -Wl,-Ttext -Wl,$(start_load) -nostdlib
|
||||||
mips_start_elf_SOURCES = mips/start-hack.S iris.raw
|
mips_start_elf_SOURCES = mips/start-hack.S iris.raw
|
||||||
|
|
||||||
@ -62,34 +62,34 @@ mips/start-hack.S: mips/start.S iris.raw
|
|||||||
cp $< $@
|
cp $< $@
|
||||||
|
|
||||||
mips_board_sdram_setup_elf_DEPENDENCIES = mips/board/sdram-setup.ld
|
mips_board_sdram_setup_elf_DEPENDENCIES = mips/board/sdram-setup.ld
|
||||||
mips_board_sdram_setup_elf_CPPFLAGS = -O5 -fno-inline -Iinclude -Imips -Imips/board -Wa,-mips32
|
mips_board_sdram_setup_elf_CPPFLAGS = -fno-inline -Iinclude -Imips -Imips/board -mips32
|
||||||
mips_board_sdram_setup_elf_CXXFLAGS = -Wno-unused-parameter -fno-strict-aliasing -fno-builtin -ggdb3
|
mips_board_sdram_setup_elf_CXXFLAGS = -O5 -Wno-unused-parameter -fno-strict-aliasing -fno-builtin -ggdb3 -fno-exceptions -fno-common
|
||||||
mips_board_sdram_setup_elf_LDFLAGS = -Wl,--omagic -Wl,-T -Wl,mips/board/sdram-setup.ld -nostdlib
|
mips_board_sdram_setup_elf_LDFLAGS = -Wl,--omagic -Wl,-T -Wl,mips/board/sdram-setup.ld -nostdlib
|
||||||
mips_board_sdram_setup_elf_SOURCES = mips/board/sdram-setup.cc
|
mips_board_sdram_setup_elf_SOURCES = mips/board/sdram-setup.cc
|
||||||
|
|
||||||
program_targets = \
|
program_targets = \
|
||||||
source/bootinit.elf \
|
userspace/bootinit.elf \
|
||||||
source/init.elf \
|
userspace/init.elf \
|
||||||
source/boot.elf \
|
userspace/boot.elf \
|
||||||
source/gpio.elf \
|
userspace/gpio.elf \
|
||||||
source/lcd.elf \
|
userspace/lcd.elf \
|
||||||
source/nand.elf \
|
userspace/nand.elf \
|
||||||
source/rtc.elf \
|
userspace/rtc.elf \
|
||||||
source/sdmmc.elf \
|
userspace/sdmmc.elf \
|
||||||
source/udc.elf \
|
userspace/udc.elf \
|
||||||
source/elfrun.elf \
|
userspace/elfrun.elf \
|
||||||
source/fat.elf \
|
userspace/fat.elf \
|
||||||
source/font.elf \
|
userspace/font.elf \
|
||||||
source/gui.elf \
|
userspace/gui.elf \
|
||||||
source/partition.elf \
|
userspace/partition.elf \
|
||||||
source/usbmassstorage.elf \
|
userspace/usbmassstorage.elf \
|
||||||
source/alarm.elf \
|
userspace/alarm.elf \
|
||||||
source/ball.elf \
|
userspace/ball.elf \
|
||||||
source/booter.elf \
|
userspace/booter.elf \
|
||||||
source/bsquare.elf \
|
userspace/bsquare.elf \
|
||||||
source/buzzer.elf \
|
userspace/buzzer.elf \
|
||||||
source/metronome.elf \
|
userspace/metronome.elf \
|
||||||
source/test.elf
|
userspace/test.elf
|
||||||
|
|
||||||
fs_targets = \
|
fs_targets = \
|
||||||
fs/alarm.elf \
|
fs/alarm.elf \
|
||||||
@ -117,13 +117,13 @@ fs_targets = \
|
|||||||
|
|
||||||
noinst_PROGRAMS += $(program_targets)
|
noinst_PROGRAMS += $(program_targets)
|
||||||
noinst_DATA += $(fs_targets)
|
noinst_DATA += $(fs_targets)
|
||||||
AM_CPPFLAGS = -O5 -fno-inline -Iinclude -Imips -Imips/board -Wa,-mips32 -DNANONOTE
|
AM_CPPFLAGS = -fno-inline -Iinclude -Imips -Imips/board -mips32 -DNANONOTE
|
||||||
AM_CXXFLAGS = -Wno-unused-parameter -fno-strict-aliasing -fno-builtin -ggdb3
|
AM_CXXFLAGS = -O5 -Wno-unused-parameter -fno-strict-aliasing -fno-builtin -ggdb3
|
||||||
AM_LDFLAGS = -nostdlib
|
AM_LDFLAGS = -nostdlib
|
||||||
|
|
||||||
BUILT_SOURCES = $(headers) source/data/charset.data server
|
BUILT_SOURCES = $(headers) userspace/data/charset.data server
|
||||||
|
|
||||||
source/boot/threadlist.S: source/boot/mkthreadlist Makefile $(addprefix fs/,$(addsuffix .elf,bootinit $(notdir $(boot_threads))))
|
userspace/boot/threadlist.S: userspace/boot/mkthreadlist Makefile $(addprefix fs/,$(addsuffix .elf,bootinit $(notdir $(boot_threads))))
|
||||||
$< bootinit $(boot_threads) > $@
|
$< bootinit $(boot_threads) > $@
|
||||||
|
|
||||||
PYPP = /usr/bin/pypp
|
PYPP = /usr/bin/pypp
|
||||||
@ -132,43 +132,43 @@ PYPP = /usr/bin/pypp
|
|||||||
%.hh: %.hhp
|
%.hh: %.hhp
|
||||||
$(PYPP) --name $< < $< > $@
|
$(PYPP) --name $< < $< > $@
|
||||||
|
|
||||||
source/data/charset.data: source/data/charset
|
userspace/data/charset.data: userspace/data/charset
|
||||||
$< > $@
|
$< > $@
|
||||||
fs/font.dat: source/data/courier-10+8+32.png source/data/makefont
|
fs/font.dat: userspace/data/courier-10+8+32.png userspace/data/makefont
|
||||||
source/data/makefont $< > $@
|
userspace/data/makefont $< > $@
|
||||||
fs/init.config: source/data/init.config
|
fs/init.config: userspace/data/init.config
|
||||||
ln -s ../$< $@
|
ln -s ../$< $@
|
||||||
|
|
||||||
fs/%.elf: source/%.elf
|
fs/%.elf: userspace/%.elf
|
||||||
mkdir -p fs
|
mkdir -p fs
|
||||||
$(OBJCOPY) -S $< $@
|
$(OBJCOPY) -S $< $@
|
||||||
|
|
||||||
source_bootinit_elf_SOURCES = source/boot/crt0.cc source/boot/bootinit.cc ${headers}
|
userspace_bootinit_elf_SOURCES = userspace/boot/crt0.cc userspace/boot/bootinit.cc ${headers}
|
||||||
source_init_elf_SOURCES = source/boot/crt0.cc source/boot/init.cc ${headers}
|
userspace_init_elf_SOURCES = userspace/boot/crt0.cc userspace/boot/init.cc ${headers}
|
||||||
|
|
||||||
source_boot_elf_SOURCES = source/boot/crt0.cc source/hardware/boot.cc ${headers}
|
userspace_boot_elf_SOURCES = userspace/boot/crt0.cc userspace/hardware/boot.cc ${headers}
|
||||||
source_buzzer_elf_SOURCES = source/boot/crt0.cc source/hardware/buzzer.cc ${headers}
|
userspace_buzzer_elf_SOURCES = userspace/boot/crt0.cc userspace/hardware/buzzer.cc ${headers}
|
||||||
source_gpio_elf_SOURCES = source/boot/crt0.cc source/hardware/gpio.cc ${headers}
|
userspace_gpio_elf_SOURCES = userspace/boot/crt0.cc userspace/hardware/gpio.cc ${headers}
|
||||||
source_lcd_elf_SOURCES = source/boot/crt0.cc source/hardware/lcd.cc ${headers}
|
userspace_lcd_elf_SOURCES = userspace/boot/crt0.cc userspace/hardware/lcd.cc ${headers}
|
||||||
source_nand_elf_SOURCES = source/boot/crt0.cc source/hardware/nand.cc ${headers}
|
userspace_nand_elf_SOURCES = userspace/boot/crt0.cc userspace/hardware/nand.cc ${headers}
|
||||||
source_rtc_elf_SOURCES = source/boot/crt0.cc source/hardware/rtc.cc ${headers}
|
userspace_rtc_elf_SOURCES = userspace/boot/crt0.cc userspace/hardware/rtc.cc ${headers}
|
||||||
source_sdmmc_elf_SOURCES = source/boot/crt0.cc source/hardware/sdmmc.cc ${headers}
|
userspace_sdmmc_elf_SOURCES = userspace/boot/crt0.cc userspace/hardware/sdmmc.cc ${headers}
|
||||||
source_udc_elf_SOURCES = source/boot/crt0.cc source/hardware/udc.cc ${headers}
|
userspace_udc_elf_SOURCES = userspace/boot/crt0.cc userspace/hardware/udc.cc ${headers}
|
||||||
|
|
||||||
#source_buffer_elf_SOURCES = source/boot/crt0.cc source/glue/buffer.cc ${headers}
|
#userspace_buffer_elf_SOURCES = userspace/boot/crt0.cc userspace/glue/buffer.cc ${headers}
|
||||||
source_elfrun_elf_SOURCES = source/boot/crt0.cc source/glue/elfrun.cc ${headers}
|
userspace_elfrun_elf_SOURCES = userspace/boot/crt0.cc userspace/glue/elfrun.cc ${headers}
|
||||||
source_fat_elf_SOURCES = source/boot/crt0.cc source/glue/fat.cc ${headers}
|
userspace_fat_elf_SOURCES = userspace/boot/crt0.cc userspace/glue/fat.cc ${headers}
|
||||||
source_font_elf_SOURCES = source/boot/crt0.cc source/glue/font.cc ${headers}
|
userspace_font_elf_SOURCES = userspace/boot/crt0.cc userspace/glue/font.cc ${headers}
|
||||||
source_gui_elf_SOURCES = source/boot/crt0.cc source/glue/gui.cc ${headers}
|
userspace_gui_elf_SOURCES = userspace/boot/crt0.cc userspace/glue/gui.cc ${headers}
|
||||||
source_partition_elf_SOURCES = source/boot/crt0.cc source/glue/partition.cc ${headers}
|
userspace_partition_elf_SOURCES = userspace/boot/crt0.cc userspace/glue/partition.cc ${headers}
|
||||||
source_usbmassstorage_elf_SOURCES = source/boot/crt0.cc source/glue/usbmassstorage.cc ${headers}
|
userspace_usbmassstorage_elf_SOURCES = userspace/boot/crt0.cc userspace/glue/usbmassstorage.cc ${headers}
|
||||||
|
|
||||||
source_metronome_elf_SOURCES = source/boot/crt0.cc source/application/metronome.cc ${headers}
|
userspace_metronome_elf_SOURCES = userspace/boot/crt0.cc userspace/application/metronome.cc ${headers}
|
||||||
source_test_elf_SOURCES = source/boot/crt0.cc source/application/test.cc ${headers}
|
userspace_test_elf_SOURCES = userspace/boot/crt0.cc userspace/application/test.cc ${headers}
|
||||||
source_alarm_elf_SOURCES = source/boot/crt0.cc source/application/alarm.cc ${headers}
|
userspace_alarm_elf_SOURCES = userspace/boot/crt0.cc userspace/application/alarm.cc ${headers}
|
||||||
source_ball_elf_SOURCES = source/boot/crt0.cc source/application/ball.cc ${headers}
|
userspace_ball_elf_SOURCES = userspace/boot/crt0.cc userspace/application/ball.cc ${headers}
|
||||||
source_booter_elf_SOURCES = source/boot/crt0.cc source/application/booter.cc ${headers}
|
userspace_booter_elf_SOURCES = userspace/boot/crt0.cc userspace/application/booter.cc ${headers}
|
||||||
source_bsquare_elf_SOURCES = source/boot/crt0.cc source/application/bsquare.cc ${headers}
|
userspace_bsquare_elf_SOURCES = userspace/boot/crt0.cc userspace/application/bsquare.cc ${headers}
|
||||||
|
|
||||||
server:
|
server:
|
||||||
test -e native/Makefile || native/autogen.sh
|
test -e native/Makefile || native/autogen.sh
|
||||||
@ -189,28 +189,28 @@ iris.tar.gz: mips/start.raw.gz mips/start.elf $(fs_targets) fs/init.config fs/fo
|
|||||||
gzip < $< > $@
|
gzip < $< > $@
|
||||||
|
|
||||||
sources = \
|
sources = \
|
||||||
source/alarm.cc \
|
userspace/boot/bootinit.cc \
|
||||||
source/ball.cc \
|
userspace/boot/init.cc \
|
||||||
source/boot.cc \
|
userspace/hardware/boot.cc \
|
||||||
source/booter.cc \
|
userspace/hardware/buzzer.cc \
|
||||||
source/bootinit.cc \
|
userspace/hardware/gpio.cc \
|
||||||
source/bsquare.cc \
|
userspace/hardware/lcd.cc \
|
||||||
source/buzzer.cc \
|
userspace/hardware/nand.cc \
|
||||||
source/elfrun.cc \
|
userspace/hardware/rtc.cc \
|
||||||
source/fat.cc \
|
userspace/hardware/sdmmc.cc \
|
||||||
source/font.cc \
|
userspace/hardware/udc.cc \
|
||||||
source/gpio.cc \
|
userspace/glue/elfrun.cc \
|
||||||
source/gui.cc \
|
userspace/glue/fat.cc \
|
||||||
source/init.cc \
|
userspace/glue/font.cc \
|
||||||
source/lcd.cc \
|
userspace/glue/gui.cc \
|
||||||
source/metronome.cc \
|
userspace/glue/partition.cc \
|
||||||
source/nand.cc \
|
userspace/glue/usbmassstorage.cc \
|
||||||
source/partition.cc \
|
userspace/application/alarm.cc \
|
||||||
source/rtc.cc \
|
userspace/application/ball.cc \
|
||||||
source/sdmmc.cc \
|
userspace/application/booter.cc \
|
||||||
source/test.cc \
|
userspace/application/bsquare.cc \
|
||||||
source/udc.cc \
|
userspace/application/metronome.cc \
|
||||||
source/usbmassstorage.cc
|
userspace/application/test.cc
|
||||||
|
|
||||||
debug:
|
debug:
|
||||||
stty -F $(SERIAL) 57600 raw
|
stty -F $(SERIAL) 57600 raw
|
||||||
@ -218,4 +218,4 @@ debug:
|
|||||||
|
|
||||||
autoclean: maintainer-clean
|
autoclean: maintainer-clean
|
||||||
$(MAKE) -C native autoclean
|
$(MAKE) -C native autoclean
|
||||||
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 mips/start.raw.gz source/data/charset.data iris.tar.gz
|
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 mips/start.raw.gz userspace/data/charset.data iris.tar.gz mips/board/sdram-setup.cc mips/board/sdram-setup.raw mips/board/sdram-setup.elf userspace/boot/crt0.cc
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
AC_INIT([iris], [0.2], [wijnen@debian.org])
|
AC_INIT([iris], [0.2], [wijnen@debian.org])
|
||||||
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
|
AM_INIT_AUTOMAKE()
|
||||||
AC_PROG_CXX
|
AC_PROG_CXX
|
||||||
AM_PROG_AS
|
AM_PROG_AS
|
||||||
|
|
||||||
|
@ -90,39 +90,41 @@ namespace Iris:
|
|||||||
NUM_EXCEPTION_CODES
|
NUM_EXCEPTION_CODES
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
static const char *exception_name[NUM_EXCEPTION_CODES] = {
|
static inline const char *exception_name(int code):
|
||||||
"no error",
|
const char *names[] = {
|
||||||
"write denied",
|
"no error",
|
||||||
"unmapped read",
|
"write denied",
|
||||||
"unmapped write",
|
"unmapped read",
|
||||||
"invalid address read",
|
"unmapped write",
|
||||||
"invalid address write",
|
"invalid address read",
|
||||||
"reserved instruction",
|
"invalid address write",
|
||||||
"coprocessor unusable",
|
"reserved instruction",
|
||||||
"overflow",
|
"coprocessor unusable",
|
||||||
"trap",
|
"overflow",
|
||||||
"watchpoint",
|
"trap",
|
||||||
"breakpoint",
|
"watchpoint",
|
||||||
"no page directory",
|
"breakpoint",
|
||||||
"no page table",
|
"no page directory",
|
||||||
"out of memory",
|
"no page table",
|
||||||
"invalid operation"
|
"out of memory",
|
||||||
}
|
"invalid operation"
|
||||||
|
}
|
||||||
|
return names[code]
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct Num:
|
struct Num:
|
||||||
unsigned l, h
|
unsigned l, h
|
||||||
Num (unsigned long long n = 0) : l (n), h (n >> 32):
|
inline Num (unsigned long long n = 0) : l (n), h (n >> 32):
|
||||||
Num (unsigned ll, unsigned hh) : l (ll), h (hh):
|
inline Num (unsigned ll, unsigned hh) : l (ll), h (hh):
|
||||||
unsigned long long value () const:
|
inline unsigned long long value () const:
|
||||||
return ((unsigned long long)h << 32) | l
|
return ((unsigned long long)h << 32) | l
|
||||||
unsigned &low ():
|
inline unsigned &low ():
|
||||||
return l
|
return l
|
||||||
unsigned &high ():
|
inline unsigned &high ():
|
||||||
return h
|
return h
|
||||||
unsigned const &low () const:
|
inline unsigned const &low () const:
|
||||||
return l
|
return l
|
||||||
unsigned const &high () const:
|
inline unsigned const &high () const:
|
||||||
return h
|
return h
|
||||||
|
|
||||||
struct Cap
|
struct Cap
|
||||||
|
@ -61,7 +61,7 @@ void kThread::raise (unsigned code, unsigned data):
|
|||||||
kdebug_num ((unsigned)old_current)
|
kdebug_num ((unsigned)old_current)
|
||||||
kdebug ('/')
|
kdebug ('/')
|
||||||
if code < Iris::NUM_EXCEPTION_CODES:
|
if code < Iris::NUM_EXCEPTION_CODES:
|
||||||
kdebug (Iris::exception_name[code])
|
kdebug (Iris::exception_name(code))
|
||||||
else:
|
else:
|
||||||
kdebug ("invalid code:")
|
kdebug ("invalid code:")
|
||||||
kdebug_num (code)
|
kdebug_num (code)
|
||||||
|
@ -55,7 +55,7 @@ start_hack_for_disassembler:
|
|||||||
la $sp, kernel_stack + KERNEL_STACK_SIZE
|
la $sp, kernel_stack + KERNEL_STACK_SIZE
|
||||||
|
|
||||||
// Clear .bss
|
// Clear .bss
|
||||||
la $a0, _edata
|
la $a0, _bss
|
||||||
la $a1, _end
|
la $a1, _end
|
||||||
1: sw $zero, 0($a0)
|
1: sw $zero, 0($a0)
|
||||||
bne $a1, $a0, 1b
|
bne $a1, $a0, 1b
|
||||||
|
26
mips/entry.S
26
mips/entry.S
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#define KERNEL_STACK_SIZE 0x1000
|
#define KERNEL_STACK_SIZE 0x1000
|
||||||
// The kernel stack.
|
// The kernel stack.
|
||||||
|
.bss
|
||||||
.lcomm kernel_stack, KERNEL_STACK_SIZE
|
.lcomm kernel_stack, KERNEL_STACK_SIZE
|
||||||
|
|
||||||
.globl run_idle
|
.globl run_idle
|
||||||
@ -24,24 +25,30 @@
|
|||||||
.set noat
|
.set noat
|
||||||
.set noreorder
|
.set noreorder
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
#define ARCH
|
#define ARCH
|
||||||
#define ASM
|
#define ASM
|
||||||
#define __KERNEL__
|
#define __KERNEL__
|
||||||
#include "arch.hh"
|
#include "arch.hh"
|
||||||
|
|
||||||
|
.org 0x000
|
||||||
addr_000:
|
addr_000:
|
||||||
#if 1
|
#if 1
|
||||||
// TLB refill
|
// TLB refill
|
||||||
lui $k0, 0x8000
|
lui $k0, 0x8000
|
||||||
lw $k1, 0x174($k0) // directory
|
lw $k1, 0x174($k0) // directory
|
||||||
mfc0 $k0, $CP0_ENTRY_HI
|
mfc0 $k0, $CP0_ENTRY_HI
|
||||||
|
// Entry high is address: 12 bit offset in page; 1 bit even/odd; 9 bit which page pair; 10 bit which table.
|
||||||
srl $k0, $k0, 19
|
srl $k0, $k0, 19
|
||||||
andi $k0, $k0, 0xffc
|
andi $k0, $k0, 0xffc // Bits 30:21 remain: which page table to get from directory.
|
||||||
addu $k0, $k0, $k1
|
addu $k0, $k0, $k1
|
||||||
lw $k0, 0($k0)
|
lw $k0, 0($k0) // k0 is the page table.
|
||||||
beq $zero, $k0, zero_refill
|
beq $zero, $k0, zero_refill
|
||||||
mfc0 $k1, $CP0_ENTRY_HI
|
mfc0 $k1, $CP0_ENTRY_HI
|
||||||
srl $k1, $k1, 10
|
srl $k1, $k1, 10
|
||||||
|
// Bits 20:13 remain: which page pair to get from page table.
|
||||||
|
// (Only the lower half is used for this; the upper half contains pointers to the kPages.)
|
||||||
andi $k1, $k1, 0x7f8
|
andi $k1, $k1, 0x7f8
|
||||||
addu $k0, $k0, $k1
|
addu $k0, $k0, $k1
|
||||||
lw $k1, 0($k0)
|
lw $k1, 0($k0)
|
||||||
@ -66,7 +73,8 @@ zero_refill:
|
|||||||
jr $t9
|
jr $t9
|
||||||
nop
|
nop
|
||||||
#endif
|
#endif
|
||||||
.fill 0x100 - (. - addr_000)
|
|
||||||
|
.org 0x100
|
||||||
addr_100:
|
addr_100:
|
||||||
// Cache error
|
// Cache error
|
||||||
move $k1, $ra
|
move $k1, $ra
|
||||||
@ -75,8 +83,8 @@ addr_100:
|
|||||||
la $t9, cache_error
|
la $t9, cache_error
|
||||||
jr $t9
|
jr $t9
|
||||||
nop
|
nop
|
||||||
.fill 0x180 - (. - addr_000) - 3 * 4
|
|
||||||
|
|
||||||
|
.org 0x180 - 3 * 4
|
||||||
directory: // 0x174
|
directory: // 0x174
|
||||||
.word 0
|
.word 0
|
||||||
current: // 0x178
|
current: // 0x178
|
||||||
@ -92,9 +100,8 @@ addr_180:
|
|||||||
la $t9, exception
|
la $t9, exception
|
||||||
jr $t9
|
jr $t9
|
||||||
nop
|
nop
|
||||||
// This is annoying; it must fill it up so addr_200 is right. For some
|
|
||||||
// reason .fill 0x200 - (. - addr_000) - 2 * 4 doesn't work here.
|
.org 0x200 - 2 * 4
|
||||||
.fill 0x60
|
|
||||||
.word 0x00000012 // 1f8 EntryLo data for idle page.
|
.word 0x00000012 // 1f8 EntryLo data for idle page.
|
||||||
.word 0x80000000 // 1fc A pointer to the current page.
|
.word 0x80000000 // 1fc A pointer to the current page.
|
||||||
addr_200:
|
addr_200:
|
||||||
@ -105,8 +112,8 @@ addr_200:
|
|||||||
la $t9, interrupt
|
la $t9, interrupt
|
||||||
jr $t9
|
jr $t9
|
||||||
nop
|
nop
|
||||||
.fill 0x280 - (. - addr_000)
|
|
||||||
|
|
||||||
|
.org 0x280
|
||||||
start_idle: // 280
|
start_idle: // 280
|
||||||
// Wait for the next interrupt, then the first thread will be scheduled.
|
// Wait for the next interrupt, then the first thread will be scheduled.
|
||||||
// It is impractical to try to call schedule, because for that the
|
// It is impractical to try to call schedule, because for that the
|
||||||
@ -221,3 +228,6 @@ save_regs:
|
|||||||
la $ra, kernel_exit
|
la $ra, kernel_exit
|
||||||
jr $t9
|
jr $t9
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
.set at
|
||||||
|
.set reorder
|
||||||
|
@ -310,7 +310,16 @@ void init (unsigned mem):
|
|||||||
|
|
||||||
// Say we're handling an exception. Since we're going to enter the idle task, allow access to cp0.
|
// Say we're handling an exception. Since we're going to enter the idle task, allow access to cp0.
|
||||||
// All interrupts enter the CPU through the interrupt controller at IP2, so enable that.
|
// All interrupts enter the CPU through the interrupt controller at IP2, so enable that.
|
||||||
cp0_set (CP0_STATUS, 0x1000ff13)
|
cp0_set (CP0_STATUS, 0x10000413)
|
||||||
|
|
||||||
|
for int a = 0; a < 0x300; a += 0x80:
|
||||||
|
kdebug("addr ")
|
||||||
|
kdebug_num(a)
|
||||||
|
kdebug(":")
|
||||||
|
for int b = 0; b < 0x10; b += 4:
|
||||||
|
kdebug(" ")
|
||||||
|
kdebug_num(*(unsigned *)(0x80000000 | (a + b)))
|
||||||
|
kdebug('\n')
|
||||||
|
|
||||||
kdebug ("entering idle task\n")
|
kdebug ("entering idle task\n")
|
||||||
// Done; return to user space (the idle task).
|
// Done; return to user space (the idle task).
|
||||||
|
@ -50,13 +50,13 @@ static kThread *handle_exit ():
|
|||||||
current->address_space->arch.asid = asids[0]
|
current->address_space->arch.asid = asids[0]
|
||||||
asids[0] = asids[asids[0]]
|
asids[0] = asids[asids[0]]
|
||||||
else:
|
else:
|
||||||
static unsigned random = 1
|
static unsigned random
|
||||||
current->address_space->arch.asid = random
|
|
||||||
// Overwrite used asid, so flush those values from tlb.
|
|
||||||
flush_tlb (random)
|
|
||||||
++random
|
++random
|
||||||
if random >= 64:
|
if random >= 64:
|
||||||
random = 1
|
random = 1
|
||||||
|
current->address_space->arch.asid = random
|
||||||
|
// Overwrite used asid, so flush those values from tlb.
|
||||||
|
flush_tlb (random)
|
||||||
asids[current->address_space->arch.asid] = (unsigned)current->address_space
|
asids[current->address_space->arch.asid] = (unsigned)current->address_space
|
||||||
cp0_set (CP0_ENTRY_HI, current->address_space->arch.asid)
|
cp0_set (CP0_ENTRY_HI, current->address_space->arch.asid)
|
||||||
directory = current->address_space->arch.directory
|
directory = current->address_space->arch.directory
|
||||||
|
23
mips/nanonote/iris.ld
Normal file
23
mips/nanonote/iris.ld
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
OUTPUT_ARCH(mips)
|
||||||
|
ENTRY(__start)
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
ram : ORIGIN = 0x80000000 , LENGTH = 32M
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text : { "mips/iris_elf-entry.o" (.text*) } > ram
|
||||||
|
.text : { *(.text*) } > ram
|
||||||
|
.rodata : { *(.rodata*) *(.note*) } > ram
|
||||||
|
.sdata : { *(.sdata*) } > ram
|
||||||
|
.data : { *(.data*) *(.scommon*) *(.reginfo*) } > ram
|
||||||
|
|
||||||
|
_gp = ABSOLUTE(.);
|
||||||
|
.got : { *(.got*) } > ram
|
||||||
|
|
||||||
|
_bss = ABSOLUTE(.);
|
||||||
|
.sbss : { *(.sbss*) } > ram
|
||||||
|
.bss : { *(.bss*) } > ram
|
||||||
|
_end = ABSOLUTE(.);
|
||||||
|
}
|
@ -49,7 +49,7 @@ base:
|
|||||||
addiu $v1, $v1, 32
|
addiu $v1, $v1, 32
|
||||||
|
|
||||||
// Set a1 to start address of image.
|
// Set a1 to start address of image.
|
||||||
addiu $a1, $ra, image - base
|
addiu $a1, $ra, image - base + ADDR0 - 0x80000000
|
||||||
|
|
||||||
// Set a2 to end address of image.
|
// Set a2 to end address of image.
|
||||||
lw $a2, 0($ra)
|
lw $a2, 0($ra)
|
||||||
|
@ -1,54 +1,73 @@
|
|||||||
#pypp 0
|
#pypp 0
|
||||||
// vim: set filetype=cpp : //
|
|
||||||
#include <iris.hh>
|
#include <iris.hh>
|
||||||
#include <devices.hh>
|
#include <ui.hh>
|
||||||
|
|
||||||
enum captypes:
|
enum Ins:
|
||||||
CONTROL = 1
|
TOTAL_TIME
|
||||||
KBD
|
START
|
||||||
INTERRUPT
|
NUM_INS
|
||||||
|
|
||||||
|
enum Outs:
|
||||||
|
CURRENT_TIME
|
||||||
|
ALARM
|
||||||
|
NUM_OUTS
|
||||||
|
|
||||||
|
typedef UI <NUM_INS, NUM_OUTS> ui_t
|
||||||
|
static ui_t ui
|
||||||
|
static ui_t::in <unsigned> total_time
|
||||||
|
static ui_t::in_event do_start
|
||||||
|
static ui_t::out <unsigned> current_time
|
||||||
|
static ui_t::out_event do_alarm
|
||||||
|
|
||||||
|
static bool ticking
|
||||||
|
|
||||||
|
static void event (unsigned code):
|
||||||
|
switch code:
|
||||||
|
case TOTAL_TIME:
|
||||||
|
break
|
||||||
|
case START:
|
||||||
|
current_time = total_time
|
||||||
|
if !ticking:
|
||||||
|
if !current_time:
|
||||||
|
do_alarm ()
|
||||||
|
else:
|
||||||
|
ticking = true
|
||||||
|
Iris::my_receiver.set_alarm (HZ)
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
Iris::panic (0, "invalid event for alarm clock")
|
||||||
|
|
||||||
Iris::Num start ():
|
Iris::Num start ():
|
||||||
unsigned *screen = (unsigned *)0x40000000
|
ticking = false;
|
||||||
Iris::RTC rtc = Iris::my_parent.get_capability <Iris::RTC> ()
|
Iris::Cap ui_cap = Iris::my_receiver.create_capability (0)
|
||||||
Iris::Display display = Iris::my_parent.get_capability <Iris::Display> ()
|
ui.init (ui_cap.copy ());
|
||||||
display.map_fb ((unsigned)screen)
|
Iris::free_cap (ui_cap)
|
||||||
Iris::Font font = Iris::my_parent.get_capability <Iris::Font> ()
|
total_time.init ()
|
||||||
font.set_display (display)
|
do_start.init ()
|
||||||
Iris::Keyboard keyboard = Iris::my_parent.get_capability <Iris::Keyboard> ()
|
current_time.init ()
|
||||||
Iris::Cap cap = Iris::my_receiver.create_capability (KBD)
|
do_alarm.init ()
|
||||||
keyboard.set_cb (cap.copy ())
|
ui.add_in (&total_time, TOTAL_TIME);
|
||||||
Iris::free_cap (cap)
|
ui.add_in (&do_start, START);
|
||||||
Iris::Buzzer buzzer = Iris::my_parent.get_capability <Iris::Buzzer> ()
|
ui.add_out (¤t_time, CURRENT_TIME);
|
||||||
Iris::Event self = Iris::my_receiver.create_capability (CONTROL)
|
ui.add_out (&do_alarm, ALARM);
|
||||||
Iris::my_parent.provide_capability <Iris::Event> (self)
|
|
||||||
cap = Iris::my_receiver.create_capability (INTERRUPT)
|
|
||||||
Iris::my_parent.init_done ()
|
Iris::my_parent.init_done ()
|
||||||
|
|
||||||
while true:
|
while true:
|
||||||
Iris::wait ()
|
Iris::wait ()
|
||||||
switch Iris::recv.protected_data.l:
|
switch Iris::recv.protected_data.l:
|
||||||
case INTERRUPT:
|
case ~0:
|
||||||
// RTC alarm interrupt.
|
// alarm.
|
||||||
if Iris::recv.data[0].l == ~0:
|
if current_time:
|
||||||
// Not a real interrupt, just an abort notification.
|
current_time = current_time - 1
|
||||||
continue
|
if !current_time:
|
||||||
font.printf ("alarm: RTC alarm interrupt\n")
|
do_alarm ()
|
||||||
break
|
ticking = false
|
||||||
case CONTROL:
|
|
||||||
// Store callback
|
|
||||||
font.printf ("alarm: control event\n")
|
|
||||||
break
|
|
||||||
case KBD:
|
|
||||||
if Iris::recv.data[0].l & Iris::Keyboard::RELEASE:
|
|
||||||
// Key release.
|
|
||||||
Iris::poweroff ()
|
|
||||||
else:
|
else:
|
||||||
// Key press.
|
// TODO: use rtc for scheduling an event.
|
||||||
unsigned time = rtc.get_time ()
|
Iris::my_receiver.set_alarm (HZ)
|
||||||
rtc.set_alarm (time + 5, cap)
|
continue
|
||||||
unsigned alarm = rtc.get_alarm ()
|
case 0:
|
||||||
unsigned enabled = Iris::recv.data[1].l
|
// ui event.
|
||||||
font.printf ("Debug: %d %d %d\n", time, alarm, enabled)
|
if !ui.event (&event):
|
||||||
break
|
// Exit request.
|
||||||
default:
|
return 0
|
||||||
Iris::panic (Iris::recv.protected_data.l, "invalid request for alarm")
|
|
||||||
|
@ -19,9 +19,6 @@
|
|||||||
#include "iris.hh"
|
#include "iris.hh"
|
||||||
#include "devices.hh"
|
#include "devices.hh"
|
||||||
|
|
||||||
// For some unknown reason, gcc needs this to be defined.
|
|
||||||
unsigned __gxx_personality_v0
|
|
||||||
|
|
||||||
struct list:
|
struct list:
|
||||||
list *prev, *next
|
list *prev, *next
|
||||||
|
|
||||||
|
@ -34,15 +34,15 @@
|
|||||||
driver driver_buzzer = "buzzer.elf"
|
driver driver_buzzer = "buzzer.elf"
|
||||||
receive driver_buzzer / Buzzer = buzzer
|
receive driver_buzzer / Buzzer = buzzer
|
||||||
|
|
||||||
#program alarm = "alarm.elf"
|
program alarm = "alarm.elf"
|
||||||
#receive alarm / UI = ui
|
receive alarm / UI = ui
|
||||||
|
|
||||||
#program gui = "gui.elf"
|
program gui = "gui.elf"
|
||||||
#give gui / UI = ui
|
give gui / UI = ui
|
||||||
#give gui / Display = display
|
give gui / Display = display
|
||||||
#give gui / Setting = display_bright
|
give gui / Setting = display_bright
|
||||||
#give gui / Buzzer = buzzer
|
give gui / Buzzer = buzzer
|
||||||
#give gui / Keyboard = keyboard
|
give gui / Keyboard = keyboard
|
||||||
|
|
||||||
#driver sdmmc = "sd+mmc.elf"
|
#driver sdmmc = "sd+mmc.elf"
|
||||||
#receive sdmmc / WBlock = sdmmc
|
#receive sdmmc / WBlock = sdmmc
|
||||||
@ -62,19 +62,19 @@
|
|||||||
#program test = "test.elf"
|
#program test = "test.elf"
|
||||||
#give test / Directory = root
|
#give test / Directory = root
|
||||||
|
|
||||||
file fontfile = "font.dat"
|
#file fontfile = "font.dat"
|
||||||
program font = "font.elf"
|
#program font = "font.elf"
|
||||||
receive font / Font = font
|
#receive font / Font = font
|
||||||
give font / Block = fontfile
|
#give font / Block = fontfile
|
||||||
#give font / Display = display
|
#give font / Display = display
|
||||||
|
|
||||||
driver driver_rtc = "rtc.elf"
|
#driver driver_rtc = "rtc.elf"
|
||||||
receive driver_rtc / RTC = rtc
|
#receive driver_rtc / RTC = rtc
|
||||||
|
|
||||||
driver alarm = "alarm.elf"
|
#driver alarm = "alarm.elf"
|
||||||
give alarm / Keyboard = keyboard
|
#give alarm / Keyboard = keyboard
|
||||||
give alarm / Display = display
|
#give alarm / Display = display
|
||||||
give alarm / Buzzer = buzzer
|
#give alarm / Buzzer = buzzer
|
||||||
give alarm / Font = font
|
#give alarm / Font = font
|
||||||
give alarm / RTC = rtc
|
#give alarm / RTC = rtc
|
||||||
receive alarm / Event = alarm
|
#receive alarm / Event = alarm
|
||||||
|
@ -104,12 +104,10 @@ Iris::Num start ():
|
|||||||
Iris::Font self = Iris::my_receiver.create_capability (0)
|
Iris::Font self = Iris::my_receiver.create_capability (0)
|
||||||
Iris::my_parent.provide_capability <Iris::Font> (self.copy ())
|
Iris::my_parent.provide_capability <Iris::Font> (self.copy ())
|
||||||
Iris::free_cap (self)
|
Iris::free_cap (self)
|
||||||
//display = Iris::my_parent.get_capability <Iris::Display> ()
|
|
||||||
Iris::Block font = Iris::my_parent.get_capability <Iris::Block> ()
|
Iris::Block font = Iris::my_parent.get_capability <Iris::Block> ()
|
||||||
load_font (font)
|
load_font (font)
|
||||||
Iris::free_cap (font)
|
Iris::free_cap (font)
|
||||||
Iris::my_parent.init_done ()
|
Iris::my_parent.init_done ()
|
||||||
//display_caps = display.map_fb (reinterpret_cast <unsigned> (fb))
|
|
||||||
bool have_display = false
|
bool have_display = false
|
||||||
while true:
|
while true:
|
||||||
Iris::wait ()
|
Iris::wait ()
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#define ARCH
|
#define ARCH
|
||||||
#include "arch.hh"
|
#include "arch.hh"
|
||||||
|
|
||||||
__asm__ volatile (".section .rodata\n.globl charset\ncharset:\n.incbin \"source/data/charset.data\"\n.section .text")
|
__asm__ volatile (".section .rodata\n.globl charset\ncharset:\n.incbin \"userspace/data/charset.data\"\n.section .text")
|
||||||
extern unsigned char const charset[127-32][8][6]
|
extern unsigned char const charset[127-32][8][6]
|
||||||
|
|
||||||
#define assert(x) do { if (!(x)) { kdebug ("assertion failed " #x); while (true) {} } } while (0)
|
#define assert(x) do { if (!(x)) { kdebug ("assertion failed " #x); while (true) {} } } while (0)
|
||||||
|
Loading…
Reference in New Issue
Block a user