Subversion Repositories HelenOS-historic

Rev

Rev 1415 | Rev 1423 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1415 Rev 1417
Line 456... Line 456...
456
 * space area. If the source address space area has not been shared so
456
 * space area. If the source address space area has not been shared so
457
 * far, a new sh_info is created and the original mapping is duplicated
457
 * far, a new sh_info is created and the original mapping is duplicated
458
 * in its pagemap B+tree. The new address space are simply gets the
458
 * in its pagemap B+tree. The new address space are simply gets the
459
 * sh_info of the source area.
459
 * sh_info of the source area.
460
 *
460
 *
461
 * @param src_as Pointer to source address space
461
 * @param src_as Pointer to source address space.
462
 * @param src_base Base address of the source address space area.
462
 * @param src_base Base address of the source address space area.
463
 * @param acc_size Expected size of the source area
463
 * @param acc_size Expected size of the source area.
464
 * @param dst_base Target base address
464
 * @param dst_base Target base address.
-
 
465
 * @param dst_flags_mask Destination address space area flags mask.
465
 *
466
 *
466
 * @return Zero on success or ENOENT if there is no such task or
467
 * @return Zero on success or ENOENT if there is no such task or
467
 *     if there is no such address space area,
468
 *     if there is no such address space area,
468
 *     EPERM if there was a problem in accepting the area or
469
 *     EPERM if there was a problem in accepting the area or
469
 *     ENOMEM if there was a problem in allocating destination
470
 *     ENOMEM if there was a problem in allocating destination
470
 *     address space area. ENOTSUP is returned if an attempt
471
 *     address space area. ENOTSUP is returned if an attempt
471
 *     to share non-anonymous address space area is detected.
472
 *     to share non-anonymous address space area is detected.
472
 */
473
 */
473
int as_area_share(as_t *src_as, __address src_base, size_t acc_size,
474
int as_area_share(as_t *src_as, __address src_base, size_t acc_size,
474
          __address dst_base)
475
          __address dst_base, int dst_flags_mask)
475
{
476
{
476
    ipl_t ipl;
477
    ipl_t ipl;
477
    int src_flags;
478
    int src_flags;
478
    size_t src_size;
479
    size_t src_size;
479
    as_area_t *src_area, *dst_area;
480
    as_area_t *src_area, *dst_area;
Line 565... Line 566...
565
    /*
566
    /*
566
     * Create copy of the source address space area.
567
     * Create copy of the source address space area.
567
     * The destination area is created with AS_AREA_ATTR_PARTIAL
568
     * The destination area is created with AS_AREA_ATTR_PARTIAL
568
     * attribute set which prevents race condition with
569
     * attribute set which prevents race condition with
569
     * preliminary as_page_fault() calls.
570
     * preliminary as_page_fault() calls.
-
 
571
     * The flags of the source area are masked against dst_flags_mask
-
 
572
     * to support sharing in less privileged mode.
570
     */
573
     */
571
    dst_area = as_area_create(AS, src_flags, src_size, dst_base, AS_AREA_ATTR_PARTIAL, &anon_backend, NULL);
574
    dst_area = as_area_create(AS, src_flags & dst_flags_mask, src_size, dst_base,
-
 
575
                  AS_AREA_ATTR_PARTIAL, &anon_backend, NULL);
572
    if (!dst_area) {
576
    if (!dst_area) {
573
        /*
577
        /*
574
         * Destination address space area could not be created.
578
         * Destination address space area could not be created.
575
         */
579
         */
576
        sh_info_remove_reference(sh_info);
580
        sh_info_remove_reference(sh_info);