Browse Source

data abort debugging

mntmn 9 years ago
parent
commit
bbbf30a0e0

BIN
build/kernel7.img


+ 2 - 2
devices/fbfs.c

@@ -1,7 +1,7 @@
 #define WIDTH 1920
 #define HEIGHT 1080
-#define BPP 4
-#define DEPTH 32
+#define BPP 2
+#define DEPTH 16
 
 #include "stream.h"
 

+ 46 - 6
devices/rpi2/arm_start.S

@@ -1,7 +1,36 @@
 .global _start
 .global _get_stack_pointer
- 
+
+// https://github.com/dwelch67/raspberrypi/blob/master/float02/vectors.s
+
 _start:
+  ldr pc,reset_handler
+  ldr pc,undefined_handler
+  ldr pc,swi_handler
+  ldr pc,prefetch_handler
+  ldr pc,=data_handler
+  ldr pc,unused_handler
+  ldr pc,irq_handler
+  ldr pc,fiq_handler
+reset_handler:      .word reset
+undefined_handler:  .word undef
+swi_handler:        .word hang
+prefetch_handler:   .word hang
+data_handler:       .word hang
+unused_handler:     .word hang
+irq_handler:        .word hang
+fiq_handler:        .word hang
+
+reset:
+  // copy vectors to #0000
+  mov r0,#0x8000
+  mov r1,#0x0000
+  ldmia r0!,{r2,r3,r4,r5,r6,r7,r8,r9}
+  stmia r1!,{r2,r3,r4,r5,r6,r7,r8,r9}
+  ldmia r0!,{r2,r3,r4,r5,r6,r7,r8,r9}
+  stmia r1!,{r2,r3,r4,r5,r6,r7,r8,r9}
+
+  // init stack
   ldr     sp, =stack_top
   sub     sp, sp, #0x4
 
@@ -23,10 +52,10 @@ _start:
 	fmxr FPEXC, r0
 
   // enable unaligned access
-  mrc p15, #0, r0, c1, c0, #0
-  orr r0, #0x400000         // 1<<22 set U bit
+  /*mrc p15, #0, r0, c1, c0, #0
   bic r0, r0, #2 // clear A bit
-	mcr p15, #0, r0, c1, c0, #0
+  orr r0, #0x400000         // 1<<22 set U bit
+	mcr p15, #0, r0, c1, c0, #0*/
   
 	// jump to kernel_main
 	ldr r3, =_cstartup
@@ -34,17 +63,28 @@ _start:
  
 _inf_loop:
   b       _inf_loop
- 
+
 _get_stack_pointer:
   // Return the stack pointer value
   str     sp, [sp]
   ldr     r0, [sp]
   mov     pc, lr
-  
+
+hang:
+    b hang
+    .word 0
+    .word 0
+
+undef:
+    b .
+    .word 0
+    .word 0
+
 // constants for ldr macro
 constants:
 .ltorg
 .section ".bss"
+  
 // 16k stack aligned to 4 byte
 .balign 4
 .global stack

+ 1 - 1
devices/rpi2/fatfs.c

@@ -82,7 +82,7 @@ Cell* fatfs_open(Cell* cpath) {
 }
 
 Cell* fatfs_read(Cell* stream) {
-  return _fatfs_stream;
+  return alloc_clone(_fatfs_stream);
 }
 
 Cell* fatfs_mmap(Cell* stream) {

+ 11 - 7
devices/rpi2/main_rpi2.c

@@ -73,14 +73,14 @@ void main()
   sprintf(buf, "-- stack pointer at %p.\r\n", _get_stack_pointer());
   uart_puts(buf);
 
-  memset(FB, 0x88, 1920*1080*4);
+  memset(FB, 0xff, 1920*1080*2);
   
   // uspi glue
-  printf("uu uspi glue init…\r\n");
-  extern void uspi_glue_init();
-  uspi_glue_init();
+  //printf("uu uspi glue init…\r\n");
+  //extern void uspi_glue_init();
+  //uspi_glue_init();
 
-  printf("uu USPiInitialize…\r\n");
+  /*printf("uu USPiInitialize…\r\n");
   int res = USPiInitialize();
   printf("uu USPI initialization: %d\r\n", res);
   
@@ -93,11 +93,11 @@ void main()
   have_eth = USPiEthernetAvailable();
   printf("uu USPI has ethernet: %d\r\n", have_eth);
 
-  eth_rx_buffer=malloc(64*1024);
+  eth_rx_buffer=malloc(64*1024);*/
   
   libfs_init();
   
-  memset(FB, 0x44, 1920*1080*4);
+  memset(FB, 0x44, 1920*1080*2);
   
   uart_repl();
 }
@@ -337,6 +337,10 @@ Cell* platform_eval_string(Cell* strc); // FIXME
   init_mini_ip(udp_cell);
   }*/
 
+void data_handler() {
+  uart_puts("~~ data abort!\r\n");
+}
+
 #define CODESZ 4096
 
 void uart_repl() {

+ 3 - 1
devices/rpi2/raspi.c

@@ -253,7 +253,7 @@ uint32_t* init_rpi_gfx()
     t_set_depth,
     4,
     4,
-    32,
+    16,
 
     t_set_virtual_offset,
     8,
@@ -367,5 +367,7 @@ void enable_mmu(void)
   /* Enable the MMU */
   __asm("mrc p15, 0, %0, c1, c0, 0" : "=r" (reg) : : "cc");
   reg|=MMU_MODE; // 0x1
+  reg&=~2;       // clear A bit
+  reg|=0x400000; // 1<<22 set U bit
   __asm("mcr p15, 0, %0, c1, c0, 0" : : "r" (reg) : "cc");
 }

+ 2 - 2
os/mini-ip.c

@@ -3,7 +3,7 @@
 #include "sledge/minilisp.h"
 #include "sledge/alloc.h"
 
-// mini-ip is part of bomberjacket OS, written in 2015 by mntmn.
+// mini-ip is part of interim OS, written in 2015 by mntmn.
 
 #define jit_word_t uint32_t
 typedef jit_word_t (*funcptr)();
@@ -168,7 +168,7 @@ void eth_task() {
 
   len = ethernet_rx(rx_packet);
   if (len) {
-    printf("eth_task rx: %d\r\n",len);
+    printf("[eth_task] rx: %d\r\n",len);
     //b_system_misc(debug_dump_mem, rx_packet, len);
     //printf("\n");
 

+ 1 - 0
os/rootfs/mk565.sh

@@ -0,0 +1 @@
+avconv -vcodec png -i unifont.png -vcodec rawvideo -f rawvideo -pix_fmt rgb565 unifont.565

File diff suppressed because it is too large
+ 0 - 0
os/rootfs/unifont.565


BIN
os/rootfs/unifont.png


+ 1 - 1
rpi2-build.sh

@@ -5,7 +5,7 @@
 NEWLIB="/usr/lib/arm-none-eabi/newlib"
 
 set -e
-GCC_OPTS=" -g -O2 -nostartfiles -nostdlib -mhard-float -ffreestanding -fno-toplevel-reorder -mcpu=cortex-a7 -mfpu=neon-vfpv4 -std=gnu11 -L$NEWLIB/fpu -I./sledge -I. -I/usr/include/newlib -Idevices/rpi2/uspi/env/include/ -DCPU_ARM "
+GCC_OPTS=" -g -O2 -nostartfiles -nostdlib -mhard-float -ffreestanding -mno-unaligned-access -fno-toplevel-reorder -mcpu=cortex-a7 -mfpu=neon-vfpv4 -std=gnu11 -L$NEWLIB/fpu -I./sledge -I. -I/usr/include/newlib -Idevices/rpi2/uspi/env/include/ -DCPU_ARM "
 
 COMPILE="arm-none-eabi-gcc $GCC_OPTS"
 

+ 2 - 1
rpi2-deploy.sh

@@ -1,6 +1,7 @@
 sudo mount /dev/sdb1 /1/
 sudo cp ./build/kernel7.img /1/
-sudo cp ./sledge/tests/gfxtest4.l /1/
+sudo cp ./sledge/tests/font.l /1/
+sudo cp ./os/rootfs/unifont.565 /1/
 sudo sync
 sudo umount /dev/sdb1
 sudo sync

+ 1 - 0
sledge/alloc.c

@@ -72,6 +72,7 @@ Cell* cell_alloc() {
 void* bytes_alloc(int num_bytes) {
 //#ifdef SLEDGE_MALLOC
   void* new_mem = malloc(num_bytes);
+  printf("bytes_alloc: %p +%d\r\n",new_mem,num_bytes);
   memset(new_mem, 0, num_bytes);
   return new_mem;
 //#endif

+ 30 - 24
sledge/compiler_new.c

@@ -755,25 +755,25 @@ int compile_expr(Cell* expr, Frame* frame, int return_type) {
       jit_movi(R1,0);    
       load_cell(R3,argdefs[0], frame);
       load_int(R2,argdefs[1], frame); // offset -> R2
-      jit_cmpi(R2,0);
-      jit_jneg(label_skip); // negative offset?
+      //jit_cmpi(R2,0);
+      //jit_jneg(label_skip); // negative offset?
 
-      jit_movr(R0,R3);
-      jit_addi(R0,PTRSZ); // fetch size -> R0
-      jit_ldr(R0);
+      //jit_movr(R0,R3);
+      //jit_addi(R0,PTRSZ); // fetch size -> R0
+      //jit_ldr(R0);
 
-      jit_subr(R0,R2);
-      jit_jneg(label_skip); // overflow? (R2>R0)
-      jit_je(label_skip); // overflow? (R2==R0)
+      //jit_subr(R0,R2);
+      //jit_jneg(label_skip); // overflow? (R2>R0)
+      //jit_je(label_skip); // overflow? (R2==R0)
 
-      jit_movr(R1,R2);
+      //jit_movr(R1,R2);
       jit_ldr(R3); // string address
       jit_addr(R1,R3);
       jit_ldrb(R1);
 
-      jit_label(label_skip);
+      //jit_label(label_skip);
       
-      jit_movr(ARGR0, R0); // FIXME
+      jit_movr(ARGR0, R1);
       jit_call(alloc_int,"alloc_int");
       break;
     }
@@ -784,30 +784,32 @@ int compile_expr(Cell* expr, Frame* frame, int return_type) {
       //sprintf(label_noskip,"noskip_%d",label_skip_count);
     
       load_cell(R1,argdefs[0], frame);
-      jit_push(R1,R1);
-      frame->sp++;
+      //jit_push(R1,R1);
+      //frame->sp++;
       load_int(R2,argdefs[1], frame); // offset -> R2
-      jit_cmpi(R2,0);
-      jit_jneg(label_skip); // negative offset?
+      //jit_cmpi(R2,0);
+      //jit_jneg(label_skip); // negative offset?
       load_int(R3,argdefs[2], frame); // byte to store -> R3
 
-      jit_movr(R0,R1);
-      jit_addi(R0,PTRSZ); // fetch size -> R0
-      jit_ldr(R0);
+      //jit_movr(R0,R1);
+      //jit_addi(R0,PTRSZ); // fetch size -> R0
+      //jit_ldr(R0);
 
-      jit_subr(R0,R2);
-      jit_jneg(label_skip); // overflow? (R2>R0)
-      jit_je(label_skip); // overflow? (R2==R0)
+      //jit_subr(R0,R2);
+      //jit_jneg(label_skip); // overflow? (R2>R0)
+      //jit_je(label_skip); // overflow? (R2==R0)
 
       jit_ldr(R1); // string address
       jit_addr(R1,R2);
       jit_strb(R1); // strb is always from R3
+
+      jit_movr(R0,R1);
       
       //jit_jmp(label_noskip);
       
-      jit_label(label_skip);
-      jit_pop(R0,R0); // restore arg0
-      frame->sp--;
+      //jit_label(label_skip);
+      //jit_pop(R0,R0); // restore arg0
+      //frame->sp--;
       //jit_lea(R0,alloc_error(ERR_OUT_OF_BOUNDS));
       //jit_label(label_noskip);
       
@@ -932,14 +934,18 @@ int compile_expr(Cell* expr, Frame* frame, int return_type) {
     }
     case BUILTIN_RECV: {
       load_cell(ARGR0,argdefs[0], frame);
+      push_frame_regs(frame->f);
       jit_call(stream_read,"stream_read");
+      pop_frame_regs(frame->f);
       break;
     }
     case BUILTIN_SEND: {
       load_cell(ARGR0,argdefs[0], frame);
       load_cell(ARGR1,argdefs[1], frame);
       // FIXME clobbers stuff
+      push_frame_regs(frame->f);
       jit_call(stream_write,"stream_write");
+      pop_frame_regs(frame->f);
       break;
     }
     }

+ 30 - 0
sledge/tests/font.l

@@ -0,0 +1,30 @@
+(def fb (mmap "/framebuffer"))
+
+(def f (open "/sd/unifont.565"))
+
+(do (def unifont (recv f)) 0)
+
+(def unifont-pitch 8256)
+
+(def screen-pitch 3840)
+
+(def blit-char (fn rune x y (do
+  (let sx (* (+ 2 (% rune 256)) 16))
+  (let sy (* (+ 4 (/ rune 256)) 16))
+  (let so (+ (* sx 2) (* sy unifont-pitch)))
+  (let do (+ (*  x 2) (*  y screen-pitch)))
+  (let iy 0)
+  
+  (while (lt iy 16) (do
+    (let ix 0)
+    (while (lt ix 32) (do
+      (let c (get32 unifont (+ so ix)))
+      (put32 fb (+ do ix) c)
+      (let ix (+ ix 2))
+    ))
+    (let so (- (+ so unifont-pitch) 16))
+    (let do (- (+ do screen-pitch) 16))
+    (let iy (+ iy 1))
+  ))
+)))
+

+ 2 - 0
sledge/tests/gfxtest4.l

@@ -1,4 +1,5 @@
 (def fb (mmap "/framebuffer"))
+(def f (open "/framebuffer"))
 
 (def draw-bg (fn c (do
     (let c (+ 1 c))
@@ -102,6 +103,7 @@
 
     ; collect garbage
     (let tick (+ tick 1))
+    (send f 0)
     (if (gt tick 100) (do
       (gc)
       (let tick 0)

+ 2 - 0
sledge/tests/startup.l

@@ -0,0 +1,2 @@
+(def f (open "/sd/font.l"))
+(def s (recv f))

Some files were not shown because too many files changed in this diff