/branches/sparc/kernel/generic/src/main/main.c |
---|
299,6 → 299,7 |
*/ |
void main_ap(void) |
{ |
asm volatile ("sethi 0x40543, %g0"); |
/* |
* Incrementing the active CPU counter will guarantee that the |
* *_init() functions can find out that they need to |
/branches/sparc/kernel/arch/sparc64/include/drivers/simics_output.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2006 Pavel Rimsky |
* 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 sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_SIMICS_OUTPUT_H_ |
#define KERN_sparc64_SIMICS_OUTPUT_H_ |
extern void simics_output_init(void); |
#endif |
/** @} |
*/ |
/branches/sparc/kernel/arch/sparc64/include/mm/tlb.h |
---|
623,7 → 623,7 |
* |
* @param type |
* Selects between context and page demap |
* (and entire MMU demap on US3). |
* (and entire MMU demap on US-III). |
* @param context_encoding Specifies which Context register has Context ID for |
* demap. |
* @param page Address which is on the page to be demapped. |
650,7 → 650,7 |
* |
* @param type |
* Selects between context and page demap |
* (and entire MMU demap on US3). |
* (and entire MMU demap on US-III). |
* @param context_encoding Specifies which Context register has Context ID for |
* demap. |
* @param page Address which is on the page to be demapped. |
/branches/sparc/kernel/arch/sparc64/src/drivers/simics_output.c |
---|
0,0 → 1,142 |
/* |
* Copyright (c) 2006 Pavel Rimsky |
* 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 sparc64 |
* @{ |
*/ |
/** |
* @file |
* @brief Routines for writing characters directly to Simics CLI. |
* |
*/ |
#include <console/chardev.h> |
#include <console/console.h> |
#include <synch/spinlock.h> |
#include <arch/drivers/simics_output.h> |
/** maximum number of characters stored before printed */ |
#define BUFSIZE 512 |
/* %g2 will store a magic value used during initialization */ |
asm (".register %g2, #scratch"); |
/* %g3 will store the address (to be passed to Simics) of the buffer */ |
asm (".register %g3, #scratch"); |
/* lock protecting the character buffer */ |
SPINLOCK_INITIALIZE(simics_buf_lock); |
static void simics_putchar(struct chardev * cd, char c); |
/** character device operations - only writing will be supported */ |
static chardev_operations_t simics_stdout_ops = { |
.suspend = NULL, |
.resume = NULL, |
.write = simics_putchar, |
.read = NULL |
}; |
/** Simics character device */ |
chardev_t simics_stdout; |
/** |
* buffer to which output characters are stored before they're printed by Simics |
*/ |
static volatile char buffer[BUFSIZE]; |
/** Writes a single character to the Simics CLI. |
* |
* The character is not written immediately, but it is stored to the first free |
* position in the buffer, waiting for Simics' Python routine to read it |
* and print it. |
*/ |
static void simics_putchar(struct chardev * cd, char c) |
{ |
/* the first free position in the buffer */ |
static uint16_t current = 0; |
/* '\0' terminates a contiguous block of characters to be printed! */ |
if (c == '\0') |
return; |
/* wait till buffer is non-full and other processors aren't writing to it */ |
while (1) { |
while (buffer[current] != 0) |
; |
if (spinlock_trylock(&simics_buf_lock)) |
break; |
} |
buffer[current] = c; |
current = (current + 1) % BUFSIZE; |
membar(); |
spinlock_unlock(&simics_buf_lock); |
} |
/** Initializes the Simics output. |
* |
* Passes the address of the buffer to the Simics' Python script and |
* redirects kernel output to the Simics CLI. |
*/ |
void simics_output_init(void) |
{ |
/* all buffer positions are free at the beginning */ |
uint16_t i; |
for (i = 0; i < BUFSIZE; i++) { |
buffer[i] = '\0'; |
} |
/* |
* pass the address of the buffer to the Simics' Python script |
* - write it to the %g3 register |
* - write the magic value to the %g2 register |
* (so that the script knows that the value in %g3 is valid) |
* - loop until the value is read |
* (the script notifies us by setting %g2 to 0) |
*/ |
asm volatile ( |
"or %0, 0, %%g3\n" |
"set 0x18273645, %%g2\n" |
"0: cmp %%g2, 0\n" |
"bnz 0b\n" |
"nop" |
:: "r" (buffer) |
); |
/* redirect kernel output */ |
chardev_initialize("simics_output", &simics_stdout, &simics_stdout_ops); |
stdout = &simics_stdout; |
} |
/** @} |
*/ |
/branches/sparc/kernel/arch/sparc64/Makefile.inc |
---|
119,7 → 119,8 |
arch/$(ARCH)/src/drivers/kbd.c \ |
arch/$(ARCH)/src/drivers/scr.c \ |
arch/$(ARCH)/src/drivers/sgcn.c \ |
arch/$(ARCH)/src/drivers/pci.c |
arch/$(ARCH)/src/drivers/pci.c \ |
arch/$(ARCH)/src/drivers/simics_output.c |
ifeq ($(CONFIG_SMP),y) |
/branches/sparc/uspace/srv/kbd/arch/sparc64/src/sgcn.c |
---|
135,6 → 135,7 |
*in_rdptr_ptr = (((*in_rdptr_ptr) - begin + 1) % size) + begin; |
buf_ptr = (volatile char *) |
SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr); |
printf("Pressed character %c.\n", c); |
if (c == '\r') { |
c = '\n'; |
} |
/branches/sparc/uspace/app/init/init.c |
---|
114,6 → 114,11 |
spawn("/app/bdsh"); |
while (1) |
{ |
putchar(getchar()); |
} |
return 0; |
} |
/branches/sparc/boot/arch/sparc64/loader/ofwarch.c |
---|
82,7 → 82,7 |
/* |
* "upa-portid" for US, "portid" for US-III, |
* "cpuid" for US-IV |
* "cpuid" for US-IV* |
*/ |
if (ofw_get_property( |
child, "upa-portid", |
/branches/sparc/boot/genarch/balloc.h |
---|
31,6 → 31,15 |
#include <types.h> |
/* |
* SmartFirmware unfortunatelly fails to claim physical memory |
* for the boot allocator if the requested memory is too big |
* (roughly 512 kB and more). SmartFirmware runs on machines |
* containing newer versions of UltraSPARC processors. It |
* has been observed that the OFW tree is small enough for these |
* machines so that it can fit into 128 kB. This is a workaround how |
* to get rid of the memory claiming failure. |
*/ |
#define BALLOC_MAX_SIZE (128 * 1024) |
typedef struct { |
/branches/sparc/boot/genarch/ofw.c |
---|
281,13 → 281,10 |
*/ |
int ofw_memmap(memmap_t *map) |
{ |
unsigned int ac = ofw_get_address_cells(ofw_memory) / |
(sizeof(uintptr_t) / sizeof(uint32_t)); |
unsigned int sc = ofw_get_size_cells(ofw_memory) / |
(sizeof(uintptr_t) / sizeof(uint32_t)); |
printf("address cells: %d, size cells: %d. ", ac, sc); |
unsigned int ac = ofw_get_address_cells(ofw_memory); |
unsigned int sc = ofw_get_size_cells(ofw_memory); |
uintptr_t buf[((ac + sc) * MEMMAP_MAX_RECORDS)]; |
uint32_t buf[((ac + sc) * MEMMAP_MAX_RECORDS)]; |
int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(buf)); |
if (ret <= 0) /* ret is the number of written bytes */ |
return false; |
295,22 → 292,11 |
int pos; |
map->total = 0; |
map->count = 0; |
for (pos = 0; (pos < ret / sizeof(uintptr_t)) && |
for (pos = 0; (pos < ret / sizeof(uint32_t)) && |
(map->count < MEMMAP_MAX_RECORDS); pos += ac + sc) { |
void *start = (void *) (buf[pos + ac - 1]); |
void * start = (void *) ((uintptr_t) buf[pos + ac - 1]); |
unsigned int size = buf[pos + ac + sc - 1]; |
/* |
* This is a hot fix of the issue which occurs on machines where there are |
* holes in the physical memory (such as SunBlade 1500). Should we detect a |
* hole in the physical memory, we will ignore any memory detected behind |
* the hole and pretend the hole does not exist. |
*/ |
if ((map->count > 0) && |
(map->zones[map->count - 1].start + map->zones[map->count - 1].size |
< start)) |
break; |
if (size > 0) { |
map->zones[map->count].start = start; |
map->zones[map->count].size = size; |
322,6 → 308,7 |
return true; |
} |
int ofw_screen(screen_t *screen) |
{ |
char device_name[BUF_SIZE]; |