Rev 885 | Rev 956 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 885 | Rev 953 | ||
---|---|---|---|
Line 25... | Line 25... | ||
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 | 28 | ||
29 | #include "ofw.h" |
29 | #include "ofw.h" |
- | 30 | #include "printf.h" |
|
30 | 31 | ||
31 | ofw_entry ofw; |
32 | ofw_entry ofw; |
32 | 33 | ||
33 | phandle ofw_chosen; |
34 | phandle ofw_chosen; |
- | 35 | ihandle ofw_mmu; |
|
34 | ihandle ofw_stdout; |
36 | ihandle ofw_stdout; |
35 | 37 | ||
36 | 38 | ||
37 | void init(void) |
39 | void init(void) |
38 | { |
40 | { |
39 | ofw_chosen = ofw_find_device("/chosen"); |
41 | ofw_chosen = ofw_find_device("/chosen"); |
40 | if (ofw_chosen == -1) |
42 | if (ofw_chosen == -1) |
41 | ofw_call("exit", 0, 0); |
43 | halt(); |
42 | 44 | ||
43 | if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) |
45 | if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) |
44 | ofw_stdout = 0; |
46 | ofw_stdout = 0; |
- | 47 | ||
- | 48 | ofw_mmu = ofw_open("/mmu"); |
|
- | 49 | if (ofw_mmu == -1) { |
|
- | 50 | puts("Unable to open /mmu node\n"); |
|
- | 51 | halt(); |
|
- | 52 | } |
|
- | 53 | } |
|
- | 54 | ||
- | 55 | void halt(void) |
|
- | 56 | { |
|
- | 57 | ofw_call("exit", 0, 0); |
|
45 | } |
58 | } |
46 | 59 | ||
47 | 60 | ||
48 | int ofw_call(const char *service, const int nargs, const int nret, ...) |
61 | int ofw_call(const char *service, const int nargs, const int nret, ...) |
49 | { |
62 | { |
Line 63... | Line 76... | ||
63 | for (i = 0; i < nret; i++) |
76 | for (i = 0; i < nret; i++) |
64 | args.args[i + nargs] = 0; |
77 | args.args[i + nargs] = 0; |
65 | 78 | ||
66 | ofw(&args); |
79 | ofw(&args); |
67 | 80 | ||
- | 81 | if (nret > 0) |
|
68 | return args.args[nargs]; |
82 | return args.args[nargs + nret - 1]; |
- | 83 | else |
|
- | 84 | return 0; |
|
69 | } |
85 | } |
70 | 86 | ||
71 | 87 | ||
72 | void ofw_write(const char *str, const int len) |
88 | ihandle ofw_open(const char *name) |
73 | { |
89 | { |
74 | if (ofw_stdout == 0) |
- | |
75 | return; |
- | |
76 | - | ||
77 | ofw_call("write", 3, 1, ofw_stdout, str, len); |
90 | return ofw_call("open", 1, 1, name); |
78 | } |
91 | } |
79 | 92 | ||
80 | 93 | ||
81 | void ofw_puts(const char *str) |
94 | void ofw_write(const char *str, const int len) |
82 | { |
95 | { |
83 | int len = 0; |
- | |
84 | - | ||
85 | while (str[len] != 0) |
96 | if (ofw_stdout == 0) |
86 | len++; |
97 | return; |
87 | 98 | ||
88 | ofw_write(str, len); |
99 | ofw_call("write", 3, 1, ofw_stdout, str, len); |
89 | } |
100 | } |
90 | 101 | ||
91 | 102 | ||
92 | phandle ofw_find_device(const char *name) |
103 | phandle ofw_find_device(const char *name) |
93 | { |
104 | { |
Line 103... | Line 114... | ||
103 | 114 | ||
104 | void *ofw_claim(const void *addr, const int size, const int align) |
115 | void *ofw_claim(const void *addr, const int size, const int align) |
105 | { |
116 | { |
106 | return (void *) ofw_call("claim", 3, 1, addr, size, align); |
117 | return (void *) ofw_call("claim", 3, 1, addr, size, align); |
107 | } |
118 | } |
- | 119 | ||
- | 120 | ||
- | 121 | void *ofw_translate(const void *virt) |
|
- | 122 | { |
|
- | 123 | return (void *) ofw_call_method(ofw_mmu, "translate", 1, 5, virt); |
|
- | 124 | } |