/kernel/trunk/arch/sparc64/include/console.h |
---|
32,10 → 32,9 |
/** @file |
*/ |
#ifndef __sparc64_CONSOLE_H__ |
#define __sparc64_CONSOLE_H__ |
#ifndef KERN_sparc64_CONSOLE_H_ |
#define KERN_sparc64_CONSOLE_H_ |
extern void kofwinput(void *arg); |
extern void kkbdpoll(void *arg); |
extern void ofw_sparc64_console_init(void); |
extern void standalone_sparc64_console_init(void); |
44,4 → 43,3 |
/** @} |
*/ |
/kernel/trunk/arch/sparc64/include/stack.h |
---|
32,8 → 32,8 |
/** @file |
*/ |
#ifndef __sparc64_STACK_H__ |
#define __sparc64_STACK_H__ |
#ifndef KERN_sparc64_STACK_H_ |
#define KERN_sparc64_STACK_H_ |
#define STACK_ITEM_SIZE 8 |
54,4 → 54,3 |
/** @} |
*/ |
/kernel/trunk/arch/sparc64/include/elf.h |
---|
43,4 → 43,3 |
/** @} |
*/ |
/kernel/trunk/arch/sparc64/include/atomic.h |
---|
101,4 → 101,3 |
/** @} |
*/ |
/kernel/trunk/arch/sparc64/include/asm.h |
---|
32,8 → 32,8 |
/** @file |
*/ |
#ifndef __sparc64_ASM_H__ |
#define __sparc64_ASM_H__ |
#ifndef KERN_sparc64_ASM_H_ |
#define KERN_sparc64_ASM_H_ |
#include <typedefs.h> |
#include <arch/types.h> |
304,8 → 304,6 |
__asm__ volatile ("stxa %0, [%1] %2\n" : : "r" (v), "r" (va), "i" (asi) : "memory"); |
} |
void cpu_halt(void); |
void cpu_sleep(void); |
void asm_delay_loop(uint32_t t); |
314,4 → 312,3 |
/** @} |
*/ |
/kernel/trunk/arch/sparc64/include/trap/interrupt.h |
---|
78,4 → 78,3 |
/** @} |
*/ |
/kernel/trunk/arch/sparc64/include/register.h |
---|
32,9 → 32,14 |
/** @file |
*/ |
#ifndef __sparc64_REGISTER_H__ |
#define __sparc64_REGISTER_H__ |
#ifndef KERN_sparc64_REGISTER_H_ |
#define KERN_sparc64_REGISTER_H_ |
#ifdef __ASM__ |
#define PSTATE_IE_BIT 2 |
#define PSTATE_AM_BIT 8 |
#else |
#include <arch/types.h> |
/** Version Register. */ |
106,6 → 111,7 |
#endif |
#endif |
/** @} |
*/ |
/kernel/trunk/arch/sparc64/include/barrier.h |
---|
71,4 → 71,3 |
/** @} |
*/ |
/kernel/trunk/arch/sparc64/include/drivers/i8042.h |
---|
32,8 → 32,8 |
/** @file |
*/ |
#ifndef __sparc64_I8042_H__ |
#define __sparc64_I8042_H__ |
#ifndef KERN_sparc64_I8042_H_ |
#define KERN_sparc64_I8042_H_ |
#include <arch/types.h> |
73,4 → 73,3 |
/** @} |
*/ |
/kernel/trunk/arch/sparc64/include/drivers/fb.h |
---|
32,8 → 32,8 |
/** @file |
*/ |
#ifndef __sparc64_FB_H__ |
#define __sparc64_FB_H__ |
#ifndef KERN_sparc64_FB_H_ |
#define KERN_sparc64_FB_H_ |
#define FB_PHYS_ADDRESS 0x1c901000000ULL |
46,4 → 46,3 |
/** @} |
*/ |
/kernel/trunk/arch/sparc64/src/asm.S |
---|
26,6 → 26,9 |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/stack.h> |
#include <arch/register.h> |
.text |
.global memcpy |
35,6 → 38,7 |
.global memcpy_to_uspace_failover_address |
.global memsetb |
memcpy: |
memcpy_from_uspace: |
memcpy_to_uspace: |
51,3 → 55,20 |
b _memsetb |
nop |
.global ofw |
ofw: |
save %sp, -STACK_WINDOW_SAVE_AREA_SIZE, %sp |
set ofw_cif, %l0 |
ldx [%l0], %l0 |
rdpr %pstate, %l1 |
and %l1, ~PSTATE_AM_BIT, %l2 |
wrpr %l2, 0, %pstate |
jmpl %l0, %o7 |
mov %i0, %o0 |
wrpr %l1, 0, %pstate |
ret |
restore %o0, 0, %o0 |
/kernel/trunk/arch/sparc64/src/console.c |
---|
51,20 → 51,12 |
#define KEYBOARD_POLL_PAUSE 50000 /* 50ms */ |
static void ofw_sparc64_putchar(chardev_t *d, const char ch); |
static char ofw_sparc64_getchar(chardev_t *d); |
static void ofw_sparc64_suspend(chardev_t *d); |
static void ofw_sparc64_resume(chardev_t *d); |
mutex_t canwork; |
static volatile int ofw_console_active; |
static chardev_t ofw_sparc64_console; |
static chardev_operations_t ofw_sparc64_console_ops = { |
.write = ofw_sparc64_putchar, |
.read = ofw_sparc64_getchar, |
.resume = ofw_sparc64_resume, |
.suspend = ofw_sparc64_suspend |
}; |
/** Initialize kernel console to use OpenFirmware services. */ |
71,9 → 63,8 |
void ofw_sparc64_console_init(void) |
{ |
chardev_initialize("ofw_sparc64_console", &ofw_sparc64_console, &ofw_sparc64_console_ops); |
stdin = &ofw_sparc64_console; |
stdin = NULL; |
stdout = &ofw_sparc64_console; |
mutex_initialize(&canwork); |
ofw_console_active = 1; |
} |
94,83 → 85,11 |
*/ |
void ofw_sparc64_putchar(chardev_t *d, const char ch) |
{ |
pstate_reg_t pstate; |
/* |
* 32-bit OpenFirmware depends on PSTATE.AM bit set. |
*/ |
pstate.value = pstate_read(); |
pstate.am = true; |
pstate_write(pstate.value); |
if (ch == '\n') |
ofw_putchar('\r'); |
ofw_putchar(ch); |
pstate.am = false; |
pstate_write(pstate.value); |
} |
/** Read one character using OpenFirmware. |
* |
* The call is non-blocking. |
* |
* @param d Character device (ignored). |
* @return Character read or zero if no character was read. |
*/ |
char ofw_sparc64_getchar(chardev_t *d) |
{ |
char ch; |
pstate_reg_t pstate; |
/* |
* 32-bit OpenFirmware depends on PSTATE.AM bit set. |
*/ |
pstate.value = pstate_read(); |
pstate.am = true; |
pstate_write(pstate.value); |
ch = ofw_getchar(); |
pstate.am = false; |
pstate_write(pstate.value); |
return ch; |
} |
void ofw_sparc64_suspend(chardev_t *d) |
{ |
mutex_lock(&canwork); |
} |
void ofw_sparc64_resume(chardev_t *d) |
{ |
mutex_unlock(&canwork); |
} |
/** Kernel thread for pushing characters read from OFW to input buffer. |
* |
* @param arg Ignored. |
*/ |
void kofwinput(void *arg) |
{ |
while (ofw_console_active) { |
char ch = 0; |
mutex_lock(&canwork); |
mutex_unlock(&canwork); |
ch = ofw_sparc64_getchar(NULL); |
if (ch) { |
if (ch == '\r') |
ch = '\n'; |
chardev_push_character(&ofw_sparc64_console, ch); |
} |
thread_usleep(KEYBOARD_POLL_PAUSE); |
} |
} |
/** Kernel thread for polling keyboard. |
* |
* @param arg Ignored. |
/kernel/trunk/arch/sparc64/src/proc/scheduler.c |
---|
81,4 → 81,3 |
/** @} |
*/ |
/kernel/trunk/arch/sparc64/src/sparc64.c |
---|
40,10 → 40,15 |
#include <proc/thread.h> |
#include <console/console.h> |
#include <print.h> |
#include <genarch/ofw/ofw.h> |
#include <arch/asm.h> |
#include <arch/register.h> |
void arch_pre_mm_init(void) |
{ |
interrupts_disable(); |
ofw_sparc64_console_init(); |
trap_init(); |
tick_init(); |
} |
62,14 → 67,6 |
thread_t *t; |
/* |
* Create thread that reads characters from OFW's input. |
*/ |
t = thread_create(kofwinput, NULL, TASK, 0, "kofwinput"); |
if (!t) |
panic("cannot create kofwinput\n"); |
thread_ready(t); |
/* |
* Create thread that polls keyboard. |
*/ |
t = thread_create(kkbdpoll, NULL, TASK, 0, "kkbdpoll"); |
/kernel/trunk/arch/sparc64/src/mm/frame.c |
---|
53,4 → 53,3 |
/** @} |
*/ |
/kernel/trunk/arch/sparc64/src/drivers/i8042.c |
---|
47,4 → 47,3 |
/** @} |
*/ |
/kernel/trunk/arch/sparc64/src/start.S |
---|
27,6 → 27,7 |
# |
#include <arch/boot/boot.h> |
#include <arch/register.h> |
.register %g2, #scratch |
.register %g3, #scratch |
37,8 → 38,6 |
/* |
* Here is where the kernel is passed control. |
* The code must be position independent until |
* the kernel relocates itself to its VMA. |
*/ |
.global kernel_image_start |
45,8 → 44,12 |
kernel_image_start: |
flushw ! flush all but the active register window |
set ofw, %l0 |
rdpr %pstate, %l0 |
and %l0, ~PSTATE_AM_BIT, %l0 |
wrpr %l0, 0, %pstate |
set ofw_cif, %l0 |
call ofw_init |
stx %o4, [%l0] |