=== modified file 'HelenOS.config'
--- HelenOS.config	2013-02-14 21:52:55 +0000
+++ HelenOS.config	2013-03-22 23:20:15 +0000
@@ -65,6 +65,7 @@
 @ "integratorcp" Integratorcp
 @ "beagleboardxm" BeagleBoard-xM
 @ "beaglebone" BeagleBone
+@ "raspberrypi" RaspberryPi
 ! [PLATFORM=arm32] MACHINE (choice)
 
 % CPU type
@@ -98,6 +99,9 @@
 @ "arm926ej_s" ARM926EJ-S
 ! [PLATFORM=arm32&MACHINE=integratorcp] PROCESSOR (choice)
 
+% CPU type
+@ "arm1176jzf_s" ARM1176JZF-S
+! [PLATFORM=arm32&MACHINE=raspberrypi] PROCESSOR (choice)
 
 # Add more ARMv4 CPUs
 % CPU arch
@@ -109,6 +113,11 @@
 @ "armv5" ARMv5
 ! [PLATFORM=arm32&(PROCESSOR=arm926ej_s)] PROCESSOR_ARCH (choice)
 
+# Add more ARMv6 CPUs
+% CPU type
+@ "armv6" ARMv6
+! [PLATFORM=arm32&(PROCESSOR=arm1176jzf_s)] PROCESSOR_ARCH (choice)
+
 # Add more ARMv7-A CPUs
 % CPU arch
 @ "armv7_a" ARMv7-A
@@ -482,6 +491,9 @@
 % Support for ARM926 on-chip UART
 ! [(CONFIG_HID_OUT=generic|CONFIG_HID_OUT=serial)&PLATFORM=arm32&MACHINE=integratorcp] CONFIG_ARM926_UART (y/n)
 
+% Support for BCM2835 on-chip UART
+! [(CONFIG_HID_OUT=generic|CONFIG_HID_OUT=serial)&PLATFORM=arm32&MACHINE=raspberrypi] CONFIG_BCM2835_UART (y/n)
+
 % Support for Samsung S3C24XX on-chip UART
 ! [(CONFIG_HID_OUT=generic|CONFIG_HID_OUT=serial)&PLATFORM=arm32&MACHINE=gta02] CONFIG_S3C24XX_UART (y/n)
 

=== modified file 'boot/arch/arm32/include/arch.h'
--- boot/arch/arm32/include/arch.h	2013-01-24 19:53:38 +0000
+++ boot/arch/arm32/include/arch.h	2013-03-27 19:16:08 +0000
@@ -45,6 +45,8 @@
 #define BOOT_BASE	0x80000000
 #elif defined MACHINE_beaglebone
 #define BOOT_BASE       0x80000000
+#elif defined MACHINE_raspberrypi
+#define BOOT_BASE       0x80008000
 #else
 #define BOOT_BASE	0x00000000
 #endif
@@ -55,6 +57,8 @@
 	#define PA_OFFSET 0
 #elif defined MACHINE_beaglebone
 	#define PA_OFFSET 0
+#elif defined MACHINE_raspberrypi
+	#define PA_OFFSET 0
 #else
 	#define PA_OFFSET 0x80000000
 #endif

=== modified file 'boot/arch/arm32/src/main.c'
--- boot/arch/arm32/src/main.c	2013-01-24 21:15:02 +0000
+++ boot/arch/arm32/src/main.c	2013-03-17 01:47:56 +0000
@@ -139,7 +139,7 @@
 			halt();
 		}
 		
-		printf("%s ", components[i - 1].name);
+		printf("%s@%p  ", components[i - 1].name, dest[i - 1]);
 		
 		int err = inflate(components[i - 1].start, components[i - 1].size,
 		    dest[i - 1], components[i - 1].inflated);
@@ -151,9 +151,10 @@
 	}
 	
 	printf(".\n");
