Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2289 → Rev 2290

/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;
}
}
 
/** @}