segment.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 FILE_LICENCE ( GPL2_OR_LATER );
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <errno.h>
00029 #include <gpxe/uaccess.h>
00030 #include <gpxe/memmap.h>
00031 #include <gpxe/errortab.h>
00032 #include <gpxe/segment.h>
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 int prep_segment ( userptr_t segment, size_t filesz, size_t memsz ) {
00043 struct memory_map memmap;
00044 physaddr_t start = user_to_phys ( segment, 0 );
00045 physaddr_t mid = user_to_phys ( segment, filesz );
00046 physaddr_t end = user_to_phys ( segment, memsz );
00047 unsigned int i;
00048
00049 DBG ( "Preparing segment [%lx,%lx,%lx)\n", start, mid, end );
00050
00051
00052 if ( filesz > memsz ) {
00053 DBG ( "Insane segment [%lx,%lx,%lx)\n", start, mid, end );
00054 return -EINVAL;
00055 }
00056
00057
00058
00059
00060
00061 get_memmap ( &memmap );
00062
00063
00064 for ( i = 0 ; i < memmap.count ; i++ ) {
00065 if ( ( start >= memmap.regions[i].start ) &&
00066 ( end <= memmap.regions[i].end ) ) {
00067
00068 memset_user ( segment, filesz, 0, ( memsz - filesz ) );
00069 return 0;
00070 }
00071 }
00072
00073
00074 DBG ( "Segment [%lx,%lx,%lx) does not fit into available memory\n",
00075 start, mid, end );
00076 return -ERANGE;
00077 }
00078
00079
00080
00081
00082
00083
00084
00085 struct errortab segment_errors[] __errortab = {
00086 { ERANGE, "Requested memory not available" },
00087 };