-	
-	printf("Booting the kernel...\n");
-	jump_to_kernel((void *) PA2KA(BOOT_OFFSET), &bootinfo);
+	void *entry;
+	entry = (void *) PA2KA(BOOT_OFFSET);
+	printf("Booting the kernel at %p...",entry);
+	jump_to_kernel(entry, &bootinfo);
 }
 
 /** @}

=== modified file 'boot/arch/arm32/src/putchar.c'
--- boot/arch/arm32/src/putchar.c	2013-01-17 19:58:34 +0000
+++ boot/arch/arm32/src/putchar.c	2013-03-16 20:27:09 +0000
@@ -121,6 +121,18 @@
 
 #endif
 
+#ifdef MACHINE_raspberrypi
+
+static void scons_sendb_rpi(uint8_t byte)
+{
+	/* Wait for the uart to be ready */
+	while (*((volatile uint8_t *) 0x20201018) & (1 << 5));
+	/* Send the byte */
+	*((volatile uint8_t *) 0x20201000) = byte;
+}
+
+#endif
+
 /** Send a byte to the serial console.
  *
  * @param byte		Byte to send.
@@ -139,6 +151,9 @@
 #ifdef MACHINE_integratorcp
 	scons_sendb_icp(byte);
 #endif
+#ifdef MACHINE_raspberrypi
+	scons_sendb_rpi(byte);
+#endif
 }
 
 /** Display a character

=== modified file 'kernel/arch/arm32/Makefile.inc'
--- kernel/arch/arm32/Makefile.inc	2013-01-24 21:18:18 +0000
+++ kernel/arch/arm32/Makefile.inc	2013-03-16 15:26:03 +0000
@@ -80,6 +80,10 @@
 	ARCH_SOURCES += arch/$(KARCH)/src/mach/integratorcp/integratorcp.c
 endif
 
+ifeq ($(MACHINE),raspberrypi)
+	ARCH_SOURCES += arch/$(KARCH)/src/mach/raspberrypi/raspberrypi.c
+endif
+
 ifeq ($(MACHINE),beagleboardxm)
 	ARCH_SOURCES += arch/$(KARCH)/src/mach/beagleboardxm/beagleboardxm.c
 endif

=== modified file 'kernel/arch/arm32/_link.ld.in'
--- kernel/arch/arm32/_link.ld.in	2013-02-27 20:53:37 +0000
+++ kernel/arch/arm32/_link.ld.in	2013-03-22 02:20:07 +0000
@@ -12,6 +12,8 @@
 #define KERNEL_LOAD_ADDRESS 0x80a00000
 #elif defined MACHINE_beaglebone
 #define KERNEL_LOAD_ADDRESS 0x80a00000
+#elif defined MACHINE_raspberrypi
+#define KERNEL_LOAD_ADDRESS 0x80a08000
 #else
 #define KERNEL_LOAD_ADDRESS 0x80a00000
 #endif

=== modified file 'kernel/arch/arm32/include/arch/cp15.h'
--- kernel/arch/arm32/include/arch/cp15.h	2013-01-20 11:42:22 +0000
+++ kernel/arch/arm32/include/arch/cp15.h	2013-03-22 03:23:02 +0000
@@ -222,6 +222,7 @@
 	SCTLR_USPCE_WRITE_XN_EN_FLAG = 1 << 20, /* Only if virt. supported */
 	SCTLR_FAST_IRQ_EN_FLAG       = 1 << 21, /* Disable impl. specific feat*/
 	SCTLR_UNALIGNED_EN_FLAG      = 1 << 22, /* Must be 1 on armv7 */
+	SCTLR_SUBPAGE_AP_FLAG        = 1 << 23, /* ARMv6 only. Must be 1 for ARMv7-style 2nd level pagetables. */
 	SCTLR_IRQ_VECTORS_EN_FLAG    = 1 << 24,
 	SCTLR_BIG_ENDIAN_EXC_FLAG    = 1 << 25,
 	SCTLR_NMFI_EN_FLAG           = 1 << 27,

