~hamo/ubuntu/precise/grub2/grub2.hi_res

« back to all changes in this revision

Viewing changes to grub-core/boot/sparc64/ieee1275/boot.S

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson, Colin Watson, Robert Millan, Updated translations
  • Date: 2010-11-22 12:24:56 UTC
  • mfrom: (1.26.4 upstream) (17.3.36 sid)
  • mto: (17.3.43 sid)
  • mto: This revision was merged to the branch mainline in revision 89.
  • Revision ID: james.westby@ubuntu.com-20101122122456-y82z3sfb7k4zfdcc
Tags: 1.99~20101122-1
[ Colin Watson ]
* New Bazaar snapshot.  Too many changes to list in full, but some of the
  more user-visible ones are as follows:
  - GRUB script:
    + Function parameters, "break", "continue", "shift", "setparams",
      "return", and "!".
    + "export" command supports multiple variable names.
    + Multi-line quoted strings support.
    + Wildcard expansion.
  - sendkey support.
  - USB hotunplugging and USB serial support.
  - Rename CD-ROM to cd on BIOS.
  - Add new --boot-directory option to grub-install, grub-reboot, and
    grub-set-default; the old --root-directory option is still accepted
    but was often confusing.
  - Basic btrfs detection/UUID support (but no file reading yet).
  - bash-completion for utilities.
  - If a device is listed in device.map, always assume that it is
    BIOS-visible rather than using extra layers such as LVM or RAID.
  - Add grub-mknetdir script (closes: #550658).
  - Remove deprecated "root" command.
  - Handle RAID devices containing virtio components.
  - GRUB Legacy configuration file support (via grub-menulst2cfg).
  - Keyboard layout support (via grub-mklayout and grub-kbdcomp).
  - Check generated grub.cfg for syntax errors before saving.
  - Pause execution for at most ten seconds if any errors are displayed,
    so that the user has a chance to see them.
  - Support submenus.
  - Write embedding zone using Reed-Solomon, so that it's robust against
    being partially overwritten (closes: #550702, #591416, #593347).
  - GRUB_DISABLE_LINUX_RECOVERY and GRUB_DISABLE_NETBSD_RECOVERY merged
    into a single GRUB_DISABLE_RECOVERY variable.
  - Fix loader memory allocation failure (closes: #551627).
  - Don't call savedefault on recovery entries (closes: #589325).
  - Support triple-indirect blocks on ext2 (closes: #543924).
  - Recognise DDF1 fake RAID (closes: #603354).

[ Robert Millan ]
* Use dpkg architecture wildcards.

[ Updated translations ]
* Slovenian (Vanja Cvelbar).  Closes: #604003
* Dzongkha (dawa pemo via Tenzin Dendup).  Closes: #604102

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*-Asm-*- */
 
2
/*
 
3
 *  GRUB  --  GRand Unified Bootloader
 
4
 *  Copyright (C) 2009  Free Software Foundation, Inc.
 
5
 *
 
6
 *  GRUB is free software: you can redistribute it and/or modify
 
7
 *  it under the terms of the GNU General Public License as published by
 
8
 *  the Free Software Foundation, either version 3 of the License, or
 
9
 *  (at your option) any later version.
 
10
 *
 
11
 *  GRUB is distributed in the hope that it will be useful,
 
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
 *  GNU General Public License for more details.
 
15
 *
 
16
 *  You should have received a copy of the GNU General Public License
 
17
 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 
18
 */
 
19
 
 
20
#include <grub/boot.h>
 
21
#include <grub/machine/boot.h>
 
22
 
 
23
        .text
 
24
        .align  4
 
25
        .globl  _start
 
26
_start:
 
27
        /* OF CIF entry point arrives in %o4 */
 
28
pic_base:
 
29
        call    boot_continue
 
30
         mov    %o4, CIF_REG
 
31
 
 
32
        . = _start + GRUB_BOOT_MACHINE_VER_MAJ
 
33
boot_version:           .byte   GRUB_BOOT_VERSION_MAJOR, GRUB_BOOT_VERSION_MINOR
 
34
 
 
35
        /* The offsets to these locations are defined by the
 
36
         * GRUB_BOOT_MACHINE_foo macros in include/grub/sparc/ieee1275/boot.h,
 
37
         * and grub-setup uses this to patch these next three values as needed.
 
38
         *
 
39
         * The boot_path will be the OF device path of the partition where the
 
40
         * rest of the GRUB kernel image resides.  kernel_sector will be set to
 
41
         * the location of the first block of the GRUB kernel, and
 
42
         * kernel_address is the location where we should load that first block.
 
43
         *
 
44
         * After loading in that block we will execute it by jumping to the
 
45
         * load address plus the size of the prepended A.OUT header (32 bytes).
 
46
         */
 
47
boot_path:
 
48
        . = _start + GRUB_BOOT_MACHINE_KERNEL_BYTE
 
49
boot_path_end:
 
50
kernel_byte:            .xword (2 << 9)
 
51
kernel_address:         .word  GRUB_BOOT_MACHINE_KERNEL_ADDR
 
52
 
 
53
prom_finddev_name:      .asciz "finddevice"
 
54
prom_chosen_path:       .asciz "/chosen"
 
55
prom_getprop_name:      .asciz "getprop"
 
56
prom_stdout_name:       .asciz "stdout"
 
57
prom_write_name:        .asciz "write"
 
58
prom_bootpath_name:     .asciz "bootpath"
 
59
prom_open_name:         .asciz "open"
 
60
prom_seek_name:         .asciz "seek"
 
61
prom_read_name:         .asciz "read"
 
62
prom_exit_name:         .asciz "exit"
 
63
grub_name:              .asciz "GRUB "
 
64
#define GRUB_NAME_LEN   5
 
65
 
 
66
        .align  4
 
67
 
 
68
prom_open_error:
 
69
        GET_ABS(prom_open_name, %o2)
 
70
        call    console_write
 
71
         mov    4, %o3
 
72
        /* fallthru */
 
73
 
 
74
prom_error:
 
75
        GET_ABS(prom_exit_name, %o0)
 
76
        /* fallthru */
 
77
 
 
78
        /* %o0: OF call name
 
79
         * %o1: input arg 1
 
80
         */
 
81
prom_call_1_1_o2:
 
82
        clr     %o2
 
83
        ba      prom_call_x_1
 
84
         mov    1, %g1
 
85
 
 
86
prom_call_getprop:
 
87
        mov     4, %g1
 
88
        stx     %g1, [%l1 + 256]
 
89
        mov     CHOSEN_NODE_REG, %o1
 
90
        ba      prom_call_x_1
 
91
         GET_ABS(prom_getprop_name, %o0)
 
92
 
 
93
prom_call_3_1_o1:
 
94
        ba prom_call_3_1
 
95
         mov    BOOTDEV_REG, %o1
 
96
 
 
97
        
 
98
        /* %o2: message string
 
99
         * %o3: message length
 
100
         */
 
101
console_write:
 
102
        GET_ABS(prom_write_name, %o0)
 
103
        mov     STDOUT_NODE_REG, %o1
 
104
        /* fallthru */
 
105
 
 
106
        /* %o0: OF call name
 
107
         * %o1: input arg 1
 
108
         * %o2: input arg 2
 
109
         * %o3: input arg 3
 
110
         */
 
111
prom_call_3_1:  
 
112
        mov     3, %g1
 
113
prom_call_x_1:
 
114
        mov     1, %o5
 
115
        /* fallthru */
 
116
 
 
117
        /* %o0: OF call name
 
118
         * %g1: num inputs
 
119
         * %o5: num outputs
 
120
         * %o1-%o4: inputs
 
121
         */
 
122
prom_call:
 
123
        stx     %o0, [%l1 + 0x00]
 
124
        stx     %g1, [%l1 + 0x08]
 
125
        stx     %o5, [%l1 + 0x10]
 
126
        stx     %o1, [%l1 + 0x18]
 
127
        stx     %o2, [%l1 + 0x20]
 
128
        stx     %o3, [%l1 + 0x28]
 
129
        stx     %o4, [%l1 + 0x30]
 
130
        jmpl    CIF_REG, %g0
 
131
         mov    %l1, %o0
 
132
 
 
133
boot_continue:
 
134
        mov     %o7, PIC_REG            /* PIC base */
 
135
        sethi   %hi(SCRATCH_PAD_BOOT), %l1      /* OF argument slots */
 
136
 
 
137
        /* Find the /chosen node so we can fetch the stdout handle,
 
138
         * and thus perform console output.
 
139
         *
 
140
         * chosen_node = prom_finddevice("/chosen")
 
141
         */
 
142
        GET_ABS(prom_finddev_name, %o0)
 
143
        call    prom_call_1_1_o2
 
144
         GET_ABS(prom_chosen_path, %o1)
 
145
 
 
146
        ldx     [%l1 + 0x20], CHOSEN_NODE_REG
 
147
        brz     CHOSEN_NODE_REG, prom_error
 
148
 
 
149
        /* getprop(chosen_node, "stdout", &buffer, buffer_size) */
 
150
         GET_ABS(prom_stdout_name, %o2)
 
151
        add     %l1, 256, %o3
 
152
        call    prom_call_getprop
 
153
         mov    1024, %o4
 
154
 
 
155
        lduw    [%l1 + 256], STDOUT_NODE_REG
 
156
        brz,pn  STDOUT_NODE_REG, prom_error
 
157
 
 
158
        /* write(stdout_node, "GRUB ", strlen("GRUB ")) */
 
159
         GET_ABS(grub_name, %o2)
 
160
        call    console_write
 
161
         mov    GRUB_NAME_LEN, %o3
 
162
 
 
163
        GET_ABS(boot_path, %o3)
 
164
        ldub    [%o3], %o1
 
165
        brnz,pn %o1, bootpath_known
 
166
 
 
167
        /* getprop(chosen_node, "bootpath", &buffer, buffer_size) */
 
168
         GET_ABS(prom_bootpath_name, %o2)
 
169
        call    prom_call_getprop
 
170
         mov    (boot_path_end - boot_path), %o4
 
171
 
 
172
bootpath_known: 
 
173
 
 
174
        /* Open up the boot_path, and use that handle to read the
 
175
         * first block of the GRUB kernel image.
 
176
         *
 
177
         * bootdev_handle = open(boot_path)
 
178
         */
 
179
        GET_ABS(prom_open_name, %o0)
 
180
        call    prom_call_1_1_o2
 
181
         GET_ABS(boot_path, %o1)
 
182
 
 
183
        ldx     [%l1 + 0x20], BOOTDEV_REG
 
184
        brz,pn  BOOTDEV_REG, prom_open_error
 
185
 
 
186
        /* Since we have 64-bit cells, the high cell of the seek offset
 
187
         * is zero and the low cell is the entire value.
 
188
         *
 
189
         * seek(bootdev, 0, *kernel_byte)
 
190
         */
 
191
         GET_ABS(prom_seek_name, %o0)
 
192
        clr     %o2
 
193
        call    prom_call_3_1_o1
 
194
         LDX_ABS(kernel_byte, 0x00, %o3)
 
195
 
 
196
        /* read(bootdev, *kernel_address, 512) */
 
197
        GET_ABS(prom_read_name, %o0)
 
198
        LDUW_ABS(kernel_address, 0x00, %o2)
 
199
        call    prom_call_3_1_o1
 
200
         mov    512, %o3
 
201
 
 
202
        LDUW_ABS(kernel_address, 0x00, %o2)
 
203
        jmpl    %o2, %o7
 
204
         nop
 
205
 
 
206
        . = _start + GRUB_BOOT_MACHINE_CODE_END
 
207
 
 
208
/* the last 4 bytes in the sector 0 contain the signature */
 
209
        .word   GRUB_BOOT_MACHINE_SIGNATURE