| 248 | } bioscall_vector; /* bios jump vector */ |
| 249 | |
| 250 | void |
| 251 | set_bios_selectors(struct bios_segments *seg, int flags) |
| 252 | { |
| 253 | struct soft_segment_descriptor ssd = { |
| 254 | 0, /* segment base address (overwritten) */ |
| 255 | 0, /* length (overwritten) */ |
| 256 | SDT_MEMERA, /* segment type (overwritten) */ |
| 257 | 0, /* priority level */ |
| 258 | 1, /* descriptor present */ |
| 259 | 0, 0, |
| 260 | 1, /* descriptor size (overwritten) */ |
| 261 | 0 /* granularity == byte units */ |
| 262 | }; |
| 263 | union descriptor *p_gdt; |
| 264 | |
| 265 | #ifdef SMP |
| 266 | p_gdt = &gdt[PCPU_GET(cpuid) * NGDT]; |
| 267 | #else |
| 268 | p_gdt = gdt; |
| 269 | #endif |
| 270 | |
| 271 | ssd.ssd_base = seg->code32.base; |
| 272 | ssd.ssd_limit = seg->code32.limit; |
| 273 | ssdtosd(&ssd, &p_gdt[GBIOSCODE32_SEL].sd); |
| 274 | |
| 275 | ssd.ssd_def32 = 0; |
| 276 | if (flags & BIOSCODE_FLAG) { |
| 277 | ssd.ssd_base = seg->code16.base; |
| 278 | ssd.ssd_limit = seg->code16.limit; |
| 279 | ssdtosd(&ssd, &p_gdt[GBIOSCODE16_SEL].sd); |
| 280 | } |
| 281 | |
| 282 | ssd.ssd_type = SDT_MEMRWA; |
| 283 | if (flags & BIOSDATA_FLAG) { |
| 284 | ssd.ssd_base = seg->data.base; |
| 285 | ssd.ssd_limit = seg->data.limit; |
| 286 | ssdtosd(&ssd, &p_gdt[GBIOSDATA_SEL].sd); |
| 287 | } |
| 288 | |
| 289 | if (flags & BIOSUTIL_FLAG) { |
| 290 | ssd.ssd_base = seg->util.base; |
| 291 | ssd.ssd_limit = seg->util.limit; |
| 292 | ssdtosd(&ssd, &p_gdt[GBIOSUTIL_SEL].sd); |
| 293 | } |
| 294 | |
| 295 | if (flags & BIOSARGS_FLAG) { |
| 296 | ssd.ssd_base = seg->args.base; |
| 297 | ssd.ssd_limit = seg->args.limit; |
| 298 | ssdtosd(&ssd, &p_gdt[GBIOSARGS_SEL].sd); |
| 299 | } |
| 300 | } |
| 301 | |
| 302 | extern int vm86pa; |
| 303 | extern u_long vm86phystk; |