=== added directory 'kernel/arch/arm32/include/arch/mach/raspberrypi'
=== added file 'kernel/arch/arm32/include/arch/mach/raspberrypi/raspberrypi.h'
--- kernel/arch/arm32/include/arch/mach/raspberrypi/raspberrypi.h	1970-01-01 00:00:00 +0000
+++ kernel/arch/arm32/include/arch/mach/raspberrypi/raspberrypi.h	2013-03-18 00:30:30 +0000
@@ -0,0 +1,13 @@
+#include <arch/machine_func.h>
+extern struct arm_machine_ops rpi_machine_ops;
+
+extern void rpi_init(void);
+extern void rpi_output_init(void);
+extern void rpi_input_init(void);
+extern void rpi_timer_irq_start(void);
+extern void rpi_cpu_halt(void);
+extern void rpi_irq_exception(unsigned int, istate_t *);
+extern void rpi_get_memory_extents(uintptr_t *, size_t *);
+extern void rpi_frame_init(void);
+extern size_t rpi_get_irq_count(void);
+extern const char *rpi_get_platform_name(void);
\ No newline at end of file

=== modified file 'kernel/arch/arm32/include/arch/mm/frame.h'
--- kernel/arch/arm32/include/arch/mm/frame.h	2013-01-24 21:18:18 +0000
+++ kernel/arch/arm32/include/arch/mm/frame.h	2013-03-21 03:09:56 +0000
@@ -60,6 +60,11 @@
 #define PHYSMEM_START_ADDR       0x80000000
 #define BOOT_PAGE_TABLE_ADDRESS  0x80008000
 
+#elif defined MACHINE_raspberrypi
+
+#define PHYSMEM_START_ADDR       0x80000000
+#define BOOT_PAGE_TABLE_ADDRESS  0x80010000
+
 #else
 
 #define PHYSMEM_START_ADDR       0x00000000

=== modified file 'kernel/arch/arm32/include/arch/mm/page.h'
--- kernel/arch/arm32/include/arch/mm/page.h	2013-01-24 21:18:18 +0000
+++ kernel/arch/arm32/include/arch/mm/page.h	2013-03-21 01:25:14 +0000
@@ -45,7 +45,7 @@
 #define PAGE_WIDTH	FRAME_WIDTH
 #define PAGE_SIZE	FRAME_SIZE
 
-#if (defined MACHINE_beagleboardxm) || (defined MACHINE_beaglebone)
+#if (defined MACHINE_beagleboardxm) || (defined MACHINE_beaglebone) || (defined MACHINE_raspberrypi)
 #ifndef __ASM__
 #	define KA2PA(x)	((uintptr_t) (x))
 #	define PA2KA(x)	((uintptr_t) (x))

=== modified file 'kernel/arch/arm32/src/arm32.c'
--- kernel/arch/arm32/src/arm32.c	2013-03-07 22:53:05 +0000
+++ kernel/arch/arm32/src/arm32.c	2013-03-23 16:30:37 +0000
@@ -49,6 +49,7 @@
 #include <str.h>
 #include <arch/ras.h>
 #include <sysinfo/sysinfo.h>
+#include <arch/cp15.h>
 
 /** Performs arm32-specific initialization before main_bsp() is called. */
 void arch_pre_main(void *entry __attribute__((unused)), bootinfo_t *bootinfo)
@@ -72,9 +73,14 @@
 {
 	/* It is not assumed by default */
 	interrupts_disable();
+#ifdef PROCESSOR_ARCH_armv6
+	uint32_t control_reg = SCTLR_read();
+	control_reg |= SCTLR_SUBPAGE_AP_FLAG; //ARMv6+ subpage table format
+	SCTLR_write(control_reg);
+#endif
 }
 
