|
18 | 18 | #define LOW_ADDR_WARN 0x100000ULL |
19 | 19 |
|
20 | 20 | #define ALLOC_TAG_MAGIC 0xCCDEC00ED00DAA0EULL |
21 | | -#define ALLOC_TAG_MAGIC_INV (~ALLOC_TAG_MAGIC) |
22 | | -#define ALLOC_TAG_SIZE 64 |
23 | | -#define ALLOC_KIND_SMALL 1 |
| 21 | +#define ALLOC_TAG_SIZE sizeof(alloc_tag) |
24 | 22 |
|
25 | 23 | typedef struct { |
26 | 24 | uint64_t magic; |
27 | | - uint64_t magic_inv; |
28 | 25 | uint64_t base_phys; |
29 | 26 | uint64_t user_phys; |
30 | | - uint64_t owner_phys; |
31 | 27 | uint32_t alloc_size; |
32 | | - uint32_t user_size; |
33 | | - uint16_t alignment; |
34 | | - uint8_t kind; |
35 | | - uint8_t level; |
36 | | - uint8_t attributes; |
37 | | - uint8_t reserved0; |
38 | | - uint16_t reserved1; |
39 | 28 | uint32_t checksum; |
40 | | - uint32_t checksum_inv; |
41 | 29 | } alloc_tag; |
42 | 30 |
|
43 | 31 | typedef struct { |
@@ -451,25 +439,11 @@ void* kalloc_inner(void *page, size_t size, uint16_t alignment, uint8_t level, u |
451 | 439 |
|
452 | 440 | alloc_tag* tag = (alloc_tag*)PHYS_TO_VIRT(tag_phys); |
453 | 441 | tag->magic = ALLOC_TAG_MAGIC; |
454 | | - tag->magic_inv = ALLOC_TAG_MAGIC_INV; |
455 | 442 | tag->base_phys = base_phys; |
456 | 443 | tag->user_phys = user_phys; |
457 | | - tag->owner_phys = owner_phys; |
458 | 444 | tag->alloc_size = (uint32_t)bsz; |
459 | | - tag->user_size = (uint32_t)req_size; |
460 | | - tag->alignment = alignment; |
461 | | - tag->kind = ALLOC_KIND_SMALL; |
462 | | - tag->level = level; |
463 | | - tag->attributes = info->attributes; |
464 | | - tag->reserved0 = 0; |
465 | | - tag->reserved1 = 0; |
466 | | - |
467 | | - uint64_t mix = tag->base_phys ^ tag->user_phys ^ tag->owner_phys ^ ((uint64_t)tag->alloc_size << 32) ^ tag->user_size; |
468 | | - mix ^= ((uint64_t)tag->alignment << 48) ^ ((uint64_t)tag->kind << 40) ^ ((uint64_t)tag->level << 32) ^ ((uint64_t)tag->attributes << 24); |
469 | | - mix ^= ALLOC_TAG_MAGIC; //token |
470 | | - uint32_t c = (uint32_t)(mix ^ (mix >> 32)); |
471 | | - tag->checksum = c; |
472 | | - tag->checksum_inv = ~c; |
| 445 | + uint64_t mix = tag->base_phys ^ tag->user_phys ^ ((uint64_t)tag->alloc_size << 32) ^ ALLOC_TAG_MAGIC; |
| 446 | + tag->checksum = (uint32_t)(mix ^ (mix >> 32)); |
473 | 447 |
|
474 | 448 | memset((void*)PHYS_TO_VIRT(user_phys), 0, size); |
475 | 449 | info->size += bsz; |
@@ -517,25 +491,11 @@ void* kalloc_inner(void *page, size_t size, uint16_t alignment, uint8_t level, u |
517 | 491 |
|
518 | 492 | alloc_tag* tag = (alloc_tag*)PHYS_TO_VIRT(tag_phys); |
519 | 493 | tag->magic = ALLOC_TAG_MAGIC; |
520 | | - tag->magic_inv = ALLOC_TAG_MAGIC_INV; |
521 | 494 | tag->base_phys = base_phys; |
522 | 495 | tag->user_phys = user_phys; |
523 | | - tag->owner_phys = owner_phys; |
524 | 496 | tag->alloc_size = (uint32_t)small_need; |
525 | | - tag->user_size = (uint32_t)req_size; |
526 | | - tag->alignment = alignment; |
527 | | - tag->kind = ALLOC_KIND_SMALL; |
528 | | - tag->level = level; |
529 | | - tag->attributes = info->attributes; |
530 | | - tag->reserved0 = 0; |
531 | | - tag->reserved1 = 0; |
532 | | - |
533 | | - uint64_t mix = tag->base_phys ^ tag->user_phys ^ tag->owner_phys ^ ((uint64_t)tag->alloc_size << 32) ^ tag->user_size; |
534 | | - mix ^= ((uint64_t)tag->alignment << 48) ^ ((uint64_t)tag->kind << 40) ^ ((uint64_t)tag->level << 32) ^ ((uint64_t)tag->attributes << 24); |
535 | | - mix ^= ALLOC_TAG_MAGIC; |
536 | | - uint32_t c = (uint32_t)(mix ^ (mix >> 32)); |
537 | | - tag->checksum = c; |
538 | | - tag->checksum_inv = ~c; |
| 497 | + uint64_t mix = tag->base_phys ^ tag->user_phys ^ ((uint64_t)tag->alloc_size << 32) ^ ALLOC_TAG_MAGIC; |
| 498 | + tag->checksum = (uint32_t)(mix ^ (mix >> 32)); |
539 | 499 |
|
540 | 500 | memset((void*)PHYS_TO_VIRT(user_phys), 0, size); |
541 | 501 | info->size += small_need; |
@@ -648,22 +608,15 @@ void kfree(void* ptr, size_t size) { |
648 | 608 |
|
649 | 609 | if(phys_tag) { |
650 | 610 | tag = (alloc_tag*)PHYS_TO_VIRT(phys_tag); |
651 | | - if(tag->magic == ALLOC_TAG_MAGIC && tag->magic_inv == ALLOC_TAG_MAGIC_INV && tag->user_phys == phys){ |
652 | | - uint64_t mix = tag->base_phys ^ tag->user_phys ^ tag->owner_phys ^ ((uint64_t)tag->alloc_size << 32) ^ tag->user_size; |
653 | | - mix ^= ((uint64_t)tag->alignment << 48) ^ ((uint64_t)tag->kind << 40) ^ ((uint64_t)tag->level << 32) ^ ((uint64_t)tag->attributes << 24); |
654 | | - mix ^= ALLOC_TAG_MAGIC; //token |
| 611 | + if(tag->magic == ALLOC_TAG_MAGIC && tag->user_phys == phys){ |
| 612 | + uint64_t mix = tag->base_phys ^ tag->user_phys ^ ((uint64_t)tag->alloc_size << 32) ^ ALLOC_TAG_MAGIC; |
655 | 613 | uint32_t c = (uint32_t)(mix ^ (mix >> 32)); |
656 | | - if(tag->checksum == c && tag->checksum_inv == ~c) tag_ok = true; |
| 614 | + if(tag->checksum == c) tag_ok = true; |
657 | 615 | } |
658 | 616 | } |
659 | 617 | } |
660 | 618 |
|
661 | 619 | if(tag_ok) { |
662 | | - if(tag->kind != ALLOC_KIND_SMALL) { |
663 | | - kprintf("[kfree] bad tag kind ptr=%llx phys=%llx kind=%u size=%llx", (uint64_t)va, (uint64_t)phys, (unsigned)tag->kind, (uint64_t)size); |
664 | | - panic("kfree bad tag kind", va); |
665 | | - } |
666 | | - |
667 | 620 | uintptr_t base_phys = (uintptr_t)tag->base_phys; |
668 | 621 | uint64_t alloc_size = tag->alloc_size; |
669 | 622 |
|
|
0 commit comments