/branches/arm/kernel/arch/arm32/include/machine.h |
---|
48,6 → 48,8 |
size_t machine_get_memory_size(void); |
void machine_debug_putc(char ch); |
#endif |
/** @} |
/branches/arm/kernel/arch/arm32/include/debug_print/print.h |
---|
34,9 → 34,12 |
#define INT32 4 |
#define INT64 8 |
#include <stdarg.h> |
#include <arch/types.h> |
extern void debug_puts(const char *str); |
extern void debug_printf(const char *fmt, ...); |
extern void debug_write(const char *str, const int len); |
extern int debug_write(const char *str, size_t count, void *unused); |
#ifdef CONFIG_DEBUG |
/branches/arm/kernel/arch/arm32/Makefile.inc |
---|
81,8 → 81,7 |
arch/$(ARCH)/src/mm/page.c \ |
arch/$(ARCH)/src/interrupt.c \ |
arch/$(ARCH)/src/mm/tlb.c \ |
arch/$(ARCH)/src/debug_print/printf.c \ |
arch/$(ARCH)/src/debug_print/io.c \ |
arch/$(ARCH)/src/debug_print/print.c \ |
arch/$(ARCH)/src/console.c \ |
arch/$(ARCH)/src/exception.c \ |
arch/$(ARCH)/src/mm/memory_init.c \ |
/branches/arm/kernel/arch/arm32/src/debug_print/io.c |
---|
File deleted |
/branches/arm/kernel/arch/arm32/src/debug_print/printf.c |
---|
File deleted |
/branches/arm/kernel/arch/arm32/src/debug_print/print.c |
---|
0,0 → 1,65 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* 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. |
*/ |
#include <printf/printf_core.h> |
#include <arch/debug_print/print.h> |
#include <arch/machine.h> |
/** |
* Prints a character to console. |
* |
* @param ch character to be printed |
*/ |
static void putc(char ch) |
{ |
machine_debug_putc(ch); |
} |
int debug_write(const char *str, size_t count, void *unused) |
{ |
int i; |
for (i = 0; i < count; ++i) { |
putc(str[i]); |
} |
return i; |
} |
void debug_printf(const char *fmt, ...) |
{ |
va_list args; |
va_start (args, fmt); |
struct printf_spec ps = { (int(*)(void *, size_t, void *)) debug_write, NULL }; |
printf_core(fmt, &ps, args); |
va_end(args); |
} |
/branches/arm/kernel/arch/arm32/src/arm32.c |
---|
90,7 → 90,6 |
void arch_pre_main(void) |
{ |
dprintf("arch_pre_main\n"); |
int i; |
init.cnt = bootinfo.cnt; |
103,8 → 102,6 |
void arch_pre_mm_init(void) |
{ |
dprintf("arch_pre_mm_init\n"); |
/* It is not assumed by default */ |
interrupts_disable(); |
115,21 → 112,18 |
void arch_post_mm_init(void) |
{ |
// dprintf("arch_post_mm_init start()\n"); |
gxemul_hw_map_init(); |
/* Initialize dispatch table */ |
exception_init(); |
// drivers_init(); |
interrupt_init(); |
console_init(device_assign_devno()); |
//fb_init(0x12000000, 640, 480, 1920, VISUAL_RGB_8_8_8); |
interrupts_enable(); |
dprintf("arch_post_mm_init end()\n"); |
} |
void arch_post_cpu_init(void) |
/branches/arm/kernel/arch/arm32/src/mm/page.c |
---|
56,35 → 56,22 |
flags = PAGE_CACHEABLE; |
/* PA2KA(identity) mapping for all frames until last_frame */ |
// PA2KA(identity) mapping for all frames until last_frame |
for (cur = 0; cur < last_frame; cur += FRAME_SIZE) { |
page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); |
} |
// Create mapping for exception table at high offcet |
// create mapping for exception table at high offset |
#ifdef HIGH_EXCEPTION_VECTORS |
/* Note: this mapping cann't be done by hw_map because fixed exception |
vector is stored at fixed virtual address |
*/ |
// reserve frame for exception table |
void* virtaddr = frame_alloc( ONE_FRAME ,FRAME_KA); |
page_mapping_insert(AS_KERNEL, EXC_BASE_ADDRESS, KA2PA(virtaddr), flags ); |
// Note: this mapping cann't be done by hw_map because fixed exception |
// vector is stored at fixed virtual address |
// reserve frame for exception table |
void* virtaddr = frame_alloc(ONE_FRAME, FRAME_KA); |
page_mapping_insert(AS_KERNEL, EXC_BASE_ADDRESS, KA2PA(virtaddr), flags); |
#endif |
// TODO: #else |
// TODO: move to the kernel space |
// page_mapping_insert(AS_KERNEL, 0xffff0000, 0x00000000, flags); |
// TODO: remove when aux_printf not needed |
// page_mapping_insert(AS_KERNEL, 0x0000000, 0x0000000, flags); |
page_mapping_insert(AS_KERNEL, 0x1000000, 0x1000000, flags); |
// page_mapping_insert(AS_KERNEL, 0x1100000, 0x1100000, flags); |
// page_mapping_insert(AS_KERNEL, 0x1500000, 0x1500000, flags); |
// page_mapping_insert(AS_KERNEL, 0x1600000, 0x1600000, flags); |
// page_mapping_insert(AS_KERNEL, 0xffff0000, 0xffff0000, flags); |
as_switch(NULL, AS_KERNEL); |
} |
/** |
96,20 → 83,21 |
* \param physaddr Physical addres where device is connected |
* \param size Length of area where device is present |
* \return Virtual address where device will be accessable |
* Note: This is copy of IA32 hw_map code |
*/ |
uintptr_t hw_map(uintptr_t physaddr, size_t size) |
{ |
if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) |
if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) { |
panic("Unable to map physical memory %p (%d bytes)", physaddr, size) |
} |
uintptr_t virtaddr = PA2KA(last_frame); |
pfn_t i; |
for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) |
page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE | PAGE_READ | PAGE_WRITE | PAGE_KERNEL); |
for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) { |
page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), |
PAGE_NOT_CACHEABLE | PAGE_READ | PAGE_WRITE | PAGE_KERNEL); |
} |
last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE); |
return virtaddr; |
} |
/branches/arm/kernel/arch/arm32/src/drivers/gxemul.c |
---|
65,6 → 65,8 |
static irq_t gxemul_irq; |
static irq_t gxemul_timer_irq; |
static bool hw_map_init_called = false; |
static void gxemul_write(chardev_t *dev, const char ch); |
static void gxemul_enable(chardev_t *dev); |
static void gxemul_disable(chardev_t *dev); |
91,6 → 93,7 |
gxemul_hw_map.irqc_mask = gxemul_hw_map.irqc + GXEMUL_IRQC_MASK_OFFSET; |
gxemul_hw_map.irqc_unmask = gxemul_hw_map.irqc + GXEMUL_IRQC_UNMASK_OFFSET; |
hw_map_init_called = true; |
} |
/** Putchar that works with gxemul */ |
290,10 → 293,12 |
return *((int*)(GXEMUL_MP + GXEMUL_MP_MEMSIZE_OFFSET)); |
} |
void gxemul_debug_putc(char ch) { |
// *((volatile char *) GXEMUL_KBD) = ch; |
//TODO commented version doesn't work, don't know why (as ?? |
*((char *) gxemul_hw_map.videoram) = ch; |
void machine_debug_putc(char ch) { |
if (!hw_map_init_called) { |
*((volatile char *) GXEMUL_KBD) = ch; |
} else { |
*((char *) gxemul_hw_map.videoram) = ch; |
} |
} |
/** @} |