-/** Performs arm32 specific initialization afterr mm is initialized. */
+/** Performs arm32 specific initialization after mm is initialized. */
 void arch_post_mm_init(void)
 {
 	machine_init();

=== added directory 'kernel/arch/arm32/src/mach/raspberrypi'
=== added file 'kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c'
--- kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c	1970-01-01 00:00:00 +0000
+++ kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c	2013-03-27 19:22:31 +0000
@@ -0,0 +1,72 @@
+#include <arch/mach/raspberrypi/raspberrypi.h>
+#include <genarch/drivers/bcm2835_uart/bcm2835_uart.h>
+#include <mm/frame.h>
+
+struct arm_machine_ops rpi_machine_ops = {
+	rpi_init,
+	rpi_timer_irq_start,
+	rpi_cpu_halt,
+	rpi_get_memory_extents,
+	rpi_irq_exception,
+	rpi_frame_init,
+	rpi_output_init,
+	rpi_input_init,
+	rpi_get_irq_count,
+	rpi_get_platform_name
+};
+
+static struct {
+	bcm2835_uart_t uart;
+} rpi;
+
+void rpi_init(void)
+{
+	//*((int *)(0x20200028)) = 1<<16;
+}
+
+void rpi_timer_irq_start(void)
+{
+}
+
+void rpi_cpu_halt(void)
+{
+	while(1);
+}
+
+void rpi_get_memory_extents(uintptr_t *start, size_t *size)
+{
+	*start=PHYSMEM_START_ADDR;
+	*size=0x08000000; //128MB FIXME: should likely depend on RAM reserved for GPU use.
+}
+
+// FIXME: Handles interrupts.
+void rpi_irq_exception(unsigned int exc_no, istate_t *istate)
+{
+}
+
+//?
+void rpi_frame_init(void)
+{
+	frame_mark_unavailable(0x80000, 8);
+}
+
+void rpi_output_init(void)
+{
+	  if (bcm2835_uart_init(&rpi.uart, 0,
+	    0, sizeof(bcm2835_uart_regs_t)))
+		stdout_wire(&rpi.uart.outdev);
+}
+
+void rpi_input_init(void)
+{
+}
+
+size_t rpi_get_irq_count(void)
+{
+	return 0;
+}
+
+const char *rpi_get_platform_name(void)
+{
+	return "raspberrypi";
+}
\ No newline at end of file

=== modified file 'kernel/arch/arm32/src/machine_func.c'
--- kernel/arch/arm32/src/machine_func.c	2012-12-29 10:48:35 +0000
+++ kernel/arch/arm32/src/machine_func.c	2013-03-18 05:40:35 +0000
@@ -42,6 +42,7 @@
 #include <arch/mach/integratorcp/integratorcp.h>
 #include <arch/mach/beagleboardxm/beagleboardxm.h>
 #include <arch/mach/beaglebone/beaglebone.h>
+#include <arch/mach/raspberrypi/raspberrypi.h>
 
 /** Pointer to machine_ops structure being used. */
 struct arm_machine_ops *machine_ops;
@@ -57,6 +58,8 @@
 	machine_ops = &bbxm_machine_ops;
 #elif defined(MACHINE_beaglebone)
 	machine_ops = &bbone_machine_ops;
+#elif defined(MACHINE_raspberrypi)
+	machine_ops = &rpi_machine_ops;
 #else
 #error Machine type not defined.
 #endif

=== modified file 'kernel/genarch/Makefile.inc'
--- kernel/genarch/Makefile.inc	2012-10-14 15:46:21 +0000
+++ kernel/genarch/Makefile.inc	2013-03-18 05:15:40 +0000
@@ -95,6 +95,11 @@
 		genarch/src/drivers/arm926_uart/arm926_uart.c
 endif
 
+ifeq ($(CONFIG_BCM2835_UART),y)
+	GENARCH_SOURCES += \
+		genarch/src/drivers/bcm2835_uart/bcm2835_uart.c
+endif
+
 ifeq ($(CONFIG_S3C24XX_IRQC),y)
 	GENARCH_SOURCES += \
 		genarch/src/drivers/s3c24xx_irqc/s3c24xx_irqc.c

=== added directory 'kernel/genarch/include/genarch/drivers/bcm2835_uart'
=== added file 'kernel/genarch/include/genarch/drivers/bcm2835_uart/bcm2835_uart.h'
--- kernel/genarch/include/genarch/drivers/bcm2835_uart/bcm2835_uart.h	1970-01-01 00:00:00 +0000
+++ kernel/genarch/include/genarch/drivers/bcm2835_uart/bcm2835_uart.h	2013-03-18 11:38:51 +0000
@@ -0,0 +1,40 @@
+/** @addtogroup genarch
+ * @{
+ */
+/**
+ * @file
+ * @brief BCM2835 on-chip UART driver.
+ */
+
+#ifndef KERN_BCM2835_UART_H_
+#define KERN_BCM2836_UART_H_
+
+#include <ddi/irq.h>
+#include <console/chardev.h>
+#include <typedefs.h>
+
+#define BCM2835_UART0_BASE_ADDRESS   0x20201000
+
+/** ARM926 User Guide ch. A.1 (p. 124 in the pdf) */
+/*#define ARM926_UART0_IRQ   1
+#define ARM926_UART1_IRQ   2*/
+
+/** PrimeCell UART TRM ch. 3.3 (p. 49 in the pdf) */
+typedef struct {
+} bcm2835_uart_regs_t;
+
+typedef struct {
+	//bcm2835_uart_regs_t *regs;
+	volatile ioport8_t *regs;
+	indev_t *indev;
+	outdev_t outdev;
+	irq_t irq;
+} bcm2835_uart_t;
+
+bool bcm2835_uart_init(bcm2835_uart_t *, inr_t, uintptr_t, size_t);
+void bcm2835_uart_input_wire(bcm2835_uart_t *, indev_t *);
+
+#endif
+/**
+ * @}
+ */

=== added directory 'kernel/genarch/src/drivers/bcm2835_uart'
=== added file 'kernel/genarch/src/drivers/bcm2835_uart/bcm2835_uart.c'
--- kernel/genarch/src/drivers/bcm2835_uart/bcm2835_uart.c	1970-01-01 00:00:00 +0000
+++ kernel/genarch/src/drivers/bcm2835_uart/bcm2835_uart.c	2013-03-22 04:38:40 +0000
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2012 Jan Vesely
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - 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.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
+ */
+
+/** @addtogroup genarch
+ * @{
+ */
+/**
+ * @file
+ * @brief ARM926 on-chip UART (PrimeCell UART, PL011) driver.
+ */
+
+#include <genarch/drivers/bcm2835_uart/bcm2835_uart.h>
+#include <console/chardev.h>
+#include <console/console.h>
+#include <ddi/device.h>
+#include <arch/asm.h>
+#include <mm/slab.h>
+#include <mm/page.h>
+#include <mm/km.h>
+#include <sysinfo/sysinfo.h>
+#include <str.h>
+#include <../../ia64/include/arch/register.h>
+
+static volatile ioport8_t *ugly;
+
+static void bcm2835_uart_putchar(outdev_t *dev, wchar_t ch)
+{
+	bcm2835_uart_t *uart = dev->data;
+	//volatile ioport8_t *regs = (void*)km_map(0x20201000, PAGE_SIZE, PAGE_READ | PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	//bcm2835_uart_t *uart = dev->data;
+	/* Wait for the uart to be ready */
+	while (pio_read_8(ugly) & (1 << 5));
+	//while (*((volatile uint8_t *) 0x20201018) & (1 << 5));
+	//while ((pio_read_8((ioport8_t*) 0x20201018)) & (1 << 5));
+	/* Send the byte */
+	pio_write_8((uint8_t *) uart->regs, ch);
+	//pio_write_8((uint8_t *) 0x20201000, ch);
+	//*((volatile uint8_t *) 0x20201000) = ch;
+}
+
+static outdev_operations_t bcm2835_uart_ops = {
+	.write = bcm2835_uart_putchar,
+	.redraw = NULL,
+};
+
+bool bcm2835_uart_init(
+    bcm2835_uart_t *uart, inr_t interrupt, uintptr_t addr, size_t size)
+{
+	outdev_initialize("bcm2835_uart_dev", &uart->outdev, &bcm2835_uart_ops);
+	uart->outdev.data = uart;
+	uart->regs = (void*)km_map(0xA0201000, PAGE_SIZE, PAGE_NOT_CACHEABLE);
+	ugly = (volatile ioport8_t *) km_map(0xA0201018, PAGE_SIZE, PAGE_NOT_CACHEABLE);
+	return true;
+}
+
+void bcm2835_uart_input_wire(bcm2835_uart_t *uart, indev_t *indev)
+{
+}
+
+/** @}
+ */
+

