@@ -589,6 +589,30 @@ EXTERN_C bool BCValue_isStackValueOrParameter(const BCValue* val)
589589#define VM_SIZE_RO_METADATA (256 * 1024 * 1024)
590590#define VM_LIMIT_RECURSION 2000
591591
592+ uint32_t AddressFrom (address_kind_t kind , uint32_t offset )
593+ {
594+ uint32_t result = 0 ;
595+ switch (kind )
596+ {
597+ case AddressKind_Heap : {
598+ result = VM_ADDR_HEAP_START + offset ;
599+ } break ;
600+ case AddressKind_Stack : {
601+ result = VM_ADDR_STACK_START + offset ;
602+ } break ;
603+ case AddressKind_Register : {
604+ result = VM_ADDR_REG_PAGE + offset ;
605+ } break ;
606+ case AddressKind_ROMetadata : {
607+ result = VM_ADDR_RO_METADATA + offset ;
608+ } break ;
609+ case AddressKind_External : {
610+ result = VM_ADDR_EXTERNAL_START + offset ;
611+ } break ;
612+ default : assert (0 );
613+ }
614+ return result ;
615+ }
592616
593617address_kind_t ClassifyAddress (uint32_t addr , uint32_t * out_offset )
594618{
@@ -607,7 +631,7 @@ address_kind_t ClassifyAddress(uint32_t addr, uint32_t* out_offset)
607631 else if (top == 0 )
608632 {
609633 // Stack grows up, starts at 0x4000
610- if (addr >= VM_ADDR_STACK_START )
634+ if (addr >= VM_ADDR_STACK_START )
611635 {
612636 kind = AddressKind_Stack ;
613637 offset = addr - VM_ADDR_STACK_START ;
@@ -618,10 +642,10 @@ address_kind_t ClassifyAddress(uint32_t addr, uint32_t* out_offset)
618642 // kind = AddressKind_Invalid; // Guard Hit
619643 }
620644 // 4KB Register Page (0x2000 - 0x2FFF)
621- else if (addr >= 0x2000 )
645+ else if (addr >= VM_ADDR_REG_PAGE )
622646 {
623647 kind = AddressKind_Register ;
624- offset = addr - 0x2000 ;
648+ offset = addr - VM_ADDR_REG_PAGE ;
625649 }
626650 // 8KB NULL trap (0x0000 - 0x1FFF)
627651 else
@@ -635,7 +659,7 @@ address_kind_t ClassifyAddress(uint32_t addr, uint32_t* out_offset)
635659 {
636660 // Shadow Return Stack (dedicated for 32-bit return addresses)
637661 // this is address invalid
638- if (addr < VM_ADDR_RETURN_STACK )
662+ if (addr < VM_ADDR_RETURN_STACK )
639663 {
640664 // kind = AddressKind_ReturnStack;
641665 // offset = addr - VM_ADDR_RETURN_STACK;
@@ -658,7 +682,7 @@ address_kind_t ClassifyAddress(uint32_t addr, uint32_t* out_offset)
658682 else if (top <= 32 )
659683 {
660684 kind = AddressKind_External ;
661- offset = VM_ADDR_EXTERNAL_START ;
685+ offset = addr - VM_ADDR_EXTERNAL_START ;
662686 }
663687
664688 * out_offset = offset ;
0 commit comments