Lines Matching +full:segment +full:- +full:0
1 // SPDX-License-Identifier: GPL-2.0
2 /*---------------------------------------------------------------------------+
9 | Australia. E-mail billm@suburbia.net |
12 +---------------------------------------------------------------------------*/
14 /*---------------------------------------------------------------------------+
19 +---------------------------------------------------------------------------*/
30 #define FPU_WRITE_BIT 0x10
43 #define REG_(x) (*(long *)(reg_offset[(x)] + (u_char *)FPU_info->regs))
56 (reg_offset_vm86[((unsigned)x)] + (u_char *)FPU_info->regs))
69 (reg_offset_pm[((unsigned)x)] + (u_char *)FPU_info->regs))
71 /* Decode the SIB byte. This function assumes mod != 0 */
86 if ((mod == 0) && (base == 5)) in sib()
87 offset = 0; /* No base register */ in sib()
93 /* A non-zero ss is illegal */ in sib()
109 } else if (mod == 2 || base == 5) { /* The second condition also has mod==0 */ in sib()
123 static unsigned long vm86_segment(u_char segment, struct address *addr) in vm86_segment() argument
125 segment--; in vm86_segment()
127 if (segment > PREFIX_SS_) { in vm86_segment()
128 EXCEPTION(EX_INTERNAL | 0x130); in vm86_segment()
132 addr->selector = VM86_REG_(segment); in vm86_segment()
133 return (unsigned long)VM86_REG_(segment) << 4; in vm86_segment()
137 static long pm_address(u_char FPU_modrm, u_char segment, in pm_address() argument
143 segment--; in pm_address()
146 /* segment is unsigned, so this also detects if segment was 0: */ in pm_address()
147 if (segment > PREFIX_SS_) { in pm_address()
148 EXCEPTION(EX_INTERNAL | 0x132); in pm_address()
153 switch (segment) { in pm_address()
154 case PREFIX_GS_ - 1: in pm_address()
156 savesegment(gs, addr->selector); in pm_address()
159 addr->selector = PM_REG_(segment); in pm_address()
162 descriptor = FPU_get_ldt_descriptor(addr->selector); in pm_address()
167 limit += base_address - 1; in pm_address()
169 limit = 0xffffffff; in pm_address()
173 seg_top = 0xffffffff; in pm_address()
177 seg_top = 0xffffffff; in pm_address()
180 (address <= limit) || (address >= seg_top) ? 0 : in pm_address()
181 ((seg_top - address) >= 255 ? 255 : seg_top - address); in pm_address()
184 (address > limit) || (address < base_address) ? 0 : in pm_address()
185 ((limit - address) >= 254 ? 255 : limit - address + 1); in pm_address()
189 access_limit = 0; in pm_address()
198 7 6 5 4 3 2 1 0
204 7 6 5 4 3 2 1 0
216 int address = 0; /* Initialized just to stop compiler warnings. */ in FPU_get_address()
219 in `non-segmented' 32 bit protected mode. */ in FPU_get_address()
221 && (addr_modes.override.segment == PREFIX_CS_)) { in FPU_get_address()
225 addr->selector = FPU_DS; /* Default, for 32 bit non-segmented mode. */ in FPU_get_address()
234 case 0: in FPU_get_address()
244 addr->offset = address; in FPU_get_address()
249 addr->offset = address; in FPU_get_address()
275 addr->offset = address; in FPU_get_address()
278 case 0: in FPU_get_address()
281 address += vm86_segment(addr_modes.override.segment, addr); in FPU_get_address()
285 address = pm_address(FPU_modrm, addr_modes.override.segment, in FPU_get_address()
289 EXCEPTION(EX_INTERNAL | 0x133); in FPU_get_address()
300 int address = 0; /* Default used for mod == 0 */ in FPU_get_address_16()
303 in `non-segmented' 32 bit protected mode. */ in FPU_get_address_16()
305 && (addr_modes.override.segment == PREFIX_CS_)) { in FPU_get_address_16()
309 addr->selector = FPU_DS; /* Default, for 32 bit non-segmented mode. */ in FPU_get_address_16()
314 case 0: in FPU_get_address_16()
348 case 0: in FPU_get_address_16()
349 address += FPU_info->regs->bx + FPU_info->regs->si; in FPU_get_address_16()
352 address += FPU_info->regs->bx + FPU_info->regs->di; in FPU_get_address_16()
355 address += FPU_info->regs->bp + FPU_info->regs->si; in FPU_get_address_16()
356 if (addr_modes.override.segment == PREFIX_DEFAULT) in FPU_get_address_16()
357 addr_modes.override.segment = PREFIX_SS_; in FPU_get_address_16()
360 address += FPU_info->regs->bp + FPU_info->regs->di; in FPU_get_address_16()
361 if (addr_modes.override.segment == PREFIX_DEFAULT) in FPU_get_address_16()
362 addr_modes.override.segment = PREFIX_SS_; in FPU_get_address_16()
365 address += FPU_info->regs->si; in FPU_get_address_16()
368 address += FPU_info->regs->di; in FPU_get_address_16()
371 address += FPU_info->regs->bp; in FPU_get_address_16()
372 if (addr_modes.override.segment == PREFIX_DEFAULT) in FPU_get_address_16()
373 addr_modes.override.segment = PREFIX_SS_; in FPU_get_address_16()
376 address += FPU_info->regs->bx; in FPU_get_address_16()
381 address &= 0xffff; in FPU_get_address_16()
383 addr->offset = address; in FPU_get_address_16()
386 case 0: in FPU_get_address_16()
389 address += vm86_segment(addr_modes.override.segment, addr); in FPU_get_address_16()
393 address = pm_address(FPU_modrm, addr_modes.override.segment, in FPU_get_address_16()
397 EXCEPTION(EX_INTERNAL | 0x131); in FPU_get_address_16()