@@ -77,7 +77,9 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
77
77
#define VM_POSIX 1
78
78
#define VM_MS_WINDOWS 2
79
79
80
- #if defined (HAVE_MMAP ) && defined (MAP_FIXED )
80
+ #if !USE_LSB_TAG
81
+ # define VM_SUPPORTED 0
82
+ #elif defined (HAVE_MMAP ) && defined (MAP_FIXED )
81
83
# define VM_SUPPORTED VM_POSIX
82
84
# if !defined (MAP_POPULATE ) && defined (MAP_PREFAULT_READ )
83
85
# define MAP_POPULATE MAP_PREFAULT_READ
@@ -1964,9 +1966,9 @@ dump_field_emacs_ptr (struct dump_context *ctx,
1964
1966
}
1965
1967
1966
1968
static void
1967
- _dump_object_start_pseudovector (struct dump_context * ctx ,
1968
- union vectorlike_header * out_hdr ,
1969
- const union vectorlike_header * in_hdr )
1969
+ dump_object_start_pseudovector (struct dump_context * ctx ,
1970
+ union vectorlike_header * out_hdr ,
1971
+ const union vectorlike_header * in_hdr )
1970
1972
{
1971
1973
eassert (in_hdr -> size & PSEUDOVECTOR_FLAG );
1972
1974
ptrdiff_t vec_size = vectorlike_nbytes (in_hdr );
@@ -1976,9 +1978,9 @@ _dump_object_start_pseudovector (struct dump_context *ctx,
1976
1978
1977
1979
/* Need a macro for alloca. */
1978
1980
#define START_DUMP_PVEC (ctx , hdr , type , out ) \
1979
- const union vectorlike_header *_in_hdr = (hdr); \
1980
- type *out = alloca (vectorlike_nbytes (_in_hdr )); \
1981
- _dump_object_start_pseudovector (ctx, &out->header, _in_hdr )
1981
+ const union vectorlike_header *in_hdr = (hdr); \
1982
+ type *out = alloca (vectorlike_nbytes (in_hdr )); \
1983
+ dump_object_start_pseudovector (ctx, &out->header, in_hdr )
1982
1984
1983
1985
static dump_off
1984
1986
finish_dump_pvec (struct dump_context * ctx ,
@@ -3994,14 +3996,14 @@ dump_do_fixup (struct dump_context *ctx,
3994
3996
Lisp_Object fixup ,
3995
3997
Lisp_Object prev_fixup )
3996
3998
{
3997
- enum dump_fixup_type type =
3998
- (enum dump_fixup_type ) XFIXNUM (dump_pop (& fixup ));
3999
+ enum dump_fixup_type type
4000
+ = (enum dump_fixup_type ) XFIXNUM (dump_pop (& fixup ));
3999
4001
dump_off dump_fixup_offset = dump_off_from_lisp (dump_pop (& fixup ));
4000
4002
#ifdef ENABLE_CHECKING
4001
4003
if (!NILP (prev_fixup ))
4002
4004
{
4003
- dump_off prev_dump_fixup_offset =
4004
- dump_off_from_lisp (XCAR (XCDR (prev_fixup )));
4005
+ dump_off prev_dump_fixup_offset
4006
+ = dump_off_from_lisp (XCAR (XCDR (prev_fixup )));
4005
4007
eassert (dump_fixup_offset - prev_dump_fixup_offset
4006
4008
>= sizeof (void * ));
4007
4009
}
@@ -4618,23 +4620,8 @@ dump_anonymous_allocate_posix (void *base,
4618
4620
}
4619
4621
#endif
4620
4622
4621
- /* Perform anonymous memory allocation. */
4622
- static void *
4623
- dump_anonymous_allocate (void * base ,
4624
- const size_t size ,
4625
- enum dump_memory_protection protection )
4626
- {
4627
- #if VM_SUPPORTED == VM_POSIX
4628
- return dump_anonymous_allocate_posix (base , size , protection );
4629
- #elif VM_SUPPORTED == VM_MS_WINDOWS
4630
- return dump_anonymous_allocate_w32 (base , size , protection );
4631
- #else
4632
- errno = ENOSYS ;
4633
- return NULL ;
4634
- #endif
4635
- }
4623
+ /* Undo the effect of `dump_reserve_address_space'. */
4636
4624
4637
- /* Undo the effect of dump_reserve_address_space(). */
4638
4625
static void
4639
4626
dump_anonymous_release (void * addr , size_t size )
4640
4627
{
@@ -4653,6 +4640,26 @@ dump_anonymous_release (void *addr, size_t size)
4653
4640
#endif
4654
4641
}
4655
4642
4643
+ /* Perform anonymous memory allocation. */
4644
+ static void *
4645
+ dump_anonymous_allocate (void * base ,
4646
+ const size_t size ,
4647
+ enum dump_memory_protection protection )
4648
+ {
4649
+ void * val ;
4650
+
4651
+ #if VM_SUPPORTED == VM_POSIX
4652
+ val = dump_anonymous_allocate_posix (base , size , protection );
4653
+ #elif VM_SUPPORTED == VM_MS_WINDOWS
4654
+ val = dump_anonymous_allocate_w32 (base , size , protection );
4655
+ #else
4656
+ errno = ENOSYS ;
4657
+ val = NULL ;
4658
+ #endif
4659
+
4660
+ return val ;
4661
+ }
4662
+
4656
4663
#if VM_SUPPORTED == VM_MS_WINDOWS
4657
4664
static void *
4658
4665
dump_map_file_w32 (void * base , int fd , off_t offset , size_t size ,
@@ -4824,20 +4831,20 @@ static void
4824
4831
dump_discard_mem (void * mem , size_t size )
4825
4832
{
4826
4833
#if VM_SUPPORTED == VM_MS_WINDOWS
4827
- /* Discard COWed pages. */
4828
- (void ) VirtualFree (mem , size , MEM_DECOMMIT );
4829
- /* Release the commit charge for the mapping. */
4830
- DWORD old_prot ;
4831
- (void ) VirtualProtect (mem , size , PAGE_NOACCESS , & old_prot );
4834
+ /* Discard COWed pages. */
4835
+ (void ) VirtualFree (mem , size , MEM_DECOMMIT );
4836
+ /* Release the commit charge for the mapping. */
4837
+ DWORD old_prot ;
4838
+ (void ) VirtualProtect (mem , size , PAGE_NOACCESS , & old_prot );
4832
4839
#elif VM_SUPPORTED == VM_POSIX
4833
4840
# ifdef HAVE_POSIX_MADVISE
4834
- /* Discard COWed pages. */
4835
- (void ) posix_madvise (mem , size , POSIX_MADV_DONTNEED );
4841
+ /* Discard COWed pages. */
4842
+ (void ) posix_madvise (mem , size , POSIX_MADV_DONTNEED );
4836
4843
# elif defined HAVE_MADVISE
4837
- (void ) madvise (mem , size , MADV_DONTNEED );
4844
+ (void ) madvise (mem , size , MADV_DONTNEED );
4838
4845
#endif
4839
- /* Release the commit charge for the mapping. */
4840
- (void ) mprotect (mem , size , PROT_NONE );
4846
+ /* Release the commit charge for the mapping. */
4847
+ (void ) mprotect (mem , size , PROT_NONE );
4841
4848
#endif
4842
4849
}
4843
4850
@@ -4959,21 +4966,23 @@ dump_mmap_release_vm (struct dump_memory_map *map)
4959
4966
static bool
4960
4967
needs_mmap_retry_p (void )
4961
4968
{
4962
- #if defined CYGWIN || VM_SUPPORTED == VM_MS_WINDOWS || defined _AIX
4969
+ #if defined CYGWIN || VM_SUPPORTED == VM_MS_WINDOWS \
4970
+ || defined _AIX
4963
4971
return true;
4964
- #else
4972
+ #else /* !CYGWIN && VM_SUPPORTED != VM_MS_WINDOWS && !_AIX */
4965
4973
return false;
4966
- #endif
4974
+ #endif /* !CYGWIN && VM_SUPPORTED != VM_MS_WINDOWS && !_AIX */
4967
4975
}
4968
4976
4969
4977
static bool
4970
4978
dump_mmap_contiguous_vm (struct dump_memory_map * maps , int nr_maps ,
4971
4979
size_t total_size )
4972
4980
{
4981
+ int save_errno ;
4973
4982
bool ret = false;
4974
4983
void * resv = NULL ;
4975
4984
bool retry = false;
4976
- const bool need_retry = needs_mmap_retry_p ();
4985
+ bool need_retry = needs_mmap_retry_p ();
4977
4986
4978
4987
do
4979
4988
{
@@ -4986,11 +4995,10 @@ dump_mmap_contiguous_vm (struct dump_memory_map *maps, int nr_maps,
4986
4995
}
4987
4996
4988
4997
eassert (resv == NULL );
4989
- resv = dump_anonymous_allocate (NULL ,
4990
- total_size ,
4998
+ resv = dump_anonymous_allocate (NULL , total_size ,
4991
4999
DUMP_MEMORY_ACCESS_NONE );
4992
5000
if (!resv )
4993
- goto out ;
5001
+ goto out ;
4994
5002
4995
5003
char * mem = resv ;
4996
5004
@@ -5039,6 +5047,7 @@ dump_mmap_contiguous_vm (struct dump_memory_map *maps, int nr_maps,
5039
5047
ret = true;
5040
5048
resv = NULL ;
5041
5049
out :
5050
+ save_errno = errno ;
5042
5051
if (resv )
5043
5052
dump_anonymous_release (resv , total_size );
5044
5053
if (!ret )
@@ -5051,15 +5060,16 @@ dump_mmap_contiguous_vm (struct dump_memory_map *maps, int nr_maps,
5051
5060
dump_mmap_release (& maps [i ]);
5052
5061
}
5053
5062
}
5063
+ errno = save_errno ;
5054
5064
return ret ;
5055
5065
}
5056
5066
5057
5067
/* Map a range of addresses into a chunk of contiguous memory.
5058
5068
5059
5069
Each dump_memory_map structure describes how to fill the
5060
5070
corresponding range of memory. On input, all members except MAPPING
5061
- are valid. On output, MAPPING contains the location of the given
5062
- chunk of memory. The MAPPING for MAPS[N] is MAPS[N-1].mapping +
5071
+ are valid. On output, MAPPING contains the location of the given
5072
+ chunk of memory. The MAPPING for MAPS[N] is MAPS[N-1].mapping +
5063
5073
MAPS[N-1].size.
5064
5074
5065
5075
Each mapping SIZE must be a multiple of the system page size except
@@ -5085,8 +5095,10 @@ dump_mmap_contiguous (struct dump_memory_map *maps, int nr_maps)
5085
5095
total_size += maps [i ].spec .size ;
5086
5096
}
5087
5097
5088
- return (VM_SUPPORTED ? dump_mmap_contiguous_vm : dump_mmap_contiguous_heap )
5089
- (maps , nr_maps , total_size );
5098
+ if (VM_SUPPORTED )
5099
+ return dump_mmap_contiguous_vm (maps , nr_maps , total_size );
5100
+ else
5101
+ return dump_mmap_contiguous_heap (maps , nr_maps , total_size );
5090
5102
}
5091
5103
5092
5104
typedef uint_fast32_t dump_bitset_word ;
@@ -5129,7 +5141,7 @@ dump_bitset_bit_set_p (const struct dump_bitset *bitset,
5129
5141
{
5130
5142
dump_bitset_word bit = 1 ;
5131
5143
bit <<= bit_number % DUMP_BITSET_WORD_WIDTH ;
5132
- return * dump_bitset__bit_slot (bitset , bit_number ) & bit ;
5144
+ return ( * dump_bitset__bit_slot (bitset , bit_number ) & bit ) != 0 ;
5133
5145
}
5134
5146
5135
5147
static void
@@ -5548,8 +5560,8 @@ dump_do_dump_relocation (const uintptr_t dump_base,
5548
5560
struct bignum_reload_info reload_info ;
5549
5561
static_assert (sizeof (reload_info ) <= sizeof (* bignum_val (bignum )));
5550
5562
memcpy (& reload_info , bignum_val (bignum ), sizeof (reload_info ));
5551
- const mp_limb_t * limbs =
5552
- dump_ptr ( dump_base , reload_info .data_location );
5563
+ const mp_limb_t * limbs = dump_ptr ( dump_base ,
5564
+ reload_info .data_location );
5553
5565
mpz_roinit_n (bignum -> value , limbs , reload_info .nlimbs );
5554
5566
break ;
5555
5567
}
@@ -5790,15 +5802,29 @@ pdumper_load (const char *dump_filename, char *argv0)
5790
5802
goto out ;
5791
5803
5792
5804
err = PDUMPER_LOAD_ERROR ;
5793
- mark_bits_needed =
5794
- divide_round_up (header -> discardable_start , DUMP_ALIGNMENT );
5805
+ dump_base = (uintptr_t ) sections [DS_HOT ].mapping ;
5806
+
5807
+ #if !USE_LSB_TAG
5808
+ /* The dump may have been mapped at a location that does not admit of
5809
+ representation as Lisp_Objects. Abort in this case. */
5810
+ if ((dump_base + dump_size ) & ~VALMASK )
5811
+ {
5812
+ fprintf (stderr ,
5813
+ "Failed to load dump file: 0x%p+0x%p & 0x%p != 0\n" ,
5814
+ (void * ) dump_base , (void * ) dump_size ,
5815
+ (void * ) (uintptr_t ) VALMASK );
5816
+ goto out ;
5817
+ }
5818
+ #endif /* !USE_LSB_TAG */
5819
+
5820
+ mark_bits_needed
5821
+ = divide_round_up (header -> discardable_start , DUMP_ALIGNMENT );
5795
5822
if (!dump_bitsets_init (mark_bits , mark_bits_needed ))
5796
5823
goto out ;
5797
5824
5798
5825
/* Point of no return. */
5799
5826
err = PDUMPER_LOAD_SUCCESS ;
5800
- dump_base = (uintptr_t ) sections [DS_HOT ].mapping ;
5801
- gflags .dumped_with_pdumper_ = true;
5827
+ gflags .dumped_with_pdumper = true;
5802
5828
dump_private .header = * header ;
5803
5829
dump_private .mark_bits = mark_bits [0 ];
5804
5830
dump_private .last_mark_bits = mark_bits [1 ];
@@ -5815,8 +5841,8 @@ pdumper_load (const char *dump_filename, char *argv0)
5815
5841
Lisp_Object hashes = zero_vector ;
5816
5842
if (header -> hash_list )
5817
5843
{
5818
- struct Lisp_Vector * hash_tables =
5819
- (struct Lisp_Vector * ) (dump_base + header -> hash_list );
5844
+ struct Lisp_Vector * hash_tables
5845
+ = (struct Lisp_Vector * ) (dump_base + header -> hash_list );
5820
5846
hashes = make_lisp_ptr (hash_tables , Lisp_Vectorlike );
5821
5847
}
5822
5848
@@ -5852,7 +5878,6 @@ pdumper_load (const char *dump_filename, char *argv0)
5852
5878
dump_mmap_release (& sections [i ]);
5853
5879
if (dump_fd >= 0 )
5854
5880
emacs_close (dump_fd );
5855
-
5856
5881
return err ;
5857
5882
}
5858
5883
0 commit comments