Sfoglia il codice sorgente

fw: link against newlib-nano

newlib is a bit big, but we can link against newlib-nano to avoid
having to implement a bunch of C standards stuff ourselves.
H. Peter Anvin 3 anni fa
parent
commit
aad6fa3aad
9 ha cambiato i file con 516 aggiunte e 59 eliminazioni
  1. 21 9
      fw/Makefile
  2. 6 0
      fw/bin2mif.pl
  3. 120 12
      fw/boot.0.mif
  4. 118 10
      fw/boot.1.mif
  5. 122 14
      fw/boot.2.mif
  6. 121 13
      fw/boot.3.mif
  7. 0 0
      fw/boot.mif
  8. 1 1
      fw/hello.c
  9. 7 0
      fw/include/compiler.h

+ 21 - 9
fw/Makefile

@@ -5,9 +5,19 @@ CC	  = $(CROSS)gcc
 LD	  = $(CROSS)ld
 OBJCOPY   = $(CROSS)objcopy
 PERL      = perl
-CFLAGS	  =  -march=rv32imc -O2 -ggdb3 -mabi=ilp32 \
+INCLUDE   = -I. -I./include
+CPPFLAGS  = $(INCLUDE) \
+	     -march=rv32imc -mabi=ilp32 -mdiv -Os -ggdb3 \
+	     -fwrapv -fvisibility=hidden -fno-strict-aliasing \
+	     -frename-registers \
 	     -mshorten-memrefs -mno-strict-align
-LDFLAGS   = --section-start=.init=0 -z common-page-size=16 -z max-page-size=16
+# These require newlib to be built with the same options; would be nice
+CPPFLAGS_NOT = -fshort-enums -fshort-wchar
+CFLAGS    = $(CPPFLAGS)
+SFLAGS    = $(CPPFLAGS) -D__ASSEMBLY__
+LDFLAGS   = $(CFLAGS) --specs=nano.specs \
+	    -Wl,--section-start=.init=0 -Wl,-q \
+	    -Wl,-z,common-page-size=16 -Wl,-z,max-page-size=16
 
 # Delete output files on error
 .DELETE_ON_ERROR:
@@ -17,11 +27,13 @@ LDFLAGS   = --section-start=.init=0 -z common-page-size=16 -z max-page-size=16
 
 all: boot.mif
 
-boot.elf: head.o hello.o
+# Generate MIF files for 4 8×2K RAMs
 boot_depth  := 2048
 boot_width  := 8
 boot_stride := 4
 
+boot.elf: head.o hello.o
+
 %.mif: %.bin bin2mif.pl
 	$(PERL) bin2mif.pl $< $@ $($*_depth) $($*_width) $($*_stride)
 
@@ -35,22 +47,22 @@ boot_stride := 4
 	$(OBJCOPY) -O binary $< $@
 
 %.elf:
-	$(LD) $(LDFLAGS) -o $@ $^
+	$(CC) $(LDFLAGS) -o $@ $^
 
 %.o: %.c
-	$(CC) $(CFLAGS) -c -o $@ $<
+	$(CC) $(CFLAGS) $(CFLAGS_$<) -c -o $@ $<
 
 %.s: %.c
-	$(CC) $(CFLAGS) -S -o $@ $<
+	$(CC) $(CFLAGS) $(CFLAGS_$<) -S -o $@ $<
 
 %.i: %.c
-	$(CC) $(CFLAGS) -E -o $@ $<
+	$(CC) $(CFLAGS) $(CFLAGS_$<) -E -o $@ $<
 
 %.o: %.S
-	$(CC) $(CFLAGS) -c -o $@ $<
+	$(CC) $(SFLAGS) $(SFLAGS_$<) -c -o $@ $<
 
 %.s: %.S
-	$(CC) $(CFLAGS) -E -o $@ $<
+	$(CC) $(SFLAGS) $(SFLAGS_$<) -E -o $@ $<
 
 clean:
 	rm -f *.o *.i *.s *.elf *.bin

+ 6 - 0
fw/bin2mif.pl

@@ -66,5 +66,11 @@ for (my $s = 0; $s < $stride; $s++) {
     close($out);
 }
 
+if ($stride > 1) {
+    # Create an empty file for the benefit of make
+    open(my $out, '>', $outfile) or die;
+    close($out);
+}
+
 exit 0;
     

+ 120 - 12
fw/boot.0.mif

@@ -10,16 +10,124 @@ CONTENT BEGIN
 002 : 00;
 003 : 00;
 004 : 6F;
-005 : 01;
-006 : 00;
-007 : 80;
-008 : 00;
-009 : E6;
-00A : 17;
-00B : 7D;
-00C : 48;
-00D : 6F;
-00E : 6F;
-00F : 21;
-[010..7FF] : 00;
+005 : 41;
+006 : 06;
+007 : 00;
+008 : 91;
+009 : 97;
+00A : E7;
+00B : 03;
+00C : 1C;
+00D : 82;
+00E : ED;
+00F : 80;
+010 : 00;
+011 : 02;
+012 : 01;
+013 : E6;
+014 : CD;
+015 : 00;
+016 : 21;
+017 : 00;
+018 : C0;
+019 : 81;
+01A : 13;
+01B : 19;
+01C : 00;
+01D : 00;
+01E : 00;
+01F : 02;
+020 : 01;
+021 : 41;
+022 : 22;
+023 : 00;
+024 : 89;
+025 : 00;
+026 : 13;
+027 : 97;
+028 : E7;
+029 : 85;
+02A : F0;
+02B : 22;
+02C : 82;
+02D : 00;
+02E : 93;
+02F : 13;
+030 : 17;
+031 : 67;
+032 : 82;
+033 : 41;
+034 : 26;
+035 : C0;
+036 : C0;
+037 : 4A;
+038 : 09;
+039 : C0;
+03A : 63;
+03B : 93;
+03C : 13;
+03D : 1D;
+03E : 93;
+03F : 01;
+040 : 89;
+041 : 22;
+042 : 02;
+043 : 82;
+044 : 05;
+045 : 82;
+046 : 9C;
+047 : 91;
+048 : F9;
+049 : 11;
+04A : B3;
+04B : 05;
+04C : 82;
+04D : D0;
+04E : 00;
+04F : 05;
+050 : 22;
+051 : 06;
+052 : 80;
+053 : 00;
+054 : 01;
+055 : C0;
+056 : 48;
+057 : 6F;
+058 : 6F;
+059 : 21;
+05A : 00;
+05B : 00;
+05C : 00;
+05D : 00;
+05E : 00;
+05F : B2;
+060 : 86;
+061 : 00;
+062 : 00;
+063 : 00;
+064 : 00;
+065 : 00;
+066 : 00;
+067 : 00;
+068 : 00;
+069 : 00;
+06A : 00;
+06B : 00;
+06C : 00;
+06D : 00;
+06E : 00;
+06F : 00;
+070 : 00;
+071 : 00;
+072 : 00;
+073 : 00;
+074 : 00;
+075 : 00;
+076 : 00;
+077 : 00;
+078 : 00;
+079 : 84;
+07A : 00;
+07B : 84;
+[07C..7FF] : 00;
 END;

+ 118 - 10
fw/boot.1.mif

@@ -10,16 +10,124 @@ CONTENT BEGIN
 002 : 00;
 003 : 00;
 004 : 00;
-005 : A0;
-006 : 03;
-007 : 04;
-008 : C0;
+005 : 11;
+006 : C6;
+007 : 00;
+008 : C7;
 009 : 00;
 00A : 00;
-00B : FB;
-00C : 65;
-00D : 2C;
-00E : 72;
-00F : 0D;
-[010..7FF] : 00;
+00B : 25;
+00C : 55;
+00D : 97;
+00E : 28;
+00F : 15;
+010 : C0;
+011 : 00;
+012 : A0;
+013 : 00;
+014 : BF;
+015 : 00;
+016 : 99;
+017 : 1F;
+018 : 20;
+019 : 45;
+01A : 05;
+01B : C5;
+01C : 00;
+01D : 00;
+01E : 00;
+01F : 45;
+020 : 46;
+021 : BF;
+022 : C4;
+023 : 1F;
+024 : EF;
+025 : 00;
+026 : 05;
+027 : 00;
+028 : 00;
+029 : 47;
+02A : 1E;
+02B : 44;
+02C : 80;
+02D : 00;
+02E : 05;
+02F : 05;
+030 : 03;
+031 : 00;
+032 : 80;
+033 : 11;
+034 : C2;
+035 : 17;
+036 : 17;
+037 : C0;
+038 : 84;
+039 : 17;
+03A : 13;
+03B : 07;
+03C : 04;
+03D : 8C;
+03E : 04;
+03F : 49;
+040 : 00;
+041 : 44;
+042 : 49;
+043 : 80;
+044 : 09;
+045 : 97;
+046 : 40;
+047 : 04;
+048 : BF;
+049 : C6;
+04A : 00;
+04B : 03;
+04C : 80;
+04D : 05;
+04E : 00;
+04F : 00;
+050 : C4;
+051 : C6;
+052 : 40;
+053 : C1;
+054 : A0;
+055 : 1E;
+056 : 65;
+057 : 2C;
+058 : 72;
+059 : 0D;
+05A : 00;
+05B : 00;
+05C : 00;
+05D : 00;
+05E : 00;
+05F : 00;
+060 : 00;
+061 : 00;
+062 : 00;
+063 : 00;
+064 : 00;
+065 : 00;
+066 : 00;
+067 : 00;
+068 : 00;
+069 : 00;
+06A : 00;
+06B : 00;
+06C : 00;
+06D : 00;
+06E : 00;
+06F : 00;
+070 : 00;
+071 : 00;
+072 : 00;
+073 : 00;
+074 : 00;
+075 : 00;
+076 : 00;
+077 : 00;
+078 : 00;
+079 : 01;
+07A : 00;
+07B : 01;
+[07C..7FF] : 00;
 END;

+ 122 - 14
fw/boot.2.mif

@@ -5,21 +5,129 @@ WIDTH = 8;
 ADDRESS_RADIX = HEX;
 DATA_RADIX = HEX;
 CONTENT BEGIN
-000 : 60;
+000 : 20;
 001 : 00;
 002 : 00;
 003 : 00;
-004 : 40;
-005 : 93;
-006 : 13;
-007 : B7;
-008 : 23;
-009 : 03;
-00A : 85;
-00B : 01;
-00C : 6C;
-00D : 20;
-00E : 6C;
-00F : 0A;
-[010..7FF] : 00;
+004 : A0;
+005 : 22;
+006 : 93;
+007 : 2A;
+008 : 81;
+009 : 00;
+00A : 00;
+00B : 40;
+00C : 91;
+00D : 22;
+00E : 93;
+00F : B7;
+010 : 03;
+011 : 11;
+012 : 23;
+013 : 85;
+014 : 97;
+015 : 93;
+016 : 13;
+017 : 13;
+018 : 09;
+019 : 75;
+01A : 00;
+01B : 13;
+01C : 97;
+01D : E7;
+01E : 89;
+01F : 4C;
+020 : 65;
+021 : 41;
+022 : 83;
+023 : 06;
+024 : 93;
+025 : 99;
+026 : 80;
+027 : 00;
+028 : 00;
+029 : 23;
+02A : B2;
+02B : 41;
+02C : 93;
+02D : 89;
+02E : 40;
+02F : 80;
+030 : 00;
+031 : 00;
+032 : 01;
+033 : 22;
+034 : 93;
+035 : 13;
+036 : 1D;
+037 : 06;
+038 : 93;
+039 : 01;
+03A : 89;
+03B : C0;
+03C : 00;
+03D : 09;
+03E : C0;
+03F : 63;
+040 : B2;
+041 : 92;
+042 : 41;
+043 : 9C;
+044 : 91;
+045 : C9;
+046 : 05;
+047 : 82;
+048 : 2A;
+049 : 23;
+04A : 7D;
+04B : 65;
+04C : 93;
+04D : 73;
+04E : 63;
+04F : 41;
+050 : 2A;
+051 : 33;
+052 : 21;
+053 : 01;
+054 : 03;
+055 : 82;
+056 : 6C;
+057 : 20;
+058 : 6C;
+059 : 0A;
+05A : 00;
+05B : 00;
+05C : 00;
+05D : 00;
+05E : 00;
+05F : 00;
+060 : 00;
+061 : 00;
+062 : 00;
+063 : 00;
+064 : 00;
+065 : 00;
+066 : 00;
+067 : 00;
+068 : 00;
+069 : 00;
+06A : 00;
+06B : 00;
+06C : 00;
+06D : 00;
+06E : 00;
+06F : 00;
+070 : 00;
+071 : 00;
+072 : 00;
+073 : 00;
+074 : 00;
+075 : 00;
+076 : 00;
+077 : 00;
+078 : 00;
+079 : 00;
+07A : 00;
+07B : 00;
+[07C..7FF] : 00;
 END;

+ 121 - 13
fw/boot.3.mif

@@ -5,21 +5,129 @@ WIDTH = 8;
 ADDRESS_RADIX = HEX;
 DATA_RADIX = HEX;
 CONTENT BEGIN
-000 : 01;
+000 : 05;
 001 : 00;
 002 : 00;
 003 : 00;
-004 : 00;
-005 : 07;
+004 : 0B;
+005 : C4;
 006 : 07;
-007 : 06;
-008 : 80;
-009 : C7;
-00A : 07;
-00B : A0;
-00C : 6C;
-00D : 57;
-00E : 64;
-00F : 00;
-[010..7FF] : 00;
+007 : 84;
+008 : 45;
+009 : 00;
+00A : 00;
+00B : 1E;
+00C : C3;
+00D : 85;
+00E : 02;
+00F : 06;
+010 : C7;
+011 : E3;
+012 : 80;
+013 : 02;
+014 : 11;
+015 : 81;
+016 : 05;
+017 : 06;
+018 : 8E;
+019 : 28;
+01A : 00;
+01B : 05;
+01C : 00;
+01D : 00;
+01E : 28;
+01F : 00;
+020 : 3F;
+021 : 11;
+022 : 47;
+023 : C6;
+024 : 07;
+025 : C7;
+026 : 17;
+027 : 00;
+028 : 00;
+029 : 08;
+02A : 40;
+02B : 01;
+02C : 07;
+02D : CB;
+02E : 1F;
+02F : 17;
+030 : 00;
+031 : 00;
+032 : A0;
+033 : C4;
+034 : 07;
+035 : 04;
+036 : 8C;
+037 : C6;
+038 : 04;
+039 : 49;
+03A : 02;
+03B : 17;
+03C : 18;
+03D : 84;
+03E : 17;
+03F : 1D;
+040 : 40;
+041 : 44;
+042 : 01;
+043 : 40;
+044 : 04;
+045 : BF;
+046 : 09;
+047 : 97;
+048 : 83;
+049 : 00;
+04A : 16;
+04B : FE;
+04C : 08;
+04D : 00;
+04E : 5B;
+04F : 11;
+050 : 84;
+051 : 04;
+052 : 20;
+053 : A0;
+054 : 25;
+055 : 80;
+056 : 6C;
+057 : 57;
+058 : 64;
+059 : 00;
+05A : 00;
+05B : 00;
+05C : 00;
+05D : 00;
+05E : 00;
+05F : 00;
+060 : 00;
+061 : 00;
+062 : 00;
+063 : 00;
+064 : 00;
+065 : 00;
+066 : 00;
+067 : 00;
+068 : 00;
+069 : 00;
+06A : 00;
+06B : 00;
+06C : 00;
+06D : 00;
+06E : 00;
+06F : 00;
+070 : 00;
+071 : 00;
+072 : 00;
+073 : 00;
+074 : 00;
+075 : 00;
+076 : 00;
+077 : 00;
+078 : 00;
+079 : 00;
+07A : 00;
+07B : 00;
+[07C..7FF] : 00;
 END;

+ 0 - 0
fw/boot.mif


+ 1 - 1
fw/hello.c

@@ -6,7 +6,7 @@ void die(void)
 	;
 }
 
-void _start(int y)
+int main(void)
 {
     static const char hello[] = "Hello, World!\r\n";
     const char *p;

+ 7 - 0
fw/include/compiler.h

@@ -0,0 +1,7 @@
+#ifndef COMPILER_H
+#define COMPILER_H
+
+#define likely(x)   __builtin_expect(!!(x),1)
+#define unlikely(x) __builtin_expect(!!(x),0)
+
+#endif /* COMPILER_H */