Subversion Repositories HelenOS-historic

Rev

Rev 534 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 534 Rev 881
Line 23... Line 23...
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
27
 */
28
 
-
 
29
#include "main.h"
-
 
30
 
28
 
-
 
29
#include "main.h" 
-
 
30
#include "printf.h"
31
ofw_entry ofw;
31
#include "ofw.h"
32
 
32
 
33
phandle ofw_chosen;
-
 
34
ihandle ofw_stdout;
-
 
35
 
-
 
36
void init(void)
33
static void halt(void)
37
{
-
 
38
    ofw_chosen = ofw_find_device("/chosen");
-
 
39
    if (ofw_chosen == -1)
-
 
40
        ofw_call("exit", 0, 0);
-
 
41
   
-
 
42
    if (ofw_get_property(ofw_chosen, "stdout",  &ofw_stdout, sizeof(ofw_stdout)) <= 0) 
-
 
43
        ofw_stdout = 0;
-
 
44
}
-
 
45
 
-
 
46
int ofw_call(const char *service, const int nargs, const int nret, ...)
-
 
47
{
-
 
48
    va_list list;
-
 
49
    ofw_args_t args;
-
 
50
    int i;
-
 
51
   
-
 
52
    args.service = service;
-
 
53
    args.nargs = nargs;
-
 
54
    args.nret = nret;
-
 
55
   
-
 
56
    va_start(list, nret);
-
 
57
    for (i = 0; i < nargs; i++)
-
 
58
        args.args[i] = va_arg(list, ofw_arg_t);
-
 
59
    va_end(list);
-
 
60
   
-
 
61
    for (i = 0; i < nret; i++)
-
 
62
        args.args[i + nargs] = 0;
-
 
63
   
-
 
64
    ofw(&args);
-
 
65
   
-
 
66
    return args.args[nargs];
-
 
67
}
-
 
68
 
-
 
69
void ofw_write(const char *str, const int len)
-
 
70
{
34
{
71
    if (ofw_stdout == 0)
-
 
72
        return;
35
    while (1);
73
   
-
 
74
    ofw_call("write", 3, 1, ofw_stdout, str, len);
-
 
75
}
36
}
76
 
37
 
77
void ofw_puts(const char *str)
38
void bootstrap(void)
78
{
39
{
79
    int len = 0;
40
    printf("\nHelenOS PPC Bootloader\nKernel size %d, load address %L\n", KERNEL_SIZE, KERNEL_LOAD_ADDRESS);
80
   
41
   
-
 
42
    void *addr = ofw_claim((void *) KERNEL_LOAD_ADDRESS, KERNEL_SIZE, 1);
81
    while (str[len] != 0)
43
    if (addr == NULL) {
-
 
44
        printf("Error: Unable to claim memory");
82
        len++;
45
        halt();
-
 
46
    }
83
   
47
   
84
    ofw_write(str, len);
-
 
85
}
-
 
86
 
-
 
87
phandle ofw_find_device(const char *name)
-
 
88
{
-
 
89
    return ofw_call("finddevice", 1, 1, name);
-
 
90
}
-
 
91
 
-
 
92
int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen)
-
 
93
{
-
 
94
    return ofw_call("getprop", 4, 1, device, name, buf, buflen);
-
 
95
}
-
 
96
 
-
 
97
void bootstrap(void)
-
 
98
{
-
 
99
    ofw_puts("\nHelenOS PPC Bootloader\n");
-
 
100
 
-
 
101
    while (1);
48
    halt();
102
}
49
}