svn commit: r238303 - in user/jceel/soc2012_armv6/sys: arm/arm
arm/include conf
Jakub Wojciech Klama
jceel at FreeBSD.org
Mon Jul 9 17:28:27 UTC 2012
Author: jceel
Date: Mon Jul 9 17:28:26 2012
New Revision: 238303
URL: http://svn.freebsd.org/changeset/base/238303
Log:
Add early printf (eprintf) function and early UART support for debugging
purposes. When enabled using ARM_EARLY_DEBUG kernel option, eprintf() call
is available from locore stage allowing to print debug messages before
pmap and console is set up.
Added:
user/jceel/soc2012_armv6/sys/arm/arm/early_uart.c
user/jceel/soc2012_armv6/sys/arm/include/early_uart.h
Modified:
user/jceel/soc2012_armv6/sys/arm/arm/locore.S
user/jceel/soc2012_armv6/sys/conf/options.arm
Added: user/jceel/soc2012_armv6/sys/arm/arm/early_uart.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/jceel/soc2012_armv6/sys/arm/arm/early_uart.c Mon Jul 9 17:28:26 2012 (r238303)
@@ -0,0 +1,203 @@
+/*-
+ * Copyright (c) 2009 Guillaume Ballet
+ * Copyright (c) 2012 Aleksander Dutkowski
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "opt_global.h"
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <machine/early_uart.h>
+#include <machine/pcb.h>
+#include <machine/machdep.h>
+#include <machine/undefined.h>
+#include <machine/pte.h>
+#include <machine/bus.h>
+#include <machine/intr.h>
+#include <sys/kdb.h>
+#include <arm/include/stdarg.h>
+
+static volatile uint32_t *arm_early_uart = (volatile uint32_t *)ARM_EARLY_UART_VA;
+static volatile uint32_t *arm_early_uart_lsr = (volatile uint32_t *)(ARM_EARLY_UART_VA + 0x14);
+
+void
+arm_early_putc(char c)
+{
+
+ while ((*arm_early_uart_lsr & 0x20) == 0);
+ *arm_early_uart = c;
+
+ if( c == '\n' )
+ {
+ while ((*arm_early_uart_lsr & 0x20) == 0);
+ *arm_early_uart = '\r';
+ }
+}
+
+void
+arm_early_puts(unsigned char *str)
+{
+ do {
+ arm_early_putc(*str);
+ } while (*++str != '\0');
+}
+
+void
+arm_early_uart_base(uint32_t base_address)
+{
+ arm_early_uart = (volatile uint32_t *)base_address;
+ arm_early_uart_lsr = (volatile uint32_t *)(base_address + 0x14);
+}
+
+void
+eprintf(const char *fmt,...)
+{
+ va_list ap;
+ const char *hex = "0123456789abcdef";
+ char buf[10];
+ char *s;
+ unsigned u;
+ int c;
+
+ va_start(ap, fmt);
+ while ((c = *fmt++)) {
+ if (c == '%') {
+ c = *fmt++;
+ switch (c) {
+ case 'c':
+ arm_early_putc(va_arg(ap, int));
+ continue;
+ case 's':
+ for (s = va_arg(ap, char *); *s; s++)
+ arm_early_putc(*s);
+ continue;
+ case 'd': /* A lie, always prints unsigned */
+ case 'u':
+ u = va_arg(ap, unsigned);
+ s = buf;
+ do
+ *s++ = '0' + u % 10U;
+ while (u /= 10U);
+ dumpbuf:;
+ while (--s >= buf)
+ arm_early_putc(*s);
+ continue;
+ case 'x':
+ u = va_arg(ap, unsigned);
+ s = buf;
+ do
+ *s++ = hex[u & 0xfu];
+ while (u >>= 4);
+ goto dumpbuf;
+ }
+ }
+ arm_early_putc(c);
+ }
+ va_end(ap);
+
+ return;
+}
+
+void
+dump_l2pagetable(uint32_t pta, uint32_t l1)
+{
+ int i;
+ volatile uint32_t *pt = (volatile uint32_t*)pta;
+
+ for (i=0; i<256;i++) {
+ switch (pt[i] & 0x3) {
+ case 1:
+ eprintf("0x%x -> 0x%x 64K ",(i<<12) | l1,
+ pt[i]&0xFFFF0000);
+ eprintf("l2pt[0x%x]=0x%x ",i, pt[i]);
+ eprintf("s=%u ", (pt[i]>>10) &0x1);
+ eprintf("apx=%u ", (pt[i]>> 9) &0x1);
+ eprintf("tex=%u ", (pt[i]>>12) &0x7);
+ eprintf("ap=%u ", (pt[i]>> 4) &0x3);
+ eprintf("c=%u ", (pt[i]>> 3) &0x1);
+ eprintf("b=%u\n", (pt[i]>> 2) &0x1);
+ break;
+ case 2:
+ case 3:
+ eprintf("0x%x -> 0x%x 4K ",(i<<12) | l1,
+ pt[i]&0xFFFFF000);
+ eprintf("l2pt[0x%x]=0x%x ",i, pt[i]);
+ eprintf("s=%u ", (pt[i]>>10) &0x1);
+ eprintf("apx=%u ", (pt[i]>> 9) &0x1);
+ eprintf("tex=%u ", (pt[i]>> 6) &0x7);
+ eprintf("ap=%u ", (pt[i]>> 4) &0x3);
+ eprintf("c=%u ", (pt[i]>> 3) &0x1);
+ eprintf("b=%u\n", (pt[i]>> 2) &0x1);
+ break;
+ }
+ }
+}
+
+void
+dump_l1pagetable(uint32_t pta)
+{
+ int i;
+ eprintf("L1 pagetable starts at 0x%x\n",pta);
+ volatile uint32_t *pt = (volatile uint32_t*)pta;
+ for (i=0; i<4096;i++) {
+ switch (pt[i] & 0x3) {
+ case 1:
+ eprintf("0x%x -> L2 ",i<<20);
+ eprintf("l1pt[0x%x]=0x%x ",i, pt[i]);
+ eprintf("l2desc=0x%x ",pt[i] & 0xFFFFFC00);
+ eprintf("p=%u ",(pt[i]>>9) &0x1);
+ eprintf("domain=0x%x\n",(pt[i]>>5) &0xF);
+ dump_l2pagetable(pt[i] & 0xFFFFFC00, i<<20);
+ break;
+ case 2:
+ if (pt[i] &0x40000) {
+ eprintf("0x%x -> 0x%x 16M ",i<<20, pt[i] & 0xFF000000);
+ eprintf("l1pt[0x%x]=0x%x ",i, pt[i]);
+ eprintf("base=0x%x ", ((pt[i]>>24)));
+ } else {
+ eprintf("0x%x -> 0x%x 1M ",i<<20, pt[i] & 0xFFF00000);
+ eprintf("l1pt[0x%x]=0x%x ",i, pt[i]);
+ eprintf("base=0x%x ", (pt[i]>>20));
+ }
+ eprintf("nG=%u ", (pt[i]>>17) &0x1);
+ eprintf("s=%u ", (pt[i]>>16) &0x1);
+ eprintf("apx=%u ", (pt[i]>>15) &0x1);
+ eprintf("tex=%u ", (pt[i]>>12) &0x7);
+ eprintf("ap=%u ", (pt[i]>>10) &0x3);
+ eprintf("p=%u ", (pt[i]>> 9) &0x1);
+ eprintf("domain=0x%x ", (pt[i]>> 5) &0xF);
+ eprintf("xn=%u ", (pt[i]>> 4) &0x1);
+ eprintf("c=%u ", (pt[i]>> 3) &0x1);
+ eprintf("b=%u\n", (pt[i]>> 2) &0x1);
+ break;
+ case 3:
+ eprintf("pt[0x%x] 0x%x RESV\n",i, pt[i]);
+ break;
+ }
+ }
+}
+
Modified: user/jceel/soc2012_armv6/sys/arm/arm/locore.S
==============================================================================
--- user/jceel/soc2012_armv6/sys/arm/arm/locore.S Mon Jul 9 17:25:56 2012 (r238302)
+++ user/jceel/soc2012_armv6/sys/arm/arm/locore.S Mon Jul 9 17:28:26 2012 (r238303)
@@ -34,6 +34,7 @@
*/
#include "assym.s"
+#include "opt_global.h"
#include <sys/syscall.h>
#include <machine/asm.h>
#include <machine/armreg.h>
@@ -240,6 +241,9 @@ mmu_init_table:
MMU_INIT(PHYSADDR, PHYSADDR , 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
/* map VA 0xc0000000..0xc3ffffff to PA */
MMU_INIT(KERNBASE, PHYSADDR, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
+#if defined(ARM_EARLY_DEBUG)
+ MMU_INIT(ARM_EARLY_UART_VA & L1_S_FRAME, ARM_EARLY_UART_PA & L1_S_FRAME, 64, L1_TYPE_S|L1_S_AP(AP_KRW))
+#endif
#else
MMU_INIT(PHYSADDR, PHYSADDR , 64, L1_TYPE_S|L1_SHARED|L1_S_C|L1_S_AP(AP_KRW))
/* map VA 0xc0000000..0xc3ffffff to PA */
Added: user/jceel/soc2012_armv6/sys/arm/include/early_uart.h
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/jceel/soc2012_armv6/sys/arm/include/early_uart.h Mon Jul 9 17:28:26 2012 (r238303)
@@ -0,0 +1,51 @@
+/*-
+ * Copyright (c) 2009 Guillaume Ballet
+ * Copyright (c) 2012 Aleksander Dutkowski
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _ARM_EARLY_UART
+#define _ARM_EARLY_UART
+
+#ifdef ARM_EARLY_DEBUG
+
+#define edebugf(fmt, args...) do { \
+ eprintf("%s(): ", __func__); \
+ eprintf(fmt, ##args); \
+} while(0);
+
+void arm_early_putc(char c);
+void arm_early_puts(unsigned char *str);
+void arm_early_uart_base(uint32_t base_address);
+void eprintf(const char *fmt, ...);
+void dump_l1pagetable(uint32_t pta);
+void dump_l2pagetable(uint32_t pta, uint32_t l1);
+#else
+
+#define edebugf(fmt, args...)
+#define eprintf(fmr, args...)
+
+#endif
+
+#endif
Modified: user/jceel/soc2012_armv6/sys/conf/options.arm
==============================================================================
--- user/jceel/soc2012_armv6/sys/conf/options.arm Mon Jul 9 17:25:56 2012 (r238302)
+++ user/jceel/soc2012_armv6/sys/conf/options.arm Mon Jul 9 17:28:26 2012 (r238303)
@@ -1,6 +1,9 @@
#$FreeBSD$
ARM9_CACHE_WRITE_THROUGH opt_global.h
ARM_CACHE_LOCK_ENABLE opt_global.h
+ARM_EARLY_DEBUG opt_global.h
+ARM_EARLY_UART_PA opt_global.h
+ARM_EARLY_UART_VA opt_global.h
ARMFPE opt_global.h
ARM_KERN_DIRECTMAP opt_vm.h
ARM_INTRNG opt_global.h
More information about the svn-src-user
mailing list