Changeset 98151 in vbox for trunk/src/VBox/Runtime/common/compiler
- Timestamp:
- Jan 20, 2023 9:16:34 AM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 155324
- Location:
- trunk/src/VBox/Runtime/common/compiler/vcc
- Files:
-
- 1 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/compiler/vcc/stack-probe-vcc.asm
r98142 r98151 47 47 %include "iprt/asmdefs.mac" 48 48 %include "iprt/x86.mac" 49 %ifdef RT_ARCH_AMD6450 %include "iprt/win/context-amd64.mac"51 %else52 %include "iprt/win/context-x86.mac"53 %endif54 55 56 ;*********************************************************************************************************************************57 ;* Structures and Typedefs *58 ;*********************************************************************************************************************************59 60 ;; Variable descriptor.61 struc RTC_VAR_DESC_T62 .offFrame resd 163 .cbVar resd 164 alignb RTCCPTR_CB65 .pszName RTCCPTR_RES 166 endstruc67 68 ;; Frame descriptor.69 struc RTC_FRAME_DESC_T70 .cVars resd 171 alignb RTCCPTR_CB72 .paVars RTCCPTR_RES 1 ; Array of RTC_VAR_DESC_T.73 endstruc74 75 ;; An alloca allocation.76 struc RTC_ALLOCA_ENTRY_T77 .uGuard1 resd 178 .pNext RTCCPTR_RES 1 ; Misaligned.79 %if ARCH_BITS == 3280 .pNextPad resd 181 %endif82 .cb RTCCPTR_RES 1 ; Misaligned.83 %if ARCH_BITS == 3284 .cbPad resd 185 %endif86 .auGuard2 resd 387 endstruc88 89 %ifdef RT_ARCH_X8690 %define FASTCALL_NAME(a_Name, a_cbArgs) $@ %+ a_Name %+ @ %+ a_cbArgs91 %else92 %define FASTCALL_NAME(a_Name, a_cbArgs) NAME(a_Name)93 %endif94 95 96 ;*********************************************************************************************************************************97 ;* Defined Constants And Macros *98 ;*********************************************************************************************************************************99 %define VARIABLE_MARKER_PRE 0xcccccccc100 %define VARIABLE_MARKER_POST 0xcccccccc101 102 %define ALLOCA_FILLER_BYTE 0xcc103 %define ALLOCA_FILLER_32 0xcccccccc104 105 106 ;*********************************************************************************************************************************107 ;* Global Variables *108 ;*********************************************************************************************************************************109 BEGINDATA110 GLOBALNAME __security_cookie111 dd 0xdeadbeef112 dd 0x0c00ffe0113 114 115 ;*********************************************************************************************************************************116 ;* External Symbols *117 ;*********************************************************************************************************************************118 BEGINCODE119 extern NAME(rtVccStackVarCorrupted)120 extern NAME(rtVccSecurityCookieMismatch)121 extern NAME(rtVccRangeCheckFailed)122 %ifdef RT_ARCH_X86123 extern NAME(rtVccCheckEspFailed)124 %endif125 126 49 127 50 … … 233 156 %endif ; RT_ARCH_X86 234 157 235 236 ;;237 ; This just initializes a global and calls _RTC_SetErrorFuncW to NULL, and238 ; since we don't have either of those we have nothing to do here.239 BEGINPROC _RTC_InitBase240 SEH64_END_PROLOGUE241 ret242 ENDPROC _RTC_InitBase243 244 245 ;;246 ; Nothing to do here.247 BEGINPROC _RTC_Shutdown248 SEH64_END_PROLOGUE249 ret250 ENDPROC _RTC_Shutdown251 252 253 254 255 ;;256 ; Checks stack variable markers.257 ;258 ; This seems to be a regular C function in the CRT, but x86 is conveniently259 ; using the fastcall convention which makes it very similar to amd64.260 ;261 ; We try make this as sleek as possible, leaving all the trouble for when we262 ; find a corrupted stack variable and need to call a C function to complain.263 ;264 ; @param pStackFrame The caller RSP/ESP. [RCX/ECX]265 ; @param pFrameDesc Frame descriptor. [RDX/EDX]266 ;267 ALIGNCODE(64)268 BEGINPROC_RAW FASTCALL_NAME(_RTC_CheckStackVars, 8)269 push xBP270 SEH64_PUSH_xBP271 SEH64_END_PROLOGUE272 273 ;274 ; Load the variable count into eax and check that it's not zero.275 ;276 mov eax, [xDX + RTC_FRAME_DESC_T.cVars]277 test eax, eax278 jz .return279 280 ;281 ; Make edx/rdx point to the current variable and xBP be the frame pointer.282 ; The latter frees up xCX for scratch use and incidentally make stack access283 ; go via SS instead of DS (mostly irrlevant in 64-bit and 32-bit mode).284 ;285 mov xDX, [xDX + RTC_FRAME_DESC_T.paVars]286 mov xBP, xCX287 288 ;289 ; Loop thru the variables and check that their markers/fences haven't be290 ; trampled over.291 ;292 .next_var:293 ; Marker before the variable.294 %if ARCH_BITS == 64295 movsxd rcx, dword [xDX + RTC_VAR_DESC_T.offFrame]296 %else297 mov xCX, dword [xDX + RTC_VAR_DESC_T.offFrame]298 %endif299 cmp dword [xBP + xCX - 4], VARIABLE_MARKER_PRE300 jne rtVccCheckStackVarsFailed301 302 ; Marker after the variable.303 add ecx, dword [xDX + RTC_VAR_DESC_T.cbVar]304 %if ARCH_BITS == 64305 movsxd rcx, ecx306 %endif307 cmp dword [xBP + xCX], VARIABLE_MARKER_POST308 jne rtVccCheckStackVarsFailed309 310 ;311 ; Advance to the next variable.312 ;313 .advance:314 add xDX, RTC_VAR_DESC_T_size315 dec eax316 jnz .next_var317 318 ;319 ; Return.320 ;321 .return:322 pop xBP323 ret324 ENDPROC_RAW FASTCALL_NAME(_RTC_CheckStackVars, 8)325 326 ;327 ; Sub-function for _RTC_CheckStackVars, for purposes of SEH64 unwinding.328 ;329 ; Note! While we consider this fatal and will terminate the application, the330 ; compiler guys do not seem to think it is all that horrible and will331 ; report failure, maybe do an int3, and then try continue execution.332 ;333 BEGINPROC_RAW rtVccCheckStackVarsFailed334 nop ;push xBP - done in parent function335 SEH64_PUSH_xBP336 mov xCX, xBP ; xCX = caller pStackFrame. xBP free to become frame pointer.337 mov xBP, xSP338 SEH64_SET_FRAME_xBP 0339 pushf340 push xAX341 SEH64_PUSH_GREG xAX342 sub xSP, CONTEXT_SIZE + 20h343 SEH64_ALLOCATE_STACK (CONTEXT_SIZE + 20h)344 SEH64_END_PROLOGUE345 346 lea xAX, [xBP - CONTEXT_SIZE]347 call NAME(rtVccCaptureContext)348 349 ; rtVccStackVarCorrupted(uint8_t *pbFrame, RTC_VAR_DESC_T const *pVar, PCONTEXT)350 .again:351 %ifdef RT_ARCH_AMD64352 lea r8, [xBP - CONTEXT_SIZE]353 %else354 lea xAX, [xBP - CONTEXT_SIZE]355 mov [xSP + 8], xAX356 mov [xSP + 4], xDX357 mov [xSP], xCX358 %endif359 call NAME(rtVccStackVarCorrupted)360 jmp .again361 ENDPROC_RAW rtVccCheckStackVarsFailed362 363 364 %ifdef RT_ARCH_X86365 ;;366 ; Called to follow up on a 'CMP ESP, EBP' kind of instruction,367 ; expected to report failure if the compare failed.368 ;369 ; Note! While we consider this fatal and will terminate the application, the370 ; compiler guys do not seem to think it is all that horrible and will371 ; report failure, maybe do an int3, and then try continue execution.372 ;373 ALIGNCODE(16)374 BEGINPROC _RTC_CheckEsp375 jne .unexpected_esp376 ret377 378 .unexpected_esp:379 push xBP380 SEH64_PUSH_xBP381 mov xBP, xSP382 SEH64_SET_FRAME_xBP 0383 pushf384 push xAX385 SEH64_PUSH_GREG xAX386 sub xSP, CONTEXT_SIZE + 20h387 SEH64_ALLOCATE_STACK (CONTEXT_SIZE + 20h)388 SEH64_END_PROLOGUE389 390 lea xAX, [xBP - CONTEXT_SIZE]391 call NAME(rtVccCaptureContext)392 393 ; rtVccCheckEspFailed(PCONTEXT)394 .again:395 lea xAX, [xBP - CONTEXT_SIZE]396 %ifdef RT_ARCH_AMD64397 mov xCX, xAX398 %else399 mov [xSP], xAX400 %endif401 call NAME(rtVccCheckEspFailed)402 jmp .again403 404 ENDPROC _RTC_CheckEsp405 %endif ; RT_ARCH_X86406 407 408 409 ;;410 ; Initialize an alloca allocation list entry and add it to it.411 ;412 ; When this is call, presumably _RTC_CheckStackVars2 is used to verify the frame.413 ;414 ; @param pNewEntry Pointer to the new entry. [RCX/ECX]415 ; @param cbEntry The entry size, including header. [RDX/EDX]416 ; @param ppHead Pointer to the list head pointer. [R8/stack]417 ;418 ALIGNCODE(64)419 BEGINPROC_RAW FASTCALL_NAME(_RTC_AllocaHelper, 12)420 SEH64_END_PROLOGUE421 422 ;423 ; Check that input isn't NULL or the size isn't zero.424 ;425 test xCX, xCX426 jz .return427 test xDX, xDX428 jz .return429 %if ARCH_BITS == 64430 test r8, r8431 %else432 cmp dword [xSP + xCB], 0433 %endif434 jz .return435 436 ;437 ; Memset the memory to ALLOCA_FILLER438 ;439 %if ARCH_BITS == 64440 mov r10, rdi ; save rdi441 mov r11, rcx ; save pNewEntry442 %else443 push xDI444 push xCX445 cld ; paranoia446 %endif447 448 mov al, ALLOCA_FILLER_BYTE449 mov xDI, xCX ; entry pointer450 mov xCX, xDX ; entry size (in bytes)451 rep stosb452 453 %if ARCH_BITS == 64454 mov rdi, r10455 %else456 pop xCX457 pop xDI458 %endif459 460 ;461 ; Fill in the entry and link it as onto the head of the chain.462 ;463 %if ARCH_BITS == 64464 mov [r11 + RTC_ALLOCA_ENTRY_T.cb], xDX465 mov xAX, [r8]466 mov [r11 + RTC_ALLOCA_ENTRY_T.pNext], xAX467 mov [r8], r11468 %else469 mov [xCX + RTC_ALLOCA_ENTRY_T.cb], xDX470 mov xAX, [xSP + xCB] ; ppHead471 mov xDX, [xAX]472 mov [xCX + RTC_ALLOCA_ENTRY_T.pNext], xDX473 mov [xAX], xCX474 %endif475 476 .return:477 %if ARCH_BITS == 64478 ret479 %else480 ret 4481 %endif482 ENDPROC_RAW FASTCALL_NAME(_RTC_AllocaHelper, 12)483 484 485 ;;486 ; Checks if the security cookie ok, complaining and terminating if it isn't.487 ;488 ALIGNCODE(16)489 BEGINPROC_RAW FASTCALL_NAME(__security_check_cookie, 4)490 SEH64_END_PROLOGUE491 cmp xCX, [NAME(__security_cookie) xWrtRIP]492 jne rtVccSecurityCookieFailed493 ;; amd64 version checks if the top 16 bits are zero, we skip that for now.494 ret495 ENDPROC_RAW FASTCALL_NAME(__security_check_cookie, 4)496 497 ; Sub-function for __security_check_cookie, for purposes of SEH64 unwinding.498 BEGINPROC_RAW rtVccSecurityCookieFailed499 push xBP500 SEH64_PUSH_xBP501 mov xBP, xSP502 SEH64_SET_FRAME_xBP 0503 pushf504 push xAX505 SEH64_PUSH_GREG xAX506 sub xSP, CONTEXT_SIZE + 20h507 SEH64_ALLOCATE_STACK (CONTEXT_SIZE + 20h)508 SEH64_END_PROLOGUE509 510 lea xAX, [xBP - CONTEXT_SIZE]511 call NAME(rtVccCaptureContext)512 513 ; rtVccSecurityCookieMismatch(uCookie, PCONTEXT)514 .again:515 %ifdef RT_ARCH_AMD64516 lea xDX, [xBP - CONTEXT_SIZE]517 %else518 lea xAX, [xBP - CONTEXT_SIZE]519 mov [xSP + 4], xAX520 mov [xSP], xCX521 %endif522 call NAME(rtVccSecurityCookieMismatch)523 jmp .again524 ENDPROC_RAW rtVccSecurityCookieFailed525 526 527 ;;528 ; Generated when using /GS - buffer security checks - so, fatal.529 ;530 ; Doesn't seem to take any parameters.531 ;532 BEGINPROC __report_rangecheckfailure533 push xBP534 SEH64_PUSH_xBP535 mov xBP, xSP536 SEH64_SET_FRAME_xBP 0537 pushf538 push xAX539 SEH64_PUSH_GREG xAX540 sub xSP, CONTEXT_SIZE + 20h541 SEH64_ALLOCATE_STACK (CONTEXT_SIZE + 20h)542 SEH64_END_PROLOGUE543 544 lea xAX, [xBP - CONTEXT_SIZE]545 call NAME(rtVccCaptureContext)546 547 ; rtVccRangeCheckFailed(PCONTEXT)548 .again:549 lea xAX, [xBP - CONTEXT_SIZE]550 %ifdef RT_ARCH_AMD64551 mov xCX, xAX552 %else553 mov [xSP], xAX554 %endif555 call NAME(rtVccRangeCheckFailed)556 jmp .again557 ENDPROC __report_rangecheckfailure558 559 560 %if 0 ; Currently not treating these as completely fatal, just like the561 ; compiler guys do. I'm sure the compiler only generate these calls562 ; if it thinks a variable could be used uninitialized, however I'm not563 ; really sure if there is a runtime check in addition or if it's an564 ; action that always will be taken in a code path deemed to be bad.565 ; Judging from the warnings, the compile time analysis leave lots to be566 ; desired (lots of false positives).567 ;;568 ; Not entirely sure how and when the compiler generates these.569 ; extern "C" void __cdecl _RTC_UninitUse(const char *pszVar)570 BEGINPROC _RTC_UninitUse571 push xBP572 SEH64_PUSH_xBP573 mov xBP, xSP574 SEH64_SET_FRAME_xBP 0575 pushf576 push xAX577 SEH64_PUSH_GREG xAX578 sub xSP, CONTEXT_SIZE + 20h579 SEH64_ALLOCATE_STACK (CONTEXT_SIZE + 20h)580 SEH64_END_PROLOGUE581 582 lea xAX, [xBP - CONTEXT_SIZE]583 call NAME(rtVccCaptureContext)584 585 extern NAME(rtVccUninitializedVariableUse)586 ; rtVccUninitializedVariableUse(const char *pszVar, PCONTEXT)587 .again:588 %ifdef RT_ARCH_AMD64589 lea xDX, [xBP - CONTEXT_SIZE]590 %else591 lea xAX, [xBP - CONTEXT_SIZE]592 mov [xSP + xCB], xAX593 mov xAX, [xBP + xCB * 2]594 mov [xSP], xAX595 %endif596 call NAME(rtVccUninitializedVariableUse)597 jmp .again598 ENDPROC _RTC_UninitUse599 %endif600 601 ;;602 ; Internal worker that creates a CONTEXT record for the caller.603 ;604 ; This expects a old-style stack frame setup, with xBP as base, such that:605 ; xBP+xCB*1: Return address -> Rip/Eip606 ; xBP+xCB*0: Return xBP -> Rbp/Ebp607 ; xBP-xCB*1: EFLAGS -> EFlags608 ; xBP-xCB*2: Saved xAX -> Rax/Eax609 ;610 ; @param pCtx xAX Pointer to a CONTEXT structure.611 ;612 BEGINPROC rtVccCaptureContext613 SEH64_END_PROLOGUE614 615 %ifdef RT_ARCH_AMD64616 mov [xAX + CONTEXT.Rcx], rcx617 mov [xAX + CONTEXT.Rdx], rdx618 mov rcx, [xBP - xCB*2]619 mov [xAX + CONTEXT.Rax], ecx620 mov [xAX + CONTEXT.Rbx], rbx621 lea rcx, [xBP + xCB*2]622 mov [xAX + CONTEXT.Rsp], rcx623 mov rdx, [xBP]624 mov [xAX + CONTEXT.Rbp], rdx625 mov [xAX + CONTEXT.Rdi], rdi626 mov [xAX + CONTEXT.Rsi], rsi627 mov [xAX + CONTEXT.R8], r8628 mov [xAX + CONTEXT.R9], r9629 mov [xAX + CONTEXT.R10], r10630 mov [xAX + CONTEXT.R11], r11631 mov [xAX + CONTEXT.R12], r12632 mov [xAX + CONTEXT.R13], r13633 mov [xAX + CONTEXT.R14], r14634 mov [xAX + CONTEXT.R15], r15635 636 mov rcx, [xBP + xCB*1]637 mov [xAX + CONTEXT.Rip], rcx638 mov edx, [xBP - xCB*1]639 mov [xAX + CONTEXT.EFlags], edx640 641 mov dx, ss642 mov [xAX + CONTEXT.SegSs], dx643 mov cx, cs644 mov [xAX + CONTEXT.SegCs], cx645 mov dx, ds646 mov [xAX + CONTEXT.SegDs], dx647 mov cx, es648 mov [xAX + CONTEXT.SegEs], cx649 mov dx, fs650 mov [xAX + CONTEXT.SegFs], dx651 mov cx, gs652 mov [xAX + CONTEXT.SegGs], cx653 654 mov dword [xAX + CONTEXT.ContextFlags], CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS655 656 ; Clear stuff we didn't set.657 xor edx, edx658 mov [xAX + CONTEXT.P1Home], rdx659 mov [xAX + CONTEXT.P2Home], rdx660 mov [xAX + CONTEXT.P3Home], rdx661 mov [xAX + CONTEXT.P4Home], rdx662 mov [xAX + CONTEXT.P5Home], rdx663 mov [xAX + CONTEXT.P6Home], rdx664 mov [xAX + CONTEXT.MxCsr], edx665 mov [xAX + CONTEXT.Dr0], rdx666 mov [xAX + CONTEXT.Dr1], rdx667 mov [xAX + CONTEXT.Dr2], rdx668 mov [xAX + CONTEXT.Dr3], rdx669 mov [xAX + CONTEXT.Dr6], rdx670 mov [xAX + CONTEXT.Dr7], rdx671 672 mov ecx, CONTEXT_size - CONTEXT.FltSave673 AssertCompile(((CONTEXT_size - CONTEXT.FltSave) % 8) == 0)674 .again:675 mov [xAX + CONTEXT.FltSave + xCX - 8], rdx676 sub ecx, 8677 jnz .again678 679 ; Restore edx and ecx.680 mov rcx, [xAX + CONTEXT.Rcx]681 mov rdx, [xAX + CONTEXT.Rdx]682 683 %elifdef RT_ARCH_X86684 685 mov [xAX + CONTEXT.Ecx], ecx686 mov [xAX + CONTEXT.Edx], edx687 mov ecx, [xBP - xCB*2]688 mov [xAX + CONTEXT.Eax], ecx689 mov [xAX + CONTEXT.Ebx], ebx690 lea ecx, [xBP + xCB*2]691 mov [xAX + CONTEXT.Esp], ecx692 mov edx, [xBP]693 mov [xAX + CONTEXT.Ebp], edx694 mov [xAX + CONTEXT.Edi], edi695 mov [xAX + CONTEXT.Esi], esi696 697 mov ecx, [xBP + xCB]698 mov [xAX + CONTEXT.Eip], ecx699 mov ecx, [xBP - xCB*1]700 mov [xAX + CONTEXT.EFlags], ecx701 702 mov dx, ss703 movzx edx, dx704 mov [xAX + CONTEXT.SegSs], edx705 mov cx, cs706 movzx ecx, cx707 mov [xAX + CONTEXT.SegCs], ecx708 mov dx, ds709 movzx edx, dx710 mov [xAX + CONTEXT.SegDs], edx711 mov cx, es712 movzx ecx, cx713 mov [xAX + CONTEXT.SegEs], ecx714 mov dx, fs715 movzx edx, dx716 mov [xAX + CONTEXT.SegFs], edx717 mov cx, gs718 movzx ecx, cx719 mov [xAX + CONTEXT.SegGs], ecx720 721 mov dword [xAX + CONTEXT.ContextFlags], CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS722 723 ; Clear stuff we didn't set.724 xor edx, edx725 mov [xAX + CONTEXT.Dr0], edx726 mov [xAX + CONTEXT.Dr1], edx727 mov [xAX + CONTEXT.Dr2], edx728 mov [xAX + CONTEXT.Dr3], edx729 mov [xAX + CONTEXT.Dr6], edx730 mov [xAX + CONTEXT.Dr7], edx731 732 mov ecx, CONTEXT_size - CONTEXT.ExtendedRegisters733 .again:734 mov [xAX + CONTEXT.ExtendedRegisters + xCX - 4], edx735 sub ecx, 4736 jnz .again737 738 ; Restore edx and ecx.739 mov ecx, [xAX + CONTEXT.Ecx]740 mov edx, [xAX + CONTEXT.Edx]741 742 %else743 %error RT_ARCH744 %endif745 ret746 ENDPROC rtVccCaptureContext747 -
trunk/src/VBox/Runtime/common/compiler/vcc/stack-vcc.asm
r98103 r98151 124 124 %endif 125 125 126 127 128 ;;129 ; Probe stack to trigger guard faults, and for x86 to allocate stack space.130 ;131 ; @param xAX Frame size.132 ; @uses AMD64: Probably nothing. EAX is certainly not supposed to change.133 ; x86: ESP = ESP - EAX; EFLAGS, nothing else134 ;135 ALIGNCODE(64)136 GLOBALNAME_RAW __alloca_probe, __alloca_probe, function137 BEGINPROC_RAW __chkstk138 push xBP139 SEH64_PUSH_xBP140 mov xBP, xSP141 SEH64_SET_FRAME_xBP 0142 push xAX143 SEH64_PUSH_GREG xAX144 push xBX145 SEH64_PUSH_GREG xBX146 SEH64_END_PROLOGUE147 148 ;149 ; Adjust eax so we're relative to [xBP - xCB*2].150 ;151 sub xAX, xCB * 4152 jle .touch_loop_done ; jump if rax < xCB*4, very unlikely153 154 ;155 ; Subtract what's left of the current page from eax and only engage156 ; the touch loop if (int)xAX > 0.157 ;158 lea ebx, [ebp - xCB * 2]159 and ebx, PAGE_SIZE - 1160 sub xAX, xBX161 jnl .touch_loop ; jump if pages to touch.162 163 .touch_loop_done:164 pop xBX165 pop xAX166 leave167 %ifndef RT_ARCH_X86168 ret169 %else170 ;171 ; Do the stack space allocation and jump to the return location.172 ;173 sub esp, eax174 add esp, 4175 jmp dword [esp + eax - 4]176 %endif177 178 ;179 ; The touch loop.180 ;181 .touch_loop:182 sub xBX, PAGE_SIZE183 %if 1184 mov [xBP + xBX - xCB * 2], bl185 %else186 or byte [xBP + xBX - xCB * 2], 0 ; non-destructive variant...187 %endif188 sub xAX, PAGE_SIZE189 jnl .touch_loop190 jmp .touch_loop_done191 ENDPROC_RAW __chkstk192 193 194 %ifdef RT_ARCH_X86195 ;;196 ; 8 and 16 byte aligned alloca w/ probing.197 ;198 ; This routine adjusts the allocation size so __chkstk will return a199 ; correctly aligned allocation.200 ;201 ; @param xAX Unaligned allocation size.202 ;203 %macro __alloc_probe_xxx 1204 ALIGNCODE(16)205 BEGINPROC_RAW __alloca_probe_ %+ %1206 push ecx207 208 ;209 ; Calc the ESP address after the allocation and adjust EAX so that it210 ; will be aligned as desired.211 ;212 lea ecx, [esp + 8]213 sub ecx, eax214 and ecx, %1 - 1215 add eax, ecx216 jc .bad_alloc_size217 .continue:218 219 pop ecx220 jmp __alloca_probe221 222 .bad_alloc_size:223 %ifdef RT_STRICT224 int3225 %endif226 or eax, 0xfffffff0227 jmp .continue228 ENDPROC_RAW __alloca_probe_ %+ %1229 %endmacro230 231 __alloc_probe_xxx 16232 __alloc_probe_xxx 8233 %endif ; RT_ARCH_X86234 126 235 127
Note:
See TracChangeset
for help on using the changeset viewer.