Strict Standards: Declaration of action_plugin_importoldchangelog::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /DISK2/WWW/pavel-rimsky.cz/helenos/lib/plugins/importoldchangelog/action.php on line 8 Strict Standards: Declaration of action_plugin_importoldindex::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /DISK2/WWW/pavel-rimsky.cz/helenos/lib/plugins/importoldindex/action.php on line 0 Deprecated: Function split() is deprecated in /DISK2/WWW/pavel-rimsky.cz/helenos/inc/auth.php on line 154 Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /DISK2/WWW/pavel-rimsky.cz/helenos/inc/auth.php on line 456 Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /DISK2/WWW/pavel-rimsky.cz/helenos/inc/auth.php on line 456 Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /DISK2/WWW/pavel-rimsky.cz/helenos/inc/auth.php on line 453 Index: kernel/genarch/src/ofw/ofw_tree.c =================================================================== --- kernel/genarch/src/ofw/ofw_tree.c (revision 3448) +++ kernel/genarch/src/ofw/ofw_tree.c (working copy) @@ -106,6 +106,7 @@ * Try to find the disambigued name. */ for (cur = node->child; cur; cur = cur->peer) { + printf("Comparing to %s", cur->da_name); if (strcmp(cur->da_name, name) == 0) return cur; } @@ -225,6 +226,7 @@ memcpy(buf, &path[i], j - i); buf[j - i] = '\0'; + printf("Looking for child: %s", buf); node = ofw_tree_find_child(node, buf); } Index: kernel/generic/src/main/main.c =================================================================== --- kernel/generic/src/main/main.c (revision 3448) +++ kernel/generic/src/main/main.c (working copy) @@ -192,8 +192,6 @@ /* Keep this the first thing. */ the_initialize(THE); - asm("sethi 0x40100, %g0"); - LOG(); version_print(); Index: kernel/arch/sparc64/include/context_offset.h =================================================================== --- kernel/arch/sparc64/include/context_offset.h (revision 3448) +++ kernel/arch/sparc64/include/context_offset.h (working copy) @@ -74,7 +74,7 @@ stx %l6, [\ctx + OFFSET_L6] stx %l7, [\ctx + OFFSET_L7] #ifndef KERNEL - stx %g7, [\ctx + OFFSET_TP] + stx %g7, [\ctx + OFFSET_TP] ! co to je? #endif .endm Index: kernel/arch/sparc64/include/mm/tte.h =================================================================== --- kernel/arch/sparc64/include/mm/tte.h (revision 3448) +++ kernel/arch/sparc64/include/mm/tte.h (working copy) @@ -50,6 +50,7 @@ #include +// TODO find out what this means #define VA_TAG_PAGE_SHIFT 22 /** Translation Table Entry - Tag. */ Index: kernel/arch/sparc64/include/mm/cache_spec.h =================================================================== --- kernel/arch/sparc64/include/mm/cache_spec.h (revision 3448) +++ kernel/arch/sparc64/include/mm/cache_spec.h (working copy) @@ -38,17 +38,26 @@ /* * The following macros are valid for the following processors: * - * UltraSPARC, UltraSPARC II, UltraSPARC IIi + * UltraSPARC, UltraSPARC II, UltraSPARC IIi, UltraSPARC III Cu * * Should we support other UltraSPARC processors, we need to make sure that * the macros are defined correctly for them. */ - + +#if defined (US) #define DCACHE_SIZE (16 * 1024) +#elif defined (US3) +#define DCACHE_SIZE (64 * 1024) +#endif #define DCACHE_LINE_SIZE 32 +#if defined (US) #define ICACHE_SIZE (16 * 1024) #define ICACHE_WAYS 2 +#elif defined (US3) +#define ICACHE_SIZE (32 * 1024) +#define ICACHE_WAYS 4 +#endif #define ICACHE_LINE_SIZE 32 #endif Index: kernel/arch/sparc64/include/context.h =================================================================== --- kernel/arch/sparc64/include/context.h (revision 3448) +++ kernel/arch/sparc64/include/context.h (working copy) @@ -56,6 +56,9 @@ * Save only registers that must be preserved across * function calls. */ +// moc tady nerozumim tomu, proc se neukladaji globalni registry (neco si zapisu do scratched registru, pak me preplanujou, pak me zase obnovi a ve scratched registrech budu mit neco jineho...) +// ale treba toto neni jedina fce, ktera se vola pri preplanovani +// komentar rika: only registers that must be preserved across function calls -> scratch registry nejsou preserved, do preserved zase nebudu nic psat typedef struct { uintptr_t sp; /* %o6 */ uintptr_t pc; /* %o7 */ @@ -75,7 +78,7 @@ uint64_t l5; uint64_t l6; uint64_t l7; - ipl_t ipl; + ipl_t ipl; /* PSTATE */ } context_t; #endif Index: kernel/arch/sparc64/include/drivers/simics_output.h =================================================================== --- kernel/arch/sparc64/include/drivers/simics_output.h (revision 0) +++ kernel/arch/sparc64/include/drivers/simics_output.h (revision 0) @@ -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 + +/** @} + */ \ No newline at end of file Index: kernel/arch/sparc64/Makefile.inc =================================================================== --- kernel/arch/sparc64/Makefile.inc (revision 3448) +++ kernel/arch/sparc64/Makefile.inc (working copy) @@ -114,7 +114,8 @@ arch/$(ARCH)/src/drivers/tick.c \ arch/$(ARCH)/src/drivers/kbd.c \ arch/$(ARCH)/src/drivers/scr.c \ - arch/$(ARCH)/src/drivers/pci.c + arch/$(ARCH)/src/drivers/pci.c \ + arch/$(ARCH)/src/drivers/simics_output.c ifeq ($(CONFIG_SMP),y) ARCH_SOURCES += \ Index: kernel/arch/sparc64/src/context.S =================================================================== --- kernel/arch/sparc64/src/context.S (revision 3448) +++ kernel/arch/sparc64/src/context.S (working copy) @@ -28,6 +28,8 @@ #include +// tyto funkce bude vyuzivat prevazne scheduler a waitq + /** * Both context_save_arch() and context_restore_arch() are * leaf-optimized procedures. This kind of optimization Index: kernel/arch/sparc64/src/cpu/cpu.c =================================================================== --- kernel/arch/sparc64/src/cpu/cpu.c (revision 3448) +++ kernel/arch/sparc64/src/cpu/cpu.c (working copy) @@ -54,11 +54,13 @@ /* * Detect processor frequency. */ - node = ofw_tree_find_child_by_device_type(ofw_tree_lookup("/"), "cpu"); + //node = ofw_tree_find_child_by_device_type(ofw_tree_lookup("/"), "cpu"); + node = ofw_tree_find_child_by_device_type(ofw_tree_lookup("/ssm@0,0"), "cpu"); while (node) { ofw_tree_property_t *prop; - prop = ofw_tree_getprop(node, "upa-portid"); + //prop = ofw_tree_getprop(node, "upa-portid"); + prop = ofw_tree_getprop(node, "portid"); if (prop && prop->value) { mid = *((uint32_t *) prop->value); if (mid == CPU->arch.mid) { Index: kernel/arch/sparc64/src/smp/smp.c =================================================================== --- kernel/arch/sparc64/src/smp/smp.c (revision 3448) +++ kernel/arch/sparc64/src/smp/smp.c (working copy) @@ -61,7 +61,8 @@ ofw_tree_node_t *node; count_t cnt = 0; - node = ofw_tree_find_child_by_device_type(ofw_tree_lookup("/"), "cpu"); + //node = ofw_tree_find_child_by_device_type(ofw_tree_lookup("/"), "cpu"); + node = ofw_tree_find_child_by_device_type(ofw_tree_lookup("/ssm"), "cpu"); while (node) { cnt++; node = ofw_tree_find_peer_by_device_type(node, "cpu"); Index: kernel/arch/sparc64/src/sparc64.c =================================================================== --- kernel/arch/sparc64/src/sparc64.c (revision 3448) +++ kernel/arch/sparc64/src/sparc64.c (working copy) @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -87,7 +88,8 @@ */ irq_init(1 << 11, 128); - standalone_sparc64_console_init(); + simics_output_init(); + //standalone_sparc64_console_init(); } } Index: kernel/arch/sparc64/src/drivers/simics_output.c =================================================================== --- kernel/arch/sparc64/src/drivers/simics_output.c (revision 0) +++ kernel/arch/sparc64/src/drivers/simics_output.c (revision 0) @@ -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 +#include +#include +#include + +/** 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 hang it up + * 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; +} + +/** @} + */ Index: uspace/lib/libc/arch/sparc64/include/stack.h =================================================================== --- uspace/lib/libc/arch/sparc64/include/stack.h (revision 3448) +++ uspace/lib/libc/arch/sparc64/include/stack.h (working copy) @@ -40,6 +40,7 @@ /** According to SPARC Compliance Definition, every stack frame is 16-byte aligned. */ #define STACK_ALIGNMENT 16 +// proc tak malo? Co parametry volani fce mimo o0-o5? /** * 16-extended-word save area for %i[0-7] and %l[0-7] registers. */ Index: boot/genarch/ofw_tree.c =================================================================== --- boot/genarch/ofw_tree.c (revision 3448) +++ boot/genarch/ofw_tree.c (working copy) @@ -107,6 +107,8 @@ return; path[len] = '\0'; + ofw_write("\n\rProcessing node, whose path is ", 33); + ofw_write(path, len); for (i = len - 1; i >= 0 && path[i] != '/'; i--) ; i++; /* do not include '/' */ @@ -115,12 +117,15 @@ /* add space for trailing '\0' */ current_node->da_name = ofw_tree_space_alloc(len + 1); + if (!current_node->da_name) return; memcpy(current_node->da_name, &path[i], len); current_node->da_name[len] = '\0'; + ofw_write("\nprocessing node: ", 17); + ofw_write(current_node->da_name, len); /* * Recursively process the potential child node. @@ -204,6 +209,8 @@ */ continue; } + } else { + ofw_write("Nejsou dalsi peery.", 19); } /* * No more peers on this level. @@ -219,10 +226,18 @@ ofw_tree_node_t *ofw_tree_build(void) { ofw_tree_node_t *root; + ofw_tree_node_t *ssm; root = ofw_tree_node_alloc(); if (root) ofw_tree_node_process(root, NULL, ofw_root); + ssm = ofw_tree_node_alloc(); + if (ssm) { + ofw_tree_node_process(ssm, root, ofw_find_device("/ssm@0,0")); + ssm->peer = root->child; + root->child = ssm; + } + return root; } Index: boot/genarch/balloc.c =================================================================== --- boot/genarch/balloc.c (revision 3448) +++ boot/genarch/balloc.c (working copy) @@ -29,6 +29,7 @@ #include #include #include +#include static ballocs_t *ballocs; @@ -48,8 +49,10 @@ addr = ballocs->base + ALIGN_UP(ballocs->size, alignment); - if (ALIGN_UP(ballocs->size, alignment) + size > BALLOC_MAX_SIZE) + if (ALIGN_UP(ballocs->size, alignment) + size > BALLOC_MAX_SIZE) { + ofw_write("KONEC!!!", 8); return NULL; + } ballocs->size = ALIGN_UP(ballocs->size, alignment) + size; Index: boot/arch/sparc64/loader/ofwarch.c =================================================================== --- boot/arch/sparc64/loader/ofwarch.c (revision 3448) +++ boot/arch/sparc64/loader/ofwarch.c (working copy) @@ -56,12 +56,21 @@ return flag != -1; } +#if defined (OPEN_BOOT) +#define CPUS_PARENT_NODE ofw_root +#define PORTID_NAME "upa-portid" +#elif defined (SMART_FIRMWARE) +#define CPUS_PARENT_NODE ofw_find_device("/ssm@0,0") +#define PORTID_NAME "portid" +#endif + + int ofw_cpu(void) { char type_name[BUF_SIZE]; phandle node; - node = ofw_get_child_node(ofw_root); + node = ofw_get_child_node(CPUS_PARENT_NODE); if (node == 0 || node == -1) { printf("Could not find any child nodes of the root node.\n"); return 0; @@ -84,9 +93,10 @@ if (strcmp(type_name, "cpu") == 0) { uint32_t mid; - if (ofw_get_property(node, "upa-portid", &mid, + if (ofw_get_property(node, PORTID_NAME, &mid, sizeof(mid)) <= 0) continue; + write("boot detected cpu\n", 18); if (current_mid != mid) { /* Index: usiii.simics =================================================================== --- usiii.simics (revision 0) +++ usiii.simics (revision 0) @@ -0,0 +1,127 @@ +if not defined create_network {$create_network = "yes"} + +$disk_size = 8513945600 + +### + +if not defined hostid {$hostid = 0x80804a6c} +if not defined freq_mhz {$freq_mhz = 75} +if not defined mac_address {$mac_address = "10:10:10:10:10:24"} +if not defined disk_size {$disk_size = 2128486400} +if not defined rtc_time {$rtc_time = "2002-06-02 17:00:00 UTC"} +if not defined num_cpus {$num_cpus = 1} +if not defined megs_per_cpu {$megs_per_cpu = 256} +if not defined cpu_class {$cpu_class = "ultrasparc-iii-plus"} + +### + +add-directory "%simics%/targets/serengeti/images/" + +import-pci-components +import-std-components +import-sun-components +import-serengeti-components + +if $cpu_class == "ultrasparc-iii-plus" { + $create_function = "create-serengeti-us-iii-plus-cpu-board" +} else if $cpu_class == "ultrasparc-iii" { + $create_function = "create-serengeti-us-iii-cpu-board" +} else if $cpu_class == "ultrasparc-iv" { + $create_function = "create-serengeti-us-iv-cpu-board" +} else if $cpu_class == "ultrasparc-iv-plus" { + $create_function = "create-serengeti-us-iv-plus-cpu-board" +} else { + echo "Unknown cpu_class" + $cpu_class + exit 1 +} + +$system = (create-serengeti-6800-chassis hostid = $hostid + mac_address = $mac_address + rtc_time = $rtc_time) +$board = 0 +$cpus_left = $num_cpus +while $cpus_left > 0 { + $cpus = (min 4 $cpus_left) + $cpubrd[$board] = ($create_function num_cpus = $cpus + cpu_frequency = $freq_mhz + memory_megs = ($megs_per_cpu * $cpus)) + $system.connect ("cpu-slot" + $board) $cpubrd[$board] + $board += 1 + $cpus_left -= 4 +} +unset cpus + +$pciboard = (create-serengeti-pci8-board) + +$pci_hme = (create-sun-pci-hme mac_address = $mac_address) +$pci_glm = (create-pci-sym53c875) +$scsi_bus = (create-std-scsi-bus) +$scsi_disk = (create-std-scsi-disk scsi_id = 0 size = $disk_size) +$scsi_cdrom = (create-std-scsi-cdrom scsi_id = 6) +$console = (create-std-text-console) + +### + +$system.connect io-slot6 $pciboard +$pciboard.connect pci-slot0 $pci_hme +$pciboard.connect pci-slot5 $pci_glm +$scsi_bus.connect $pci_glm +$scsi_bus.connect $scsi_disk +$scsi_bus.connect $scsi_cdrom +$system.connect $console + +$machine_defined = 1 + +instantiate-components + +$eth_comp = $pci_hme +$eth_cnt = "" + +if $create_network == "yes" { + if not $eth_link { + $eth_link = (new-std-ethernet-link) + } + $eth_link.connect $eth_comp $eth_cnt + if not $service_node { + $service_node = (new-std-service-node) + local $cnt = ($service_node.add-connector 10.10.0.1) + $service_node.connect $cnt $eth_link + } +} + +unset eth_comp eth_cnt + +$cdrom_path = "image.iso" + ($scsi_cdrom.get-component-object cd).insert (new-file-cdrom $cdrom_path) + $system.set-prom-env boot-command "boot /ssm@0,0/pci@19,700000/scsi@2/disk@6,0:f" + $system.set-prom-env auto-boot? true + +@buf = 0; +@offset = 0; +@register2Number = SIM_get_register_number(SIM_current_processor(), "g2"); +@register3Number = SIM_get_register_number(SIM_current_processor(), "g3"); + +@def schedule(): + SIM_realtime_event(100, handler, 0, 0, ''); + +@def handler(x): + global buf + global offset + if (SIM_simics_is_running()): + register2Value = SIM_read_register(SIM_current_processor(), register2Number); + if ((buf == 0) and register2Value == 0x18273645): + buf = SIM_read_register(SIM_current_processor(), register3Number); + SIM_write_register(SIM_current_processor(), register2Number, 0); + SIM_flush(); + print buf + elif (buf != 0): + byte = SIM_read_phys_memory(SIM_current_processor(), buf + offset, 1); + while byte != 0: + SIM_putchar(byte); + SIM_flush(); + SIM_write_phys_memory(SIM_current_processor(), buf + offset, 0, 1); + offset = (offset + 1) % 512; + byte = SIM_read_phys_memory(SIM_current_processor(), buf + offset, 1); + schedule(); + +@schedule();