Revision 66508601

b/hw/sun4m.c
117 117
    m48t59_write(nvram, addr + max - 1, '\0');
118 118
}
119 119

  
120
static uint32_t nvram_set_var (m48t59_t *nvram, uint32_t addr,
121
                                const unsigned char *str)
122
{
123
    uint32_t len;
124

  
125
    len = strlen(str) + 1;
126
    nvram_set_string(nvram, addr, str, len);
127

  
128
    return addr + len;
129
}
130

  
131
static void nvram_finish_partition (m48t59_t *nvram, uint32_t start,
132
                                    uint32_t end)
133
{
134
    unsigned int i, sum;
135

  
136
    // Length divided by 16
137
    m48t59_write(nvram, start + 2, ((end - start) >> 12) & 0xff);
138
    m48t59_write(nvram, start + 3, ((end - start) >> 4) & 0xff);
139
    // Checksum
140
    sum = m48t59_read(nvram, start);
141
    for (i = 0; i < 14; i++) {
142
        sum += m48t59_read(nvram, start + 2 + i);
143
        sum = (sum + ((sum & 0xff00) >> 8)) & 0xff;
144
    }
145
    m48t59_write(nvram, start + 1, sum & 0xff);
146
}
147

  
120 148
static m48t59_t *nvram;
121 149

  
122 150
extern int nographic;
......
128 156
                       int machine_id)
129 157
{
130 158
    unsigned char tmp = 0;
131
    int i, j;
159
    unsigned int i, j;
160
    uint32_t start, end;
132 161

  
133 162
    // Try to match PPC NVRAM
134 163
    nvram_set_string(nvram, 0x00, "QEMU_BIOS", 16);
......
151 180
    nvram_set_word(nvram,   0x56, height);
152 181
    nvram_set_word(nvram,   0x58, depth);
153 182

  
183
    // OpenBIOS nvram variables
184
    // Variable partition
185
    start = 252;
186
    m48t59_write(nvram, start, 0x70);
187
    nvram_set_string(nvram, start + 4, "system", 12);
188

  
189
    end = start + 16;
190
    for (i = 0; i < nb_prom_envs; i++)
191
        end = nvram_set_var(nvram, end, prom_envs[i]);
192

  
193
    m48t59_write(nvram, end++ , 0);
194
    end = start + ((end - start + 15) & ~15);
195
    nvram_finish_partition(nvram, start, end);
196

  
197
    // free partition
198
    start = end;
199
    m48t59_write(nvram, start, 0x7f);
200
    nvram_set_string(nvram, start + 4, "free", 12);
201

  
202
    end = 0x1fd0;
203
    nvram_finish_partition(nvram, start, end);
204

  
154 205
    // Sun4m specific use
155
    i = 0x1fd8;
206
    start = i = 0x1fd8;
156 207
    m48t59_write(nvram, i++, 0x01);
157 208
    m48t59_write(nvram, i++, machine_id);
158 209
    j = 0;
......
164 215
    m48t59_write(nvram, i, macaddr[j]);
165 216

  
166 217
    /* Calculate checksum */
167
    for (i = 0x1fd8; i < 0x1fe7; i++) {
168
	tmp ^= m48t59_read(nvram, i);
218
    for (i = start; i < start + 15; i++) {
219
        tmp ^= m48t59_read(nvram, i);
169 220
    }
170
    m48t59_write(nvram, 0x1fe7, tmp);
221
    m48t59_write(nvram, start + 15, tmp);
171 222
}
172 223

  
173 224
static void *slavio_intctl;
b/hw/sun4u.c
170 170
    return crc;
171 171
}
172 172

  
173
static uint32_t nvram_set_var (m48t59_t *nvram, uint32_t addr,
174
                                const unsigned char *str)
175
{
176
    uint32_t len;
177

  
178
    len = strlen(str) + 1;
179
    NVRAM_set_string(nvram, addr, str, len);
180

  
181
    return addr + len;
182
}
183

  
184
static void nvram_finish_partition (m48t59_t *nvram, uint32_t start,
185
                                    uint32_t end)
186
{
187
    unsigned int i, sum;
188

  
189
    // Length divided by 16
190
    m48t59_write(nvram, start + 2, ((end - start) >> 12) & 0xff);
191
    m48t59_write(nvram, start + 3, ((end - start) >> 4) & 0xff);
192
    // Checksum
193
    sum = m48t59_read(nvram, start);
194
    for (i = 0; i < 14; i++) {
195
        sum += m48t59_read(nvram, start + 2 + i);
196
        sum = (sum + ((sum & 0xff00) >> 8)) & 0xff;
197
    }
198
    m48t59_write(nvram, start + 1, sum & 0xff);
199
}
200

  
173 201
extern int nographic;
174 202

  
175 203
int sun4u_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size,
......
182 210
                          int width, int height, int depth)
183 211
{
184 212
    uint16_t crc;
213
    unsigned int i;
214
    uint32_t start, end;
185 215

  
186 216
    /* Set parameters for Open Hack'Ware BIOS */
187 217
    NVRAM_set_string(nvram, 0x00, "QEMU_BIOS", 16);
......
212 242
    crc = NVRAM_compute_crc(nvram, 0x00, 0xF8);
213 243
    NVRAM_set_word(nvram,  0xFC, crc);
214 244

  
245
    // OpenBIOS nvram variables
246
    // Variable partition
247
    start = 252;
248
    m48t59_write(nvram, start, 0x70);
249
    NVRAM_set_string(nvram, start + 4, "system", 12);
250

  
251
    end = start + 16;
252
    for (i = 0; i < nb_prom_envs; i++)
253
        end = nvram_set_var(nvram, end, prom_envs[i]);
254

  
255
    m48t59_write(nvram, end++ , 0);
256
    end = start + ((end - start + 15) & ~15);
257
    nvram_finish_partition(nvram, start, end);
258

  
259
    // free partition
260
    start = end;
261
    m48t59_write(nvram, start, 0x7f);
262
    NVRAM_set_string(nvram, start + 4, "free", 12);
263

  
264
    end = 0x1fd0;
265
    nvram_finish_partition(nvram, start, end);
266

  
215 267
    return 0;
216 268
}
217 269

  
b/qemu-doc.texi
1661 1661

  
1662 1662
Set the initial TCX graphic mode. The default is 1024x768.
1663 1663

  
1664
@item -prom-env string
1665

  
1666
Set OpenBIOS variables in NVRAM, for example:
1667

  
1668
@example
1669
qemu-system-sparc -prom-env 'auto-boot?=false' \
1670
 -prom-env 'boot-device=sd(0,2,0):d' -prom-env 'boot-args=linux single'
1671
@end example
1672

  
1664 1673
@end table
1665 1674

  
1666 1675
@c man end 
b/vl.c
197 197
int semihosting_enabled = 0;
198 198
int autostart = 1;
199 199
const char *qemu_name;
200
#ifdef TARGET_SPARC
201
unsigned int nb_prom_envs = 0;
202
const char *prom_envs[MAX_PROM_ENVS];
203
#endif
200 204

  
201 205
/***********************************************************/
202 206
/* x86 ISA bus support */
......
6530 6534
	   "-daemonize      daemonize QEMU after initializing\n"
6531 6535
#endif
6532 6536
	   "-option-rom rom load a file, rom, into the option ROM space\n"
6537
#ifdef TARGET_SPARC
6538
           "-prom-env variable=value  set OpenBIOS nvram variables\n"
6539
#endif
6533 6540
           "\n"
6534 6541
           "During emulation, the following keys are useful:\n"
6535 6542
           "ctrl-alt-f      toggle full screen\n"
......
6624 6631
    QEMU_OPTION_option_rom,
6625 6632
    QEMU_OPTION_semihosting,
6626 6633
    QEMU_OPTION_name,
6634
    QEMU_OPTION_prom_env,
6627 6635
};
6628 6636

  
6629 6637
typedef struct QEMUOption {
......
6721 6729
    { "semihosting", 0, QEMU_OPTION_semihosting },
6722 6730
#endif
6723 6731
    { "name", HAS_ARG, QEMU_OPTION_name },
6732
#if defined(TARGET_SPARC)
6733
    { "prom-env", HAS_ARG, QEMU_OPTION_prom_env },
6734
#endif
6724 6735
    { NULL },
6725 6736
};
6726 6737

  
......
7478 7489
            case QEMU_OPTION_name:
7479 7490
                qemu_name = optarg;
7480 7491
                break;
7492
#ifdef TARGET_SPARC
7493
            case QEMU_OPTION_prom_env:
7494
                if (nb_prom_envs >= MAX_PROM_ENVS) {
7495
                    fprintf(stderr, "Too many prom variables\n");
7496
                    exit(1);
7497
                }
7498
                prom_envs[nb_prom_envs] = optarg;
7499
                nb_prom_envs++;
7500
                break;
7501
#endif
7481 7502
            }
7482 7503
        }
7483 7504
    }
b/vl.h
169 169
extern const char *option_rom[MAX_OPTION_ROMS];
170 170
extern int nb_option_roms;
171 171

  
172
#ifdef TARGET_SPARC
173
#define MAX_PROM_ENVS 128
174
extern const char *prom_envs[MAX_PROM_ENVS];
175
extern unsigned int nb_prom_envs;
176
#endif
177

  
172 178
/* XXX: make it dynamic */
173 179
#define MAX_BIOS_SIZE (4 * 1024 * 1024)
174 180
#if defined (TARGET_PPC) || defined (TARGET_SPARC64)

Also available in: Unified diff