Sanify Teensy linker script

There were a bunch of specially named sections that were either not used
or used for something different than their name, and they were all
unnecessary.

Change-Id: I378f6affdc0cd208c876aa00ca2f80d9b53abce1
diff --git a/motors/core/mk20dx128.c b/motors/core/mk20dx128.c
index 9709a11..f7dbd09 100644
--- a/motors/core/mk20dx128.c
+++ b/motors/core/mk20dx128.c
@@ -50,13 +50,13 @@
 // Flash Options
 #define FOPT 0xF9
 
-extern unsigned long _stext;
-extern unsigned long _etext;
-extern unsigned long _sdata;
-extern unsigned long _edata;
-extern unsigned long _sbss;
-extern unsigned long _ebss;
-extern unsigned long _estack;
+extern uint32_t __bss_ram_start__[];
+extern uint32_t __bss_ram_end__[];
+extern uint32_t __data_ram_start__[];
+extern uint32_t __data_ram_end__[];
+extern uint32_t __data_flash_start__[];
+extern uint32_t __heap_start__[];
+extern uint32_t __stack_end__[];
 
 extern int main(void);
 void ResetHandler(void);
@@ -191,27 +191,28 @@
 void portcd_isr(void) __attribute__((weak, alias("unused_isr")));
 void software_isr(void) __attribute__((weak, alias("unused_isr")));
 
-__attribute__((section(".dmabuffers"), used, aligned(512))) void (
+__attribute__((used, aligned(512))) void (
     *_VectorsRam[NVIC_NUM_INTERRUPTS + 16])(void);
 
 __attribute__((section(".vectors"), used)) void (
     *const _VectorsFlash[NVIC_NUM_INTERRUPTS + 16])(void) = {
-    (void (*)(void))((unsigned long)&_estack),  //  0 ARM: Initial Stack Pointer
-    ResetHandler,         //  1 ARM: Initial Program Counter
-    nmi_isr,              //  2 ARM: Non-maskable Interrupt (NMI)
-    hard_fault_isr,       //  3 ARM: Hard Fault
-    memmanage_fault_isr,  //  4 ARM: MemManage Fault
-    bus_fault_isr,        //  5 ARM: Bus Fault
-    usage_fault_isr,      //  6 ARM: Usage Fault
-    fault_isr,            //  7 --
-    fault_isr,            //  8 --
-    fault_isr,            //  9 --
-    fault_isr,            // 10 --
-    svcall_isr,           // 11 ARM: Supervisor call (SVCall)
-    debugmonitor_isr,     // 12 ARM: Debug Monitor
-    fault_isr,            // 13 --
-    pendablesrvreq_isr,   // 14 ARM: Pendable req serv(PendableSrvReq)
-    systick_isr,          // 15 ARM: System tick timer (SysTick)
+    (void (*)(void))((unsigned long)
+                     __stack_end__),  //  0 ARM: Initial Stack Pointer
+    ResetHandler,                     //  1 ARM: Initial Program Counter
+    nmi_isr,                          //  2 ARM: Non-maskable Interrupt (NMI)
+    hard_fault_isr,                   //  3 ARM: Hard Fault
+    memmanage_fault_isr,              //  4 ARM: MemManage Fault
+    bus_fault_isr,                    //  5 ARM: Bus Fault
+    usage_fault_isr,                  //  6 ARM: Usage Fault
+    fault_isr,                        //  7 --
+    fault_isr,                        //  8 --
+    fault_isr,                        //  9 --
+    fault_isr,                        // 10 --
+    svcall_isr,                       // 11 ARM: Supervisor call (SVCall)
+    debugmonitor_isr,                 // 12 ARM: Debug Monitor
+    fault_isr,                        // 13 --
+    pendablesrvreq_isr,  // 14 ARM: Pendable req serv(PendableSrvReq)
+    systick_isr,         // 15 ARM: System tick timer (SysTick)
 #if defined(__MK20DX256__)
     dma_ch0_isr,       // 16 DMA channel 0 transfer complete
     dma_ch1_isr,       // 17 DMA channel 1 transfer complete
@@ -410,8 +411,6 @@
 __attribute__((section(".startup"), optimize("-Os")))
 #endif
 void ResetHandler(void) {
-  uint32_t *src = &_etext;
-  uint32_t *dest = &_sdata;
   unsigned int i;
 
   WDOG_UNLOCK = WDOG_UNLOCK_SEQ1;
@@ -446,10 +445,19 @@
   // so we can into other sleep modes in the future at any speed
   SMC_PMPROT = SMC_PMPROT_AVLP | SMC_PMPROT_ALLS | SMC_PMPROT_AVLLS;
 
-  // TODO: do this while the PLL is waiting to lock....
-  while (dest < &_edata) *dest++ = *src++;
-  dest = &_sbss;
-  while (dest < &_ebss) *dest++ = 0;
+  {
+    uint32_t *src = __data_flash_start__;
+    uint32_t *dest = __data_ram_start__;
+    while (dest < __data_ram_end__) {
+      *dest++ = *src++;
+    }
+  }
+  {
+    uint32_t *dest = __bss_ram_start__;
+    while (dest < __bss_ram_end__) {
+      *dest++ = 0;
+    }
+  }
 
   // default all interrupts to medium priority level
   for (i = 0; i < NVIC_NUM_INTERRUPTS + 16; i++)
@@ -547,7 +555,7 @@
   }
 }
 
-char *__brkval = (char *)&_ebss;
+char *__brkval = (char *)__heap_start__;
 
 #ifndef STACK_MARGIN
 #if defined(__MKL26Z64__)
diff --git a/motors/core/mk64fx512.ld b/motors/core/mk64fx512.ld
index 43a63ad..df874a6 100644
--- a/motors/core/mk64fx512.ld
+++ b/motors/core/mk64fx512.ld
@@ -34,6 +34,7 @@
   RAM  (rwx) : ORIGIN = 0x1FFF0000, LENGTH = 192K
 }
 
+ENTRY(_VectorsFlash);
 
 SECTIONS
 {
@@ -64,48 +65,32 @@
   } > FLASH
   _etext = .;
 
-  .usbdescriptortable (NOLOAD) : {
-    /* . = ORIGIN(RAM); */
-    _sram = .;
-    . = ALIGN(512);
-    *(.usbdescriptortable*)
-  } > RAM
-
-  .dmabuffers (NOLOAD) : {
-    . = ALIGN(4);
-    *(.dmabuffers*)
-  } > RAM
-
-  .usbbuffers (NOLOAD) : {
-    . = ALIGN(4);
-    *(.usbbuffers*)
-  } > RAM
-
-  .data : AT (_etext) {
-    . = ALIGN(4);
-    _sdata = .; 
-    *(SORT_BY_ALIGNMENT(.data*))
-    . = ALIGN(4);
-    _edata = .; 
-  } > RAM
-
-  .noinit (NOLOAD) : {
-    *(.noinit*)
-  } > RAM
-
+  /* Deliberately putting .bss before .data because we end up with some things
+   * in here that have large alignments, so this minimizes padding.
+   */
   .bss : {
     . = ALIGN(4);
-    _sbss = .;
-    __bss_start__ = .;
+    __bss_ram_start__ = .;
     *(SORT_BY_ALIGNMENT(.bss*))
     /* Stupid precompiled libc has common symbols, so stick them in. */
     */libc_nano.a:*(COMMON)
     . = ALIGN(4);
-    _ebss = .;
-    __bss_end = .;
-    __bss_end__ = .;
+    __bss_ram_end__ = .;
   } > RAM
 
+  .data : AT (_etext) {
+    . = ALIGN(4);
+    __data_ram_start__ = .;
+    *(SORT_BY_ALIGNMENT(.data*))
+    . = ALIGN(4);
+    __data_ram_end__ = .;
+  } > RAM
+
+  __data_flash_start__ = LOADADDR(.data);
+
+  . = ALIGN(8);
+  __heap_start__ = .;
+
   /* We don't want any common symbols, so just don't include them which results
    * in linker errors if any do show up somehow.
    * Contrary to sanity, even with --orphan-handling=error the linker will still
@@ -114,9 +99,5 @@
     *(COMMON);
   }
 
-  _estack = ORIGIN(RAM) + LENGTH(RAM);
+  __stack_end__ = ORIGIN(RAM) + LENGTH(RAM);
 }
-
-
-
-
diff --git a/motors/medium_salsa.cc b/motors/medium_salsa.cc
index 1a899b1..1fbe9a6 100644
--- a/motors/medium_salsa.cc
+++ b/motors/medium_salsa.cc
@@ -20,9 +20,9 @@
 void __stack_chk_fail(void);
 
 extern char *__brkval;
-extern unsigned long _ebss;
-extern unsigned long _sram;
-extern unsigned long _estack;
+extern uint32_t __bss_ram_start__[];
+extern uint32_t __heap_start__[];
+extern uint32_t __stack_end__[];
 
 }  // extern "C"
 
@@ -51,14 +51,14 @@
   // Give everything a chance to get going.
   delay(100);
 
-  printf("Ram start:   %p\n", &_sram);
-  printf("Heap start:  %p\n", &_ebss);
+  printf("Ram start:   %p\n", __bss_ram_start__);
+  printf("Heap start:  %p\n", __heap_start__);
   printf("Heap end:    %p\n", __brkval);
-  printf("Stack start: %p\n", &_estack);
+  printf("Stack start: %p\n", __stack_end__);
 
   GPIOC_PSOR = 1 << 5;
-
   while (true) {}
+
   return 0;
 }
 
diff --git a/motors/usb/usb_dev.c b/motors/usb/usb_dev.c
index 8dc8e1f..703ec50 100644
--- a/motors/usb/usb_dev.c
+++ b/motors/usb/usb_dev.c
@@ -63,8 +63,7 @@
 	const void * addr;
 } bdt_t;
 
-__attribute__ ((section(".usbdescriptortable"), used))
-static bdt_t table[(NUM_ENDPOINTS+1)*4];
+__attribute__((aligned(512), used)) static bdt_t table[(NUM_ENDPOINTS + 1) * 4];
 
 static usb_packet_t *rx_first[NUM_ENDPOINTS];
 static usb_packet_t *rx_last[NUM_ENDPOINTS];
diff --git a/motors/usb/usb_mem.c b/motors/usb/usb_mem.c
index e21e5a9..ac883be 100644
--- a/motors/usb/usb_mem.c
+++ b/motors/usb/usb_mem.c
@@ -35,8 +35,9 @@
 //#include "HardwareSerial.h"
 #include "motors/usb/usb_mem.h"
 
-__attribute__ ((section(".usbbuffers"), used))
-unsigned char usb_buffer_memory[NUM_USB_BUFFERS * sizeof(usb_packet_t)];
+__attribute__((
+    aligned(128))) unsigned char usb_buffer_memory[NUM_USB_BUFFERS *
+                                                   sizeof(usb_packet_t)];
 
 static uint32_t usb_buffer_available = 0xFFFFFFFF;