From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mathieu Malaterre Date: Tue, 02 Apr 2019 07:08:58 +0000 Subject: Re: [PATCH 09/11] drm/fbdevdrm: Add primary plane Message-Id: List-Id: References: <20190326091744.11542-1-tzimmermann@suse.de> <20190326091744.11542-10-tzimmermann@suse.de> In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit To: Thomas Zimmermann Cc: David Airlie , Linux Fbdev development list , dri-devel , Bartlomiej Zolnierkiewicz On Wed, Mar 27, 2019 at 10:37 AM Thomas Zimmermann wrote: > > Hi > > Am 26.03.19 um 14:33 schrieb Mathieu Malaterre: > > > > ... > > ../drivers/gpu/drm/fbdevdrm/fbdevdrm_modes.c:174:2: note: in expansion > > of macro 'do_div' > > do_div(width, cpp); > > ^~~~~~ > > In file included from ./arch/powerpc/include/generated/asm/div64.h:1, > > from ../include/linux/kernel.h:18, > > from ../include/linux/list.h:9, > > from ../include/linux/rculist.h:10, > > from ../include/linux/pid.h:5, > > from ../include/linux/sched.h:14, > > from ../drivers/gpu/drm/fbdevdrm/fbdevdrm_modes.c:15: > > ../include/asm-generic/div64.h:239:22: error: passing argument 1 of > > '__div64_32' from incompatible pointer type > > [-Werror=incompatible-pointer-types] > > __rem = __div64_32(&(n), __base); \ > > ^~~~ > > ../drivers/gpu/drm/fbdevdrm/fbdevdrm_modes.c:174:2: note: in expansion > > of macro 'do_div' > > do_div(width, cpp); > > ^~~~~~ > > ../include/asm-generic/div64.h:213:38: note: expected 'uint64_t *' > > {aka 'long long unsigned int *'} but argument is of type 'unsigned int > > *' > > extern uint32_t __div64_32(uint64_t *dividend, uint32_t divisor); > > ... > > I didn't see this error in 64-bit builds either. Could you send me your > kernel config? Thanks! https://github.com/malaterre/linux/blob/g4/arch/powerpc/configs/g4_defconfig I am using Debian/sid with the default cross compiler for powerpc: $ make -j8 O=g4 ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- > Best regards > Thomas > > > > > >> + > >> + if (width > (__u32)-1) > >> + return -EINVAL; /* would overflow fb_var->xres_virtual */ > >> + > >> + pitch = fb->pitches[0]; > >> + lines = vram_size; > >> + do_div(lines, pitch); > >> + > >> + if (lines > (__u32)-1) > >> + return -EINVAL; /* would overflow fb_var->yres_virtual */ > >> + > >> + fb_var->xres_virtual = width; > >> + fb_var->yres_virtual = lines; > >> + > >> + ret = fbdevdrm_update_fb_var_screeninfo_from_format( > >> + fb_var, fb->format[0].format); > >> + if (ret) > >> + return ret; > >> + > >> + return 0; > >> +} > >> diff --git a/drivers/gpu/drm/fbdevdrm/fbdevdrm_modes.h b/drivers/gpu/drm/fbdevdrm/fbdevdrm_modes.h > >> index f88a86a83858..925eea78e3f0 100644 > >> --- a/drivers/gpu/drm/fbdevdrm/fbdevdrm_modes.h > >> +++ b/drivers/gpu/drm/fbdevdrm/fbdevdrm_modes.h > >> @@ -13,8 +13,11 @@ > >> #ifndef FBDEVDRM_MODES_H > >> #define FBDEVDRM_MODES_H > >> > >> +#include > >> + > >> struct drm_device; > >> struct drm_display_mode; > >> +struct drm_framebuffer; > >> struct fb_videomode; > >> struct fb_var_screeninfo; > >> > >> @@ -43,4 +46,8 @@ void > >> fbdevdrm_init_fb_var_screeninfo_from_mode(struct fb_var_screeninfo *var, > >> const struct drm_display_mode *mode); > >> > >> +int fbdevdrm_update_fb_var_screeninfo_from_framebuffer( > >> + struct fb_var_screeninfo *fb_var, struct drm_framebuffer *fb, > >> + size_t vram_size); > >> + > >> #endif > >> diff --git a/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c b/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c > >> index 585f3478f190..3473b85acbf1 100644 > >> --- a/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c > >> +++ b/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c > >> @@ -20,6 +20,7 @@ > >> #include > >> #include > >> #include > >> +#include "fbdevdrm_primary.h" > >> > >> /* > >> * CRTC > >> @@ -376,7 +377,13 @@ int fbdevdrm_modeset_init(struct fbdevdrm_modeset *modeset, > >> * connect them with each other. > >> */ > >> > >> - ret = drm_crtc_init_with_planes(dev, &modeset->crtc, NULL, NULL, > >> + ret = fbdevdrm_init_primary_plane_from_fb_info( > >> + &modeset->primary_plane, dev, 0, fb_info); > >> + if (ret) > >> + goto err_drm_mode_config_cleanup; > >> + > >> + ret = drm_crtc_init_with_planes(dev, &modeset->crtc, > >> + &modeset->primary_plane, NULL, > >> &fbdevdrm_crtc_funcs, NULL); > >> if (ret) > >> goto err_drm_mode_config_cleanup; > >> diff --git a/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.h b/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.h > >> index 21e87caa8196..ec753014aba1 100644 > >> --- a/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.h > >> +++ b/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.h > >> @@ -16,11 +16,13 @@ > >> #include > >> #include > >> #include > >> +#include > >> > >> struct drm_device; > >> struct fb_info; > >> > >> struct fbdevdrm_modeset { > >> + struct drm_plane primary_plane; > >> struct drm_crtc crtc; > >> struct drm_encoder encoder; > >> struct drm_connector connector; > >> diff --git a/drivers/gpu/drm/fbdevdrm/fbdevdrm_primary.c b/drivers/gpu/drm/fbdevdrm/fbdevdrm_primary.c > >> new file mode 100644 > >> index 000000000000..8ba8e6bd1c14 > >> --- /dev/null > >> +++ b/drivers/gpu/drm/fbdevdrm/fbdevdrm_primary.c > >> @@ -0,0 +1,498 @@ > >> +/* SPDX-License-Identifier: GPL-2.0-or-later > >> + * > >> + * One purpose of this driver is to allow for easy conversion of framebuffer > >> + * drivers to DRM. As a special exception to the GNU GPL, you are allowed to > >> + * relicense this file under the terms of a license of your choice if you're > >> + * porting a framebuffer driver. In order to do so, update the SPDX license > >> + * identifier to the new license and remove this exception. > >> + * > >> + * If you add code to this file, please ensure that it's compatible with the > >> + * stated exception. > >> + */ > >> + > >> +#include "fbdevdrm_primary.h" > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include "fbdevdrm_bo.h" > >> +#include "fbdevdrm_format.h" > >> +#include "fbdevdrm_modes.h" > >> +#include "fbdevdrm_modeset.h" > >> + > >> +static struct fbdevdrm_modeset* fbdevdrm_modeset_of_primary_plane( > >> + struct drm_plane *primary_plane) > >> +{ > >> + return container_of(primary_plane, struct fbdevdrm_modeset, > >> + primary_plane); > >> +} > >> + > >> +/* > >> + * Primary plane > >> + */ > >> + > >> +static int primary_plane_helper_prepare_fb(struct drm_plane *plane, > >> + struct drm_plane_state *new_state) > >> +{ > >> + struct drm_gem_object *gem; > >> + struct fbdevdrm_bo *fbo; > >> + int ret; > >> + > >> + if (!new_state->fb) > >> + return 0; > >> + > >> + gem = new_state->fb->obj[0]; > >> + fbo = fbdevdrm_bo_of_gem(gem); > >> + > >> + ret = fbdevdrm_bo_pin(fbo, TTM_PL_FLAG_VRAM); > >> + if (ret) > >> + return ret; > >> + > >> + return 0; > >> +} > >> + > >> +static void primary_plane_helper_cleanup_fb(struct drm_plane *plane, > >> + struct drm_plane_state *old_state) > >> +{ > >> + struct drm_gem_object *gem; > >> + struct fbdevdrm_bo *fbo; > >> + > >> + if (!old_state->fb) > >> + return; > >> + > >> + gem = old_state->fb->obj[0]; > >> + fbo = fbdevdrm_bo_of_gem(gem); > >> + > >> + fbdevdrm_bo_unpin(fbo); > >> +} > >> + > >> +static void fbdevdrm_update_fb_var_screeninfo_from_crtc_state( > >> + struct fb_var_screeninfo *fb_var, struct drm_crtc_state* crtc_state) > >> +{ > >> + fbdevdrm_update_fb_var_screeninfo_from_mode(fb_var, &crtc_state->adjusted_mode); > >> +} > >> + > >> +static int primary_plane_helper_atomic_check(struct drm_plane *plane, > >> + struct drm_plane_state *state) > >> +{ > >> + struct drm_crtc_state *new_crtc_state; > >> + int ret; > >> + struct fbdevdrm_modeset *modeset; > >> + struct fb_var_screeninfo fb_var; > >> + > >> + if (!state->crtc) > >> + return 0; > >> + > >> + new_crtc_state = drm_atomic_get_new_crtc_state(state->state, > >> + state->crtc); > >> + if (!new_crtc_state) > >> + return 0; > >> + > >> + ret = drm_atomic_helper_check_plane_state(state, new_crtc_state, > >> + 1 << 16, 1 << 16, > >> + false, true); > >> + if (ret < 0) { > >> + DRM_ERROR("fbdrmdev: %s:%d ret=%d:\n", __func__, __LINE__, ret); > >> + return ret; > >> + } > >> + > >> + if (!state->visible || !state->fb) > >> + return 0; > >> + > >> + /* Virtual screen sizes are not supported. > >> + */ > >> + > >> + if (drm_rect_width(&state->dst) != state->fb->width || > >> + drm_rect_height(&state->dst) != state->fb->height) { > >> + DRM_ERROR("fbdevdrm: %s:%d: virtual screen sizes not supported\n", __func__, __LINE__); > >> + return -EINVAL; > >> + } > >> + if (state->dst.x1 || state->dst.y1) { > >> + DRM_ERROR("fbdevdrm: %s:%d: virtual screen offset not supported\n", __func__, __LINE__); > >> + return -EINVAL; > >> + } > >> + > >> + /* Pixel formats have to be compatible with fbdev. This is > >> + * usually some variation of XRGB. > >> + */ > >> + > >> + if (!plane->state || > >> + !plane->state->fb || > >> + plane->state->fb->format[0].format != state->fb->format[0].format) { > >> + > >> + modeset = fbdevdrm_modeset_of_primary_plane(plane); > >> + > >> + if (modeset->fb_info->fbops->fb_check_var) { > >> + memcpy(&fb_var, &modeset->fb_info->var, > >> + sizeof(fb_var)); > >> + fbdevdrm_update_fb_var_screeninfo_from_crtc_state( > >> + &fb_var, new_crtc_state); > >> + fbdevdrm_update_fb_var_screeninfo_from_framebuffer( > >> + &fb_var, state->fb, > >> + modeset->fb_info->fix.smem_len); > >> + ret = modeset->fb_info->fbops->fb_check_var( > >> + &fb_var, modeset->fb_info); > >> + if (ret < 0) > >> + return ret; > >> + } > >> + } > >> + > >> + return 0; > >> +} > >> + > >> +static int set_palette_cmap(struct fb_info* fb_info) > >> +{ > >> + __u32 len; > >> + const struct fb_cmap* default_cmap; > >> + struct fb_cmap cmap; > >> + int ret; > >> + const __u32 gamma_len[3] = { > >> + fb_info->var.red.length, > >> + fb_info->var.green.length, > >> + fb_info->var.blue.length > >> + }; > >> + > >> + len = max3(gamma_len[0], gamma_len[1], gamma_len[2]); > >> + if (!len || (len > 31)) { > >> + DRM_ERROR("fbdevdrm: gamma LUT has invalid bit count" > >> + " of %u\n", (unsigned int)len); > >> + return -EINVAL; > >> + } > >> + > >> + default_cmap = fb_default_cmap(1ul << len); > >> + if (!default_cmap) > >> + return -EINVAL; > >> + > >> + memset(&cmap, 0, sizeof(cmap)); > >> + ret = fb_alloc_cmap(&cmap, default_cmap->len, 0); > >> + if (ret) > >> + return ret; > >> + ret = fb_copy_cmap(default_cmap, &cmap); > >> + if (ret) > >> + goto err_fb_dealloc_cmap; > >> + ret = fb_set_cmap(&cmap, fb_info); > >> + if (ret) > >> + return ret; > >> + fb_dealloc_cmap(&cmap); > >> + > >> + return 0; > >> + > >> +err_fb_dealloc_cmap: > >> + fb_dealloc_cmap(&cmap); > >> + return ret; > >> +} > >> + > >> +static int set_linear_cmap(struct fb_info* fb_info) > >> +{ > >> + struct fb_cmap cmap; > >> + int ret; > >> + size_t i; > >> + unsigned int j; > >> + u16 *lut; > >> + u16 incr; > >> + u16 *gamma_lut[3]; > >> + __u32 len; > >> + const __u32 gamma_len[3] = { > >> + fb_info->var.red.length, > >> + fb_info->var.green.length, > >> + fb_info->var.blue.length > >> + }; > >> + > >> + len = max3(gamma_len[0], gamma_len[1], gamma_len[2]); > >> + if (!len || (len > 8)) { > >> + DRM_ERROR("fbdevdrm: gamma LUT has invalid bit count" > >> + " of %u\n", (unsigned int)len); > >> + return -EINVAL; > >> + } > >> + > >> + memset(&cmap, 0, sizeof(cmap)); > >> + ret = fb_alloc_cmap(&cmap, 1ul << len, 0); > >> + if (ret) > >> + return ret; > >> + > >> + gamma_lut[0] = cmap.red; > >> + gamma_lut[1] = cmap.green; > >> + gamma_lut[2] = cmap.blue; > >> + > >> + for (i = 0; i < ARRAY_SIZE(gamma_lut); ++i) { > >> + lut = gamma_lut[i]; > >> + len = 1ul << gamma_len[i]; > >> + incr = 0x10000u >> gamma_len[i]; > >> + for (j = 0; j < len; ++j, ++lut) { > >> + *lut = incr * j; > >> + } > >> + /* In order to have no intensity at index 0 and full > >> + * intensity at the final index of the LUT, we fix-up the > >> + * table's final entries. The fix-up makes intensity grow > >> + * faster near the final entries of the gamma LUT. The human > >> + * eye is more sensitive to changes to the lower intensities, > >> + * so this is probably not directly perceivable. > >> + */ > >> + for (lut -= gamma_len[i], j = gamma_len[i]; j > 0; ++lut) { > >> + --j; > >> + *lut += (incr >> j) - 1; /* subtract 1 to not > >> + * overflow the LUT's > >> + * final entry */ > >> + } > >> + } > >> + > >> + ret = fb_set_cmap(&cmap, fb_info); > >> + if (ret) > >> + goto err_fb_dealloc_cmap; > >> + fb_dealloc_cmap(&cmap); > >> + > >> + return 0; > >> + > >> +err_fb_dealloc_cmap: > >> + fb_dealloc_cmap(&cmap); > >> + return -EINVAL; > >> +} > >> + > >> +static int set_cmap(struct fb_info *fb_info) > >> +{ > >> + int ret = 0; > >> + > >> + switch (fb_info->fix.visual) { > >> + case FB_VISUAL_PSEUDOCOLOR: > >> + ret = set_palette_cmap(fb_info); > >> + break; > >> + case FB_VISUAL_DIRECTCOLOR: > >> + ret = set_linear_cmap(fb_info); > >> + break; > >> + default: > >> + break; > >> + } > >> + > >> + return ret; > >> +} > >> + > >> +static void primary_plane_helper_atomic_update( > >> + struct drm_plane *plane, struct drm_plane_state *old_state) > >> +{ > >> + struct fbdevdrm_modeset *modeset; > >> + uint32_t format; > >> + struct fb_var_screeninfo fb_var; > >> + int ret; > >> + struct drm_gem_object *gem; > >> + struct fbdevdrm_bo *fbo; > >> + __u32 line_length; > >> + uint64_t yoffset; > >> + uint32_t xoffset; > >> + > >> + modeset = fbdevdrm_modeset_of_primary_plane(plane); > >> + > >> + format = fbdevdrm_format_of_fb_info(modeset->fb_info); > >> + > >> + /* DRM porting notes: Some fbdev drivers report alpha channels for > >> + * their framebuffer, even though they don't support transparent > >> + * primary planes. For the format test below, we ignore the alpha > >> + * channel and use the non-transparent equivalent of the pixel format. > >> + * If you're porting an fbdev driver to DRM, remove this switch > >> + * statement and report the correct format instead. > >> + */ > >> + switch (format) { > >> + case DRM_FORMAT_ARGB8888: > >> + format = DRM_FORMAT_XRGB8888; > >> + break; > >> + case DRM_FORMAT_ABGR8888: > >> + format = DRM_FORMAT_XBGR8888; > >> + break; > >> + case DRM_FORMAT_RGBA8888: > >> + format = DRM_FORMAT_RGBX8888; > >> + break; > >> + case DRM_FORMAT_BGRA8888: > >> + format = DRM_FORMAT_BGRX8888; > >> + break; > >> + default: > >> + break; > >> + } > >> + > >> + if ((format != plane->state->fb->format[0].format) || > >> + (modeset->fb_info->var.xres_virtual != plane->state->fb->width)) { > >> + > >> + /* Pixel format changed, update fb_info accordingly > >> + */ > >> + > >> + memcpy(&fb_var, &modeset->fb_info->var, sizeof(fb_var)); > >> + ret = fbdevdrm_update_fb_var_screeninfo_from_framebuffer( > >> + &fb_var, plane->state->fb, > >> + modeset->fb_info->fix.smem_len); > >> + if (ret) > >> + return; > >> + > >> + fb_var.activate = FB_ACTIVATE_NOW; > >> + > >> + ret = fb_set_var(modeset->fb_info, &fb_var); > >> + if (ret) { > >> + DRM_ERROR("fbdevdrm: fb_set_var() failed: %d\n", ret); > >> + return; > >> + } > >> + } > >> + > >> + if (!old_state->fb || /* first-time update */ > >> + (format != plane->state->fb->format[0].format)) { > >> + > >> + /* DRM porting notes: Below we set the LUTs for palette and > >> + * gamma correction. This is required by some fbdev drivers, > >> + * such as nvidiafb and atyfb, which don't initialize the > >> + * table to pass-through the framebuffer values unchanged. This > >> + * is actually CRTC state, but the respective function > >> + * crtc_helper_mode_set_nofb() is only called when a CRTC > >> + * property changes, changes in color formats are not handled > >> + * there. When you're porting a fbdev driver to DRM, remove > >> + * the call. Gamma LUTs are CRTC properties and should be > >> + * handled there. Either remove gamma correction or set up > >> + * the respective CRTC properties for userspace. > >> + */ > >> + set_cmap(modeset->fb_info); > >> + } > >> + > >> + /* With the fb interface, we cannot directly program > >> + * the scanout buffer's address. Instead we use the > >> + * panning function to point the graphics card to the > >> + * buffer's location. > >> + */ > >> + > >> + gem = plane->state->fb->obj[0]; > >> + fbo = fbdevdrm_bo_of_gem(gem); > >> + > >> + line_length = plane->state->fb->pitches[0]; > >> + yoffset = fbo->bo.offset; > >> + xoffset = do_div(yoffset, line_length); > >> + if (yoffset > (__u32)-1) { > >> + /* The value of yoffset doesn't fit into a 32-bit value, > >> + * so we cannot use it for display panning. Either the > >> + * graphics card has GiBs of VRAM or this is a bug with > >> + * memory management. */ > >> + DRM_ERROR("fbdevdrm: buffer object is not aligned to a " > >> + "multiple of the scanline size.\n"); > >> + return; > >> + } else if (xoffset) { > >> + /* The buffer starts in the middle of a scanline. The > >> + * memory manager should have prevented this. This > >> + * problem indicates a bug with the buffer aligning. */ > >> + DRM_ERROR("fbdevdrm: buffer object is not aligned to a " > >> + "multiple of the scanline size.\n"); > >> + return; > >> + } > >> + > >> + memcpy(&fb_var, &modeset->fb_info->var, sizeof(fb_var)); > >> + fb_var.xoffset = xoffset; > >> + fb_var.yoffset = yoffset; > >> + > >> + ret = fb_pan_display(modeset->fb_info, &fb_var); > >> + if (ret) { > >> + DRM_ERROR("fbdevdrm: fb_pan_display() failed: %d\n", ret); > >> + return; > >> + } > >> +} > >> + > >> +static void primary_plane_helper_atomic_disable( > >> + struct drm_plane *plane, struct drm_plane_state *old_state) > >> +{ } > >> + > >> +static int primary_plane_helper_atomic_async_check( > >> + struct drm_plane *plane, struct drm_plane_state *state) > >> +{ > >> + return 0; > >> +} > >> + > >> +static void primary_plane_helper_atomic_async_update( > >> + struct drm_plane *plane, struct drm_plane_state *new_state) > >> +{ > >> + drm_plane_cleanup(plane); > >> +} > >> + > >> +static const struct drm_plane_helper_funcs primary_plane_helper_funcs = { > >> + .prepare_fb = primary_plane_helper_prepare_fb, > >> + .cleanup_fb = primary_plane_helper_cleanup_fb, > >> + .atomic_check = primary_plane_helper_atomic_check, > >> + .atomic_update = primary_plane_helper_atomic_update, > >> + .atomic_disable = primary_plane_helper_atomic_disable, > >> + .atomic_async_check = primary_plane_helper_atomic_async_check, > >> + .atomic_async_update = primary_plane_helper_atomic_async_update > >> +}; > >> + > >> +static void primary_plane_destroy(struct drm_plane *plane) > >> +{ > >> + drm_plane_cleanup(plane); > >> +} > >> + > >> +static const struct drm_plane_funcs primary_plane_funcs = { > >> + .update_plane = drm_atomic_helper_update_plane, > >> + .disable_plane = drm_atomic_helper_disable_plane, > >> + .destroy = primary_plane_destroy, > >> + .reset = drm_atomic_helper_plane_reset, > >> + .set_property = NULL, /* unused */ > >> + .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state, > >> + .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, > >> + .atomic_set_property = NULL, /* unused */ > >> + .atomic_get_property = NULL, /* unused */ > >> + .late_register = NULL, /* unused */ > >> + .early_unregister = NULL, /* unused */ > >> + .atomic_print_state = NULL, /* unused */ > >> + .format_mod_supported = NULL /* unused */ > >> +}; > >> + > >> +static const uint32_t* > >> +formats_from_fb_info(const struct fb_info* fb_info, unsigned int* format_count) > >> +{ > >> + /* TODO: Detect the actually supported formats or have some > >> + * sort of whitelist for known hardware devices. > >> + */ > >> + static const uint32_t formats[] = { > >> + DRM_FORMAT_XRGB8888, > >> + DRM_FORMAT_RGB565 > >> + }; > >> + > >> + *format_count = ARRAY_SIZE(formats); > >> + > >> + return formats; > >> +} > >> + > >> +int fbdevdrm_init_primary_plane_from_fb_info(struct drm_plane *plane, > >> + struct drm_device *dev, > >> + uint32_t possible_crtcs, > >> + struct fb_info *fb_info) > >> +{ > >> + uint32_t cur_format; > >> + const uint32_t* format; > >> + unsigned int format_count; > >> + int ret; > >> + > >> + /* We first try to find the supported pixel formats from the > >> + * fb_info's hardware settings. If that fails, we take the > >> + * current settings. */ > >> + format = formats_from_fb_info(fb_info, &format_count); > >> + if (!format_count) { > >> + cur_format = fbdevdrm_format_of_fb_info(fb_info); > >> + format = &cur_format; > >> + format_count = 1; > >> + } > >> + if (!format_count) > >> + return -ENODEV; > >> + > >> + ret = drm_universal_plane_init(dev, plane, possible_crtcs, > >> + &primary_plane_funcs, > >> + format, format_count, > >> + NULL, DRM_PLANE_TYPE_PRIMARY, NULL); > >> + if (ret < 0) > >> + return ret; > >> + drm_plane_helper_add(plane, &primary_plane_helper_funcs); > >> + > >> + ret = drm_plane_create_rotation_property(plane, DRM_MODE_ROTATE_0, > >> + DRM_MODE_ROTATE_0); > >> + if (ret < 0) > >> + goto err_drm_plane_cleanup; > >> + > >> + ret = drm_plane_create_zpos_immutable_property(plane, 0); > >> + if (ret < 0) > >> + goto err_drm_plane_cleanup; > >> + > >> + return 0; > >> + > >> +err_drm_plane_cleanup: > >> + drm_plane_cleanup(plane); > >> + return ret; > >> +} > >> diff --git a/drivers/gpu/drm/fbdevdrm/fbdevdrm_primary.h b/drivers/gpu/drm/fbdevdrm/fbdevdrm_primary.h > >> new file mode 100644 > >> index 000000000000..529c272c6e0b > >> --- /dev/null > >> +++ b/drivers/gpu/drm/fbdevdrm/fbdevdrm_primary.h > >> @@ -0,0 +1,27 @@ > >> +/* SPDX-License-Identifier: GPL-2.0-or-later > >> + * > >> + * One purpose of this driver is to allow for easy conversion of framebuffer > >> + * drivers to DRM. As a special exception to the GNU GPL, you are allowed to > >> + * relicense this file under the terms of a license of your choice if you're > >> + * porting a framebuffer driver. In order to do so, update the SPDX license > >> + * identifier to the new license and remove this exception. > >> + * > >> + * If you add code to this file, please ensure that it's compatible with the > >> + * stated exception. > >> + */ > >> + > >> +#ifndef FBDEVDRM_PRIMARY_H > >> +#define FBDEVDRM_PRIMARY_H > >> + > >> +#include > >> + > >> +struct drm_device; > >> +struct drm_plane; > >> +struct fb_info; > >> + > >> +int fbdevdrm_init_primary_plane_from_fb_info(struct drm_plane *plane, > >> + struct drm_device *dev, > >> + uint32_t possible_crtcs, > >> + struct fb_info *fb_info); > >> + > >> +#endif > >> -- > >> 2.21.0 > >> > > _______________________________________________ > > dri-devel mailing list > > dri-devel@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/dri-devel > > > > -- > Thomas Zimmermann > Graphics Driver Developer > SUSE Linux GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany > GF: Felix Imendörffer, Mary Higgins, Sri Rasiah > HRB 21284 (AG Nürnberg) > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mathieu Malaterre Subject: Re: [PATCH 09/11] drm/fbdevdrm: Add primary plane Date: Tue, 2 Apr 2019 09:08:58 +0200 Message-ID: References: <20190326091744.11542-1-tzimmermann@suse.de> <20190326091744.11542-10-tzimmermann@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-oi1-f193.google.com (mail-oi1-f193.google.com [209.85.167.193]) by gabe.freedesktop.org (Postfix) with ESMTPS id A17886E2D9 for ; Tue, 2 Apr 2019 07:09:11 +0000 (UTC) Received: by mail-oi1-f193.google.com with SMTP id w139so9571419oie.9 for ; Tue, 02 Apr 2019 00:09:11 -0700 (PDT) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Thomas Zimmermann Cc: David Airlie , Linux Fbdev development list , dri-devel , Bartlomiej Zolnierkiewicz List-Id: dri-devel@lists.freedesktop.org T24gV2VkLCBNYXIgMjcsIDIwMTkgYXQgMTA6MzcgQU0gVGhvbWFzIFppbW1lcm1hbm4gPHR6aW1t ZXJtYW5uQHN1c2UuZGU+IHdyb3RlOgo+Cj4gSGkKPgo+IEFtIDI2LjAzLjE5IHVtIDE0OjMzIHNj aHJpZWIgTWF0aGlldSBNYWxhdGVycmU6Cj4gPgo+ID4gLi4uCj4gPiAuLi9kcml2ZXJzL2dwdS9k cm0vZmJkZXZkcm0vZmJkZXZkcm1fbW9kZXMuYzoxNzQ6Mjogbm90ZTogaW4gZXhwYW5zaW9uCj4g PiBvZiBtYWNybyAnZG9fZGl2Jwo+ID4gICBkb19kaXYod2lkdGgsIGNwcCk7Cj4gPiAgIF5+fn5+ fgo+ID4gSW4gZmlsZSBpbmNsdWRlZCBmcm9tIC4vYXJjaC9wb3dlcnBjL2luY2x1ZGUvZ2VuZXJh dGVkL2FzbS9kaXY2NC5oOjEsCj4gPiAgICAgICAgICAgICAgICAgIGZyb20gLi4vaW5jbHVkZS9s aW51eC9rZXJuZWwuaDoxOCwKPiA+ICAgICAgICAgICAgICAgICAgZnJvbSAuLi9pbmNsdWRlL2xp bnV4L2xpc3QuaDo5LAo+ID4gICAgICAgICAgICAgICAgICBmcm9tIC4uL2luY2x1ZGUvbGludXgv cmN1bGlzdC5oOjEwLAo+ID4gICAgICAgICAgICAgICAgICBmcm9tIC4uL2luY2x1ZGUvbGludXgv cGlkLmg6NSwKPiA+ICAgICAgICAgICAgICAgICAgZnJvbSAuLi9pbmNsdWRlL2xpbnV4L3NjaGVk Lmg6MTQsCj4gPiAgICAgICAgICAgICAgICAgIGZyb20gLi4vZHJpdmVycy9ncHUvZHJtL2ZiZGV2 ZHJtL2ZiZGV2ZHJtX21vZGVzLmM6MTU6Cj4gPiAuLi9pbmNsdWRlL2FzbS1nZW5lcmljL2RpdjY0 Lmg6MjM5OjIyOiBlcnJvcjogcGFzc2luZyBhcmd1bWVudCAxIG9mCj4gPiAnX19kaXY2NF8zMicg ZnJvbSBpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlCj4gPiBbLVdlcnJvcj1pbmNvbXBhdGlibGUt cG9pbnRlci10eXBlc10KPiA+ICAgIF9fcmVtID0gX19kaXY2NF8zMigmKG4pLCBfX2Jhc2UpOyBc Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgXn5+fgo+ID4gLi4vZHJpdmVycy9ncHUvZHJtL2Zi ZGV2ZHJtL2ZiZGV2ZHJtX21vZGVzLmM6MTc0OjI6IG5vdGU6IGluIGV4cGFuc2lvbgo+ID4gb2Yg bWFjcm8gJ2RvX2RpdicKPiA+ICAgZG9fZGl2KHdpZHRoLCBjcHApOwo+ID4gICBefn5+fn4KPiA+ IC4uL2luY2x1ZGUvYXNtLWdlbmVyaWMvZGl2NjQuaDoyMTM6Mzg6IG5vdGU6IGV4cGVjdGVkICd1 aW50NjRfdCAqJwo+ID4ge2FrYSAnbG9uZyBsb25nIHVuc2lnbmVkIGludCAqJ30gYnV0IGFyZ3Vt ZW50IGlzIG9mIHR5cGUgJ3Vuc2lnbmVkIGludAo+ID4gKicKPiA+ICBleHRlcm4gdWludDMyX3Qg X19kaXY2NF8zMih1aW50NjRfdCAqZGl2aWRlbmQsIHVpbnQzMl90IGRpdmlzb3IpOwo+ID4gLi4u Cj4KPiBJIGRpZG4ndCBzZWUgdGhpcyBlcnJvciBpbiA2NC1iaXQgYnVpbGRzIGVpdGhlci4gQ291 bGQgeW91IHNlbmQgbWUgeW91cgo+IGtlcm5lbCBjb25maWc/IFRoYW5rcyEKCmh0dHBzOi8vZ2l0 aHViLmNvbS9tYWxhdGVycmUvbGludXgvYmxvYi9nNC9hcmNoL3Bvd2VycGMvY29uZmlncy9nNF9k ZWZjb25maWcKCkkgYW0gdXNpbmcgRGViaWFuL3NpZCB3aXRoIHRoZSBkZWZhdWx0IGNyb3NzIGNv bXBpbGVyIGZvciBwb3dlcnBjOgoKJCBtYWtlIC1qOCBPPWc0IEFSQ0g9cG93ZXJwYyBDUk9TU19D T01QSUxFPXBvd2VycGMtbGludXgtZ251LQoKPiBCZXN0IHJlZ2FyZHMKPiBUaG9tYXMKPgo+Cj4g Pgo+ID4+ICsKPiA+PiArICAgICAgIGlmICh3aWR0aCA+IChfX3UzMiktMSkKPiA+PiArICAgICAg ICAgICAgICAgcmV0dXJuIC1FSU5WQUw7IC8qIHdvdWxkIG92ZXJmbG93IGZiX3Zhci0+eHJlc192 aXJ0dWFsICovCj4gPj4gKwo+ID4+ICsgICAgICAgcGl0Y2ggPSBmYi0+cGl0Y2hlc1swXTsKPiA+ PiArICAgICAgIGxpbmVzID0gdnJhbV9zaXplOwo+ID4+ICsgICAgICAgZG9fZGl2KGxpbmVzLCBw aXRjaCk7Cj4gPj4gKwo+ID4+ICsgICAgICAgaWYgKGxpbmVzID4gKF9fdTMyKS0xKQo+ID4+ICsg ICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsgLyogd291bGQgb3ZlcmZsb3cgZmJfdmFyLT55 cmVzX3ZpcnR1YWwgKi8KPiA+PiArCj4gPj4gKyAgICAgICBmYl92YXItPnhyZXNfdmlydHVhbCA9 IHdpZHRoOwo+ID4+ICsgICAgICAgZmJfdmFyLT55cmVzX3ZpcnR1YWwgPSBsaW5lczsKPiA+PiAr Cj4gPj4gKyAgICAgICByZXQgPSBmYmRldmRybV91cGRhdGVfZmJfdmFyX3NjcmVlbmluZm9fZnJv bV9mb3JtYXQoCj4gPj4gKyAgICAgICAgICAgICAgIGZiX3ZhciwgZmItPmZvcm1hdFswXS5mb3Jt YXQpOwo+ID4+ICsgICAgICAgaWYgKHJldCkKPiA+PiArICAgICAgICAgICAgICAgcmV0dXJuIHJl dDsKPiA+PiArCj4gPj4gKyAgICAgICByZXR1cm4gMDsKPiA+PiArfQo+ID4+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vZmJkZXZkcm0vZmJkZXZkcm1fbW9kZXMuaCBiL2RyaXZlcnMvZ3B1 L2RybS9mYmRldmRybS9mYmRldmRybV9tb2Rlcy5oCj4gPj4gaW5kZXggZjg4YTg2YTgzODU4Li45 MjVlZWE3OGUzZjAgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2ZiZGV2ZHJtL2Zi ZGV2ZHJtX21vZGVzLmgKPiA+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZmJkZXZkcm0vZmJkZXZk cm1fbW9kZXMuaAo+ID4+IEBAIC0xMyw4ICsxMywxMSBAQAo+ID4+ICAjaWZuZGVmIEZCREVWRFJN X01PREVTX0gKPiA+PiAgI2RlZmluZSBGQkRFVkRSTV9NT0RFU19ICj4gPj4KPiA+PiArI2luY2x1 ZGUgPGxpbnV4L3R5cGVzLmg+Cj4gPj4gKwo+ID4+ICBzdHJ1Y3QgZHJtX2RldmljZTsKPiA+PiAg c3RydWN0IGRybV9kaXNwbGF5X21vZGU7Cj4gPj4gK3N0cnVjdCBkcm1fZnJhbWVidWZmZXI7Cj4g Pj4gIHN0cnVjdCBmYl92aWRlb21vZGU7Cj4gPj4gIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbzsK PiA+Pgo+ID4+IEBAIC00Myw0ICs0Niw4IEBAIHZvaWQKPiA+PiAgZmJkZXZkcm1faW5pdF9mYl92 YXJfc2NyZWVuaW5mb19mcm9tX21vZGUoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCj4g Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0 IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOwo+ID4+Cj4gPj4gK2ludCBmYmRldmRybV91cGRhdGVf ZmJfdmFyX3NjcmVlbmluZm9fZnJvbV9mcmFtZWJ1ZmZlcigKPiA+PiArICAgICAgIHN0cnVjdCBm Yl92YXJfc2NyZWVuaW5mbyAqZmJfdmFyLCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKPiA+ PiArICAgICAgIHNpemVfdCB2cmFtX3NpemUpOwo+ID4+ICsKPiA+PiAgI2VuZGlmCj4gPj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9mYmRldmRybS9mYmRldmRybV9tb2Rlc2V0LmMgYi9k cml2ZXJzL2dwdS9kcm0vZmJkZXZkcm0vZmJkZXZkcm1fbW9kZXNldC5jCj4gPj4gaW5kZXggNTg1 ZjM0NzhmMTkwLi4zNDczYjg1YWNiZjEgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJt L2ZiZGV2ZHJtL2ZiZGV2ZHJtX21vZGVzZXQuYwo+ID4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9m YmRldmRybS9mYmRldmRybV9tb2Rlc2V0LmMKPiA+PiBAQCAtMjAsNiArMjAsNyBAQAo+ID4+ICAj aW5jbHVkZSA8ZHJtL2RybV9tb2Rlc2V0X2hlbHBlcl92dGFibGVzLmg+Cj4gPj4gICNpbmNsdWRl IDxkcm0vZHJtX3Byb2JlX2hlbHBlci5oPgo+ID4+ICAjaW5jbHVkZSA8bGludXgvZmIuaD4KPiA+ PiArI2luY2x1ZGUgImZiZGV2ZHJtX3ByaW1hcnkuaCIKPiA+Pgo+ID4+ICAvKgo+ID4+ICAgKiBD UlRDCj4gPj4gQEAgLTM3Niw3ICszNzcsMTMgQEAgaW50IGZiZGV2ZHJtX21vZGVzZXRfaW5pdChz dHJ1Y3QgZmJkZXZkcm1fbW9kZXNldCAqbW9kZXNldCwKPiA+PiAgICAgICAgICAqIGNvbm5lY3Qg dGhlbSB3aXRoIGVhY2ggb3RoZXIuCj4gPj4gICAgICAgICAgKi8KPiA+Pgo+ID4+IC0gICAgICAg cmV0ID0gZHJtX2NydGNfaW5pdF93aXRoX3BsYW5lcyhkZXYsICZtb2Rlc2V0LT5jcnRjLCBOVUxM LCBOVUxMLAo+ID4+ICsgICAgICAgcmV0ID0gZmJkZXZkcm1faW5pdF9wcmltYXJ5X3BsYW5lX2Zy b21fZmJfaW5mbygKPiA+PiArICAgICAgICAgICAgICAgJm1vZGVzZXQtPnByaW1hcnlfcGxhbmUs IGRldiwgMCwgZmJfaW5mbyk7Cj4gPj4gKyAgICAgICBpZiAocmV0KQo+ID4+ICsgICAgICAgICAg ICAgICBnb3RvIGVycl9kcm1fbW9kZV9jb25maWdfY2xlYW51cDsKPiA+PiArCj4gPj4gKyAgICAg ICByZXQgPSBkcm1fY3J0Y19pbml0X3dpdGhfcGxhbmVzKGRldiwgJm1vZGVzZXQtPmNydGMsCj4g Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2Rlc2V0LT5wcmlt YXJ5X3BsYW5lLCBOVUxMLAo+ID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAmZmJkZXZkcm1fY3J0Y19mdW5jcywgTlVMTCk7Cj4gPj4gICAgICAgICBpZiAocmV0KQo+ ID4+ICAgICAgICAgICAgICAgICBnb3RvIGVycl9kcm1fbW9kZV9jb25maWdfY2xlYW51cDsKPiA+ PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2ZiZGV2ZHJtL2ZiZGV2ZHJtX21vZGVzZXQu aCBiL2RyaXZlcnMvZ3B1L2RybS9mYmRldmRybS9mYmRldmRybV9tb2Rlc2V0LmgKPiA+PiBpbmRl eCAyMWU4N2NhYTgxOTYuLmVjNzUzMDE0YWJhMSAxMDA2NDQKPiA+PiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vZmJkZXZkcm0vZmJkZXZkcm1fbW9kZXNldC5oCj4gPj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL2ZiZGV2ZHJtL2ZiZGV2ZHJtX21vZGVzZXQuaAo+ID4+IEBAIC0xNiwxMSArMTYsMTMgQEAK PiA+PiAgI2luY2x1ZGUgPGRybS9kcm1fY29ubmVjdG9yLmg+Cj4gPj4gICNpbmNsdWRlIDxkcm0v ZHJtX2NydGMuaD4KPiA+PiAgI2luY2x1ZGUgPGRybS9kcm1fZW5jb2Rlci5oPgo+ID4+ICsjaW5j bHVkZSA8ZHJtL2RybV9wbGFuZS5oPgo+ID4+Cj4gPj4gIHN0cnVjdCBkcm1fZGV2aWNlOwo+ID4+ ICBzdHJ1Y3QgZmJfaW5mbzsKPiA+Pgo+ID4+ICBzdHJ1Y3QgZmJkZXZkcm1fbW9kZXNldCB7Cj4g Pj4gKyAgICAgICBzdHJ1Y3QgZHJtX3BsYW5lIHByaW1hcnlfcGxhbmU7Cj4gPj4gICAgICAgICBz dHJ1Y3QgZHJtX2NydGMgY3J0YzsKPiA+PiAgICAgICAgIHN0cnVjdCBkcm1fZW5jb2RlciBlbmNv ZGVyOwo+ID4+ICAgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3IgY29ubmVjdG9yOwo+ID4+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZmJkZXZkcm0vZmJkZXZkcm1fcHJpbWFyeS5jIGIv ZHJpdmVycy9ncHUvZHJtL2ZiZGV2ZHJtL2ZiZGV2ZHJtX3ByaW1hcnkuYwo+ID4+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0Cj4gPj4gaW5kZXggMDAwMDAwMDAwMDAwLi44YmE4ZTZiZDFjMTQKPiA+PiAt LS0gL2Rldi9udWxsCj4gPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2ZiZGV2ZHJtL2ZiZGV2ZHJt X3ByaW1hcnkuYwo+ID4+IEBAIC0wLDAgKzEsNDk4IEBACj4gPj4gKy8qIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyCj4gPj4gKyAqCj4gPj4gKyAqIE9uZSBwdXJwb3Nl IG9mIHRoaXMgZHJpdmVyIGlzIHRvIGFsbG93IGZvciBlYXN5IGNvbnZlcnNpb24gb2YgZnJhbWVi dWZmZXIKPiA+PiArICogZHJpdmVycyB0byBEUk0uIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8g dGhlIEdOVSBHUEwsIHlvdSBhcmUgYWxsb3dlZCB0bwo+ID4+ICsgKiByZWxpY2Vuc2UgdGhpcyBm aWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIGxpY2Vuc2Ugb2YgeW91ciBjaG9pY2UgaWYgeW91J3Jl Cj4gPj4gKyAqIHBvcnRpbmcgYSBmcmFtZWJ1ZmZlciBkcml2ZXIuIEluIG9yZGVyIHRvIGRvIHNv LCB1cGRhdGUgdGhlIFNQRFggbGljZW5zZQo+ID4+ICsgKiBpZGVudGlmaWVyIHRvIHRoZSBuZXcg bGljZW5zZSBhbmQgcmVtb3ZlIHRoaXMgZXhjZXB0aW9uLgo+ID4+ICsgKgo+ID4+ICsgKiBJZiB5 b3UgYWRkIGNvZGUgdG8gdGhpcyBmaWxlLCBwbGVhc2UgZW5zdXJlIHRoYXQgaXQncyBjb21wYXRp YmxlIHdpdGggdGhlCj4gPj4gKyAqIHN0YXRlZCBleGNlcHRpb24uCj4gPj4gKyAqLwo+ID4+ICsK PiA+PiArI2luY2x1ZGUgImZiZGV2ZHJtX3ByaW1hcnkuaCIKPiA+PiArI2luY2x1ZGUgPGRybS9k cm1fYXRvbWljLmg+Cj4gPj4gKyNpbmNsdWRlIDxkcm0vZHJtX2F0b21pY19oZWxwZXIuaD4KPiA+ PiArI2luY2x1ZGUgPGRybS9kcm1fZm91cmNjLmg+Cj4gPj4gKyNpbmNsdWRlIDxkcm0vZHJtX3Bs YW5lLmg+Cj4gPj4gKyNpbmNsdWRlIDxsaW51eC9mYi5oPgo+ID4+ICsjaW5jbHVkZSAiZmJkZXZk cm1fYm8uaCIKPiA+PiArI2luY2x1ZGUgImZiZGV2ZHJtX2Zvcm1hdC5oIgo+ID4+ICsjaW5jbHVk ZSAiZmJkZXZkcm1fbW9kZXMuaCIKPiA+PiArI2luY2x1ZGUgImZiZGV2ZHJtX21vZGVzZXQuaCIK PiA+PiArCj4gPj4gK3N0YXRpYyBzdHJ1Y3QgZmJkZXZkcm1fbW9kZXNldCogZmJkZXZkcm1fbW9k ZXNldF9vZl9wcmltYXJ5X3BsYW5lKAo+ID4+ICsgICAgICAgc3RydWN0IGRybV9wbGFuZSAqcHJp bWFyeV9wbGFuZSkKPiA+PiArewo+ID4+ICsgICAgICAgcmV0dXJuIGNvbnRhaW5lcl9vZihwcmlt YXJ5X3BsYW5lLCBzdHJ1Y3QgZmJkZXZkcm1fbW9kZXNldCwKPiA+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgcHJpbWFyeV9wbGFuZSk7Cj4gPj4gK30KPiA+PiArCj4gPj4gKy8qCj4gPj4g KyAqIFByaW1hcnkgcGxhbmUKPiA+PiArICovCj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHByaW1h cnlfcGxhbmVfaGVscGVyX3ByZXBhcmVfZmIoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCj4gPj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fcGxh bmVfc3RhdGUgKm5ld19zdGF0ZSkKPiA+PiArewo+ID4+ICsgICAgICAgIHN0cnVjdCBkcm1fZ2Vt X29iamVjdCAqZ2VtOwo+ID4+ICsgICAgICAgIHN0cnVjdCBmYmRldmRybV9ibyAqZmJvOwo+ID4+ ICsgICAgICAgaW50IHJldDsKPiA+PiArCj4gPj4gKyAgICAgICBpZiAoIW5ld19zdGF0ZS0+ZmIp Cj4gPj4gKyAgICAgICAgICAgICAgIHJldHVybiAwOwo+ID4+ICsKPiA+PiArICAgICAgIGdlbSA9 IG5ld19zdGF0ZS0+ZmItPm9ialswXTsKPiA+PiArICAgICAgIGZibyA9IGZiZGV2ZHJtX2JvX29m X2dlbShnZW0pOwo+ID4+ICsKPiA+PiArICAgICAgICByZXQgPSBmYmRldmRybV9ib19waW4oZmJv LCBUVE1fUExfRkxBR19WUkFNKTsKPiA+PiArICAgICAgICBpZiAocmV0KQo+ID4+ICsgICAgICAg ICAgICAgICAgcmV0dXJuIHJldDsKPiA+PiArCj4gPj4gKyAgICAgICByZXR1cm4gMDsKPiA+PiAr fQo+ID4+ICsKPiA+PiArc3RhdGljIHZvaWQgcHJpbWFyeV9wbGFuZV9oZWxwZXJfY2xlYW51cF9m YihzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKPiA+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fcGxhbmVfc3RhdGUgKm9sZF9zdGF0ZSkKPiA+ PiArewo+ID4+ICsgICAgICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtOwo+ID4+ICsgICAg ICAgIHN0cnVjdCBmYmRldmRybV9ibyAqZmJvOwo+ID4+ICsKPiA+PiArICAgICAgIGlmICghb2xk X3N0YXRlLT5mYikKPiA+PiArICAgICAgICAgICAgICAgcmV0dXJuOwo+ID4+ICsKPiA+PiArICAg ICAgIGdlbSA9IG9sZF9zdGF0ZS0+ZmItPm9ialswXTsKPiA+PiArICAgICAgIGZibyA9IGZiZGV2 ZHJtX2JvX29mX2dlbShnZW0pOwo+ID4+ICsKPiA+PiArICAgICAgIGZiZGV2ZHJtX2JvX3VucGlu KGZibyk7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lkIGZiZGV2ZHJtX3VwZGF0ZV9m Yl92YXJfc2NyZWVuaW5mb19mcm9tX2NydGNfc3RhdGUoCj4gPj4gKyAgICAgICBzdHJ1Y3QgZmJf dmFyX3NjcmVlbmluZm8gKmZiX3Zhciwgc3RydWN0IGRybV9jcnRjX3N0YXRlKiBjcnRjX3N0YXRl KQo+ID4+ICt7Cj4gPj4gKyAgICAgICBmYmRldmRybV91cGRhdGVfZmJfdmFyX3NjcmVlbmluZm9f ZnJvbV9tb2RlKGZiX3ZhciwgJmNydGNfc3RhdGUtPmFkanVzdGVkX21vZGUpOwo+ID4+ICt9Cj4g Pj4gKwo+ID4+ICtzdGF0aWMgaW50IHByaW1hcnlfcGxhbmVfaGVscGVyX2F0b21pY19jaGVjayhz dHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKPiA+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlICpzdGF0ZSkKPiA+PiArewo+ ID4+ICsgICAgICAgc3RydWN0IGRybV9jcnRjX3N0YXRlICpuZXdfY3J0Y19zdGF0ZTsKPiA+PiAr ICAgICAgIGludCByZXQ7Cj4gPj4gKyAgICAgICBzdHJ1Y3QgZmJkZXZkcm1fbW9kZXNldCAqbW9k ZXNldDsKPiA+PiArICAgICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBmYl92YXI7Cj4gPj4g Kwo+ID4+ICsgICAgICAgaWYgKCFzdGF0ZS0+Y3J0YykKPiA+PiArICAgICAgICAgICAgICAgcmV0 dXJuIDA7Cj4gPj4gKwo+ID4+ICsgICAgICAgbmV3X2NydGNfc3RhdGUgPSBkcm1fYXRvbWljX2dl dF9uZXdfY3J0Y19zdGF0ZShzdGF0ZS0+c3RhdGUsCj4gPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jcnRjKTsKPiA+PiArICAg ICAgIGlmICghbmV3X2NydGNfc3RhdGUpCj4gPj4gKyAgICAgICAgICAgICAgIHJldHVybiAwOwo+ ID4+ICsKPiA+PiArICAgICAgIHJldCA9IGRybV9hdG9taWNfaGVscGVyX2NoZWNrX3BsYW5lX3N0 YXRlKHN0YXRlLCBuZXdfY3J0Y19zdGF0ZSwKPiA+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgMTYsIDEgPDwgMTYsCj4gPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSk7Cj4g Pj4gKyAgICAgICBpZiAocmV0IDwgMCkgewo+ID4+ICsgICAgICAgICAgICAgICBEUk1fRVJST1Io ImZiZHJtZGV2OiAlczolZCByZXQ9JWQ6XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJldCk7Cj4g Pj4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPj4gKyAgICAgICB9Cj4gPj4gKwo+ID4+ ICsgICAgICAgaWYgKCFzdGF0ZS0+dmlzaWJsZSB8fCAhc3RhdGUtPmZiKQo+ID4+ICsgICAgICAg ICAgICAgICByZXR1cm4gMDsKPiA+PiArCj4gPj4gKyAgICAgICAvKiBWaXJ0dWFsIHNjcmVlbiBz aXplcyBhcmUgbm90IHN1cHBvcnRlZC4KPiA+PiArICAgICAgICAqLwo+ID4+ICsKPiA+PiArICAg ICAgIGlmIChkcm1fcmVjdF93aWR0aCgmc3RhdGUtPmRzdCkgIT0gc3RhdGUtPmZiLT53aWR0aCB8 fAo+ID4+ICsgICAgICAgICAgIGRybV9yZWN0X2hlaWdodCgmc3RhdGUtPmRzdCkgIT0gc3RhdGUt PmZiLT5oZWlnaHQpIHsKPiA+PiArICAgICAgICAgICAgICAgRFJNX0VSUk9SKCJmYmRldmRybTog JXM6JWQ6IHZpcnR1YWwgc2NyZWVuIHNpemVzIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fLCBf X0xJTkVfXyk7Cj4gPj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4+ICsgICAg ICAgfQo+ID4+ICsgICAgICAgaWYgKHN0YXRlLT5kc3QueDEgfHwgc3RhdGUtPmRzdC55MSkgewo+ ID4+ICsgICAgICAgICAgICAgICBEUk1fRVJST1IoImZiZGV2ZHJtOiAlczolZDogdmlydHVhbCBz Y3JlZW4gb2Zmc2V0IG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Cj4gPj4g KyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4+ICsgICAgICAgfQo+ID4+ICsKPiA+ PiArICAgICAgIC8qIFBpeGVsIGZvcm1hdHMgaGF2ZSB0byBiZSBjb21wYXRpYmxlIHdpdGggZmJk ZXYuIFRoaXMgaXMKPiA+PiArICAgICAgICAqIHVzdWFsbHkgc29tZSB2YXJpYXRpb24gb2YgWFJH Qi4KPiA+PiArICAgICAgICAqLwo+ID4+ICsKPiA+PiArICAgICAgIGlmICghcGxhbmUtPnN0YXRl IHx8Cj4gPj4gKyAgICAgICAgICAgIXBsYW5lLT5zdGF0ZS0+ZmIgfHwKPiA+PiArICAgICAgICAg ICBwbGFuZS0+c3RhdGUtPmZiLT5mb3JtYXRbMF0uZm9ybWF0ICE9IHN0YXRlLT5mYi0+Zm9ybWF0 WzBdLmZvcm1hdCkgewo+ID4+ICsKPiA+PiArICAgICAgICAgICAgICAgbW9kZXNldCA9IGZiZGV2 ZHJtX21vZGVzZXRfb2ZfcHJpbWFyeV9wbGFuZShwbGFuZSk7Cj4gPj4gKwo+ID4+ICsgICAgICAg ICAgICAgICBpZiAobW9kZXNldC0+ZmJfaW5mby0+ZmJvcHMtPmZiX2NoZWNrX3Zhcikgewo+ID4+ ICsgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmZmJfdmFyLCAmbW9kZXNldC0+ZmJfaW5m by0+dmFyLAo+ID4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmJfdmFy KSk7Cj4gPj4gKyAgICAgICAgICAgICAgICAgICAgICAgZmJkZXZkcm1fdXBkYXRlX2ZiX3Zhcl9z Y3JlZW5pbmZvX2Zyb21fY3J0Y19zdGF0ZSgKPiA+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICZmYl92YXIsIG5ld19jcnRjX3N0YXRlKTsKPiA+PiArICAgICAgICAgICAgICAgICAg ICAgICBmYmRldmRybV91cGRhdGVfZmJfdmFyX3NjcmVlbmluZm9fZnJvbV9mcmFtZWJ1ZmZlcigK PiA+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYl92YXIsIHN0YXRlLT5mYiwK PiA+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVzZXQtPmZiX2luZm8tPmZp eC5zbWVtX2xlbik7Cj4gPj4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbW9kZXNldC0+ ZmJfaW5mby0+ZmJvcHMtPmZiX2NoZWNrX3ZhcigKPiA+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICZmYl92YXIsIG1vZGVzZXQtPmZiX2luZm8pOwo+ID4+ICsgICAgICAgICAgICAg ICAgICAgICAgIGlmIChyZXQgPCAwKQo+ID4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcmV0dXJuIHJldDsKPiA+PiArICAgICAgICAgICAgICAgfQo+ID4+ICsgICAgICAgfQo+ID4+ ICsKPiA+PiArICAgICAgIHJldHVybiAwOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50 IHNldF9wYWxldHRlX2NtYXAoc3RydWN0IGZiX2luZm8qIGZiX2luZm8pCj4gPj4gK3sKPiA+PiAr ICAgICAgIF9fdTMyIGxlbjsKPiA+PiArICAgICAgIGNvbnN0IHN0cnVjdCBmYl9jbWFwKiBkZWZh dWx0X2NtYXA7Cj4gPj4gKyAgICAgICBzdHJ1Y3QgZmJfY21hcCBjbWFwOwo+ID4+ICsgICAgICAg aW50IHJldDsKPiA+PiArICAgICAgIGNvbnN0IF9fdTMyIGdhbW1hX2xlblszXSA9IHsKPiA+PiAr ICAgICAgICAgICAgICAgZmJfaW5mby0+dmFyLnJlZC5sZW5ndGgsCj4gPj4gKyAgICAgICAgICAg ICAgIGZiX2luZm8tPnZhci5ncmVlbi5sZW5ndGgsCj4gPj4gKyAgICAgICAgICAgICAgIGZiX2lu Zm8tPnZhci5ibHVlLmxlbmd0aAo+ID4+ICsgICAgICAgfTsKPiA+PiArCj4gPj4gKyAgICAgICBs ZW4gPSBtYXgzKGdhbW1hX2xlblswXSwgZ2FtbWFfbGVuWzFdLCBnYW1tYV9sZW5bMl0pOwo+ID4+ ICsgICAgICAgaWYgKCFsZW4gfHwgKGxlbiA+IDMxKSkgewo+ID4+ICsgICAgICAgICAgICAgICBE Uk1fRVJST1IoImZiZGV2ZHJtOiBnYW1tYSBMVVQgaGFzIGludmFsaWQgYml0IGNvdW50Igo+ID4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgIiBvZiAldVxuIiwgKHVuc2lnbmVkIGludClsZW4p Owo+ID4+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPiA+PiArICAgICAgIH0KPiA+ PiArCj4gPj4gKyAgICAgICBkZWZhdWx0X2NtYXAgPSBmYl9kZWZhdWx0X2NtYXAoMXVsIDw8IGxl bik7Cj4gPj4gKyAgICAgICBpZiAoIWRlZmF1bHRfY21hcCkKPiA+PiArICAgICAgICAgICAgICAg cmV0dXJuIC1FSU5WQUw7Cj4gPj4gKwo+ID4+ICsgICAgICAgbWVtc2V0KCZjbWFwLCAwLCBzaXpl b2YoY21hcCkpOwo+ID4+ICsgICAgICAgcmV0ID0gZmJfYWxsb2NfY21hcCgmY21hcCwgZGVmYXVs dF9jbWFwLT5sZW4sIDApOwo+ID4+ICsgICAgICAgaWYgKHJldCkKPiA+PiArICAgICAgICAgICAg ICAgcmV0dXJuIHJldDsKPiA+PiArICAgICAgIHJldCA9IGZiX2NvcHlfY21hcChkZWZhdWx0X2Nt YXAsICZjbWFwKTsKPiA+PiArICAgICAgIGlmIChyZXQpCj4gPj4gKyAgICAgICAgICAgICAgIGdv dG8gZXJyX2ZiX2RlYWxsb2NfY21hcDsKPiA+PiArICAgICAgIHJldCA9IGZiX3NldF9jbWFwKCZj bWFwLCBmYl9pbmZvKTsKPiA+PiArICAgICAgIGlmIChyZXQpCj4gPj4gKyAgICAgICAgICAgICAg IHJldHVybiByZXQ7Cj4gPj4gKyAgICAgICBmYl9kZWFsbG9jX2NtYXAoJmNtYXApOwo+ID4+ICsK PiA+PiArICAgICAgIHJldHVybiAwOwo+ID4+ICsKPiA+PiArZXJyX2ZiX2RlYWxsb2NfY21hcDoK PiA+PiArICAgICAgIGZiX2RlYWxsb2NfY21hcCgmY21hcCk7Cj4gPj4gKyAgICAgICByZXR1cm4g cmV0Owo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHNldF9saW5lYXJfY21hcChzdHJ1 Y3QgZmJfaW5mbyogZmJfaW5mbykKPiA+PiArewo+ID4+ICsgICAgICAgc3RydWN0IGZiX2NtYXAg Y21hcDsKPiA+PiArICAgICAgIGludCByZXQ7Cj4gPj4gKyAgICAgICBzaXplX3QgaTsKPiA+PiAr ICAgICAgIHVuc2lnbmVkIGludCBqOwo+ID4+ICsgICAgICAgdTE2ICpsdXQ7Cj4gPj4gKyAgICAg ICB1MTYgaW5jcjsKPiA+PiArICAgICAgIHUxNiAqZ2FtbWFfbHV0WzNdOwo+ID4+ICsgICAgICAg X191MzIgbGVuOwo+ID4+ICsgICAgICAgY29uc3QgX191MzIgZ2FtbWFfbGVuWzNdID0gewo+ID4+ ICsgICAgICAgICAgICAgICBmYl9pbmZvLT52YXIucmVkLmxlbmd0aCwKPiA+PiArICAgICAgICAg ICAgICAgZmJfaW5mby0+dmFyLmdyZWVuLmxlbmd0aCwKPiA+PiArICAgICAgICAgICAgICAgZmJf aW5mby0+dmFyLmJsdWUubGVuZ3RoCj4gPj4gKyAgICAgICB9Owo+ID4+ICsKPiA+PiArICAgICAg IGxlbiA9IG1heDMoZ2FtbWFfbGVuWzBdLCBnYW1tYV9sZW5bMV0sIGdhbW1hX2xlblsyXSk7Cj4g Pj4gKyAgICAgICBpZiAoIWxlbiB8fCAobGVuID4gOCkpIHsKPiA+PiArICAgICAgICAgICAgICAg RFJNX0VSUk9SKCJmYmRldmRybTogZ2FtbWEgTFVUIGhhcyBpbnZhbGlkIGJpdCBjb3VudCIKPiA+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICIgb2YgJXVcbiIsICh1bnNpZ25lZCBpbnQpbGVu KTsKPiA+PiArICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPj4gKyAgICAgICB9Cj4g Pj4gKwo+ID4+ICsgICAgICAgbWVtc2V0KCZjbWFwLCAwLCBzaXplb2YoY21hcCkpOwo+ID4+ICsg ICAgICAgcmV0ID0gZmJfYWxsb2NfY21hcCgmY21hcCwgMXVsIDw8IGxlbiwgMCk7Cj4gPj4gKyAg ICAgICBpZiAocmV0KQo+ID4+ICsgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4+ICsKPiA+ PiArICAgICAgIGdhbW1hX2x1dFswXSA9IGNtYXAucmVkOwo+ID4+ICsgICAgICAgZ2FtbWFfbHV0 WzFdID0gY21hcC5ncmVlbjsKPiA+PiArICAgICAgIGdhbW1hX2x1dFsyXSA9IGNtYXAuYmx1ZTsK PiA+PiArCj4gPj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShnYW1tYV9sdXQp OyArK2kpIHsKPiA+PiArICAgICAgICAgICAgICAgbHV0ID0gZ2FtbWFfbHV0W2ldOwo+ID4+ICsg ICAgICAgICAgICAgICBsZW4gPSAxdWwgPDwgZ2FtbWFfbGVuW2ldOwo+ID4+ICsgICAgICAgICAg ICAgICBpbmNyID0gMHgxMDAwMHUgPj4gZ2FtbWFfbGVuW2ldOwo+ID4+ICsgICAgICAgICAgICAg ICBmb3IgKGogPSAwOyBqIDwgbGVuOyArK2osICsrbHV0KSB7Cj4gPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgKmx1dCA9IGluY3IgKiBqOwo+ID4+ICsgICAgICAgICAgICAgICB9Cj4gPj4gKyAg ICAgICAgICAgICAgIC8qIEluIG9yZGVyIHRvIGhhdmUgbm8gaW50ZW5zaXR5IGF0IGluZGV4IDAg YW5kIGZ1bGwKPiA+PiArICAgICAgICAgICAgICAgICogaW50ZW5zaXR5IGF0IHRoZSBmaW5hbCBp bmRleCBvZiB0aGUgTFVULCB3ZSBmaXgtdXAgdGhlCj4gPj4gKyAgICAgICAgICAgICAgICAqIHRh YmxlJ3MgZmluYWwgZW50cmllcy4gVGhlIGZpeC11cCBtYWtlcyBpbnRlbnNpdHkgZ3Jvdwo+ID4+ ICsgICAgICAgICAgICAgICAgKiBmYXN0ZXIgbmVhciB0aGUgZmluYWwgZW50cmllcyBvZiB0aGUg Z2FtbWEgTFVULiBUaGUgaHVtYW4KPiA+PiArICAgICAgICAgICAgICAgICogZXllIGlzIG1vcmUg c2Vuc2l0aXZlIHRvIGNoYW5nZXMgdG8gdGhlIGxvd2VyIGludGVuc2l0aWVzLAo+ID4+ICsgICAg ICAgICAgICAgICAgKiBzbyB0aGlzIGlzIHByb2JhYmx5IG5vdCBkaXJlY3RseSBwZXJjZWl2YWJs ZS4KPiA+PiArICAgICAgICAgICAgICAgICovCj4gPj4gKyAgICAgICAgICAgICAgIGZvciAobHV0 IC09IGdhbW1hX2xlbltpXSwgaiA9IGdhbW1hX2xlbltpXTsgaiA+IDA7ICsrbHV0KSB7Cj4gPj4g KyAgICAgICAgICAgICAgICAgICAgICAgLS1qOwo+ID4+ICsgICAgICAgICAgICAgICAgICAgICAg ICpsdXQgKz0gKGluY3IgPj4gaikgLSAxOyAvKiBzdWJ0cmFjdCAxIHRvIG5vdAo+ID4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvdmVyZmxvdyB0 aGUgTFVUJ3MKPiA+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICogZmluYWwgZW50cnkgKi8KPiA+PiArICAgICAgICAgICAgICAgfQo+ID4+ICsgICAg ICAgfQo+ID4+ICsKPiA+PiArICAgICAgIHJldCA9IGZiX3NldF9jbWFwKCZjbWFwLCBmYl9pbmZv KTsKPiA+PiArICAgICAgIGlmIChyZXQpCj4gPj4gKyAgICAgICAgICAgICAgIGdvdG8gZXJyX2Zi X2RlYWxsb2NfY21hcDsKPiA+PiArICAgICAgIGZiX2RlYWxsb2NfY21hcCgmY21hcCk7Cj4gPj4g Kwo+ID4+ICsgICAgICAgcmV0dXJuIDA7Cj4gPj4gKwo+ID4+ICtlcnJfZmJfZGVhbGxvY19jbWFw Ogo+ID4+ICsgICAgICAgZmJfZGVhbGxvY19jbWFwKCZjbWFwKTsKPiA+PiArICAgICAgIHJldHVy biAtRUlOVkFMOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHNldF9jbWFwKHN0cnVj dCBmYl9pbmZvICpmYl9pbmZvKQo+ID4+ICt7Cj4gPj4gKyAgICAgICBpbnQgcmV0ID0gMDsKPiA+ PiArCj4gPj4gKyAgICAgICBzd2l0Y2ggKGZiX2luZm8tPmZpeC52aXN1YWwpIHsKPiA+PiArICAg ICAgIGNhc2UgRkJfVklTVUFMX1BTRVVET0NPTE9SOgo+ID4+ICsgICAgICAgICAgICAgICByZXQg PSBzZXRfcGFsZXR0ZV9jbWFwKGZiX2luZm8pOwo+ID4+ICsgICAgICAgICAgICAgICBicmVhazsK PiA+PiArICAgICAgIGNhc2UgRkJfVklTVUFMX0RJUkVDVENPTE9SOgo+ID4+ICsgICAgICAgICAg ICAgICByZXQgPSBzZXRfbGluZWFyX2NtYXAoZmJfaW5mbyk7Cj4gPj4gKyAgICAgICAgICAgICAg IGJyZWFrOwo+ID4+ICsgICAgICAgZGVmYXVsdDoKPiA+PiArICAgICAgICAgICAgICAgYnJlYWs7 Cj4gPj4gKyAgICAgICB9Cj4gPj4gKwo+ID4+ICsgICAgICAgcmV0dXJuIHJldDsKPiA+PiArfQo+ ID4+ICsKPiA+PiArc3RhdGljIHZvaWQgcHJpbWFyeV9wbGFuZV9oZWxwZXJfYXRvbWljX3VwZGF0 ZSgKPiA+PiArICAgICAgIHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLCBzdHJ1Y3QgZHJtX3BsYW5l X3N0YXRlICpvbGRfc3RhdGUpCj4gPj4gK3sKPiA+PiArICAgICAgIHN0cnVjdCBmYmRldmRybV9t b2Rlc2V0ICptb2Rlc2V0Owo+ID4+ICsgICAgICAgdWludDMyX3QgZm9ybWF0Owo+ID4+ICsgICAg ICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGZiX3ZhcjsKPiA+PiArICAgICAgIGludCByZXQ7 Cj4gPj4gKyAgICAgICAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW07Cj4gPj4gKyAgICAgICAg c3RydWN0IGZiZGV2ZHJtX2JvICpmYm87Cj4gPj4gKyAgICAgICBfX3UzMiBsaW5lX2xlbmd0aDsK PiA+PiArICAgICAgIHVpbnQ2NF90IHlvZmZzZXQ7Cj4gPj4gKyAgICAgICB1aW50MzJfdCB4b2Zm c2V0Owo+ID4+ICsKPiA+PiArICAgICAgIG1vZGVzZXQgPSBmYmRldmRybV9tb2Rlc2V0X29mX3By aW1hcnlfcGxhbmUocGxhbmUpOwo+ID4+ICsKPiA+PiArICAgICAgIGZvcm1hdCA9IGZiZGV2ZHJt X2Zvcm1hdF9vZl9mYl9pbmZvKG1vZGVzZXQtPmZiX2luZm8pOwo+ID4+ICsKPiA+PiArICAgICAg IC8qIERSTSBwb3J0aW5nIG5vdGVzOiBTb21lIGZiZGV2IGRyaXZlcnMgcmVwb3J0IGFscGhhIGNo YW5uZWxzIGZvcgo+ID4+ICsgICAgICAgICogdGhlaXIgZnJhbWVidWZmZXIsIGV2ZW4gdGhvdWdo IHRoZXkgZG9uJ3Qgc3VwcG9ydCB0cmFuc3BhcmVudAo+ID4+ICsgICAgICAgICogcHJpbWFyeSBw bGFuZXMuIEZvciB0aGUgZm9ybWF0IHRlc3QgYmVsb3csIHdlIGlnbm9yZSB0aGUgYWxwaGEKPiA+ PiArICAgICAgICAqIGNoYW5uZWwgYW5kIHVzZSB0aGUgbm9uLXRyYW5zcGFyZW50IGVxdWl2YWxl bnQgb2YgdGhlIHBpeGVsIGZvcm1hdC4KPiA+PiArICAgICAgICAqIElmIHlvdSdyZSBwb3J0aW5n IGFuIGZiZGV2IGRyaXZlciB0byBEUk0sIHJlbW92ZSB0aGlzIHN3aXRjaAo+ID4+ICsgICAgICAg ICogc3RhdGVtZW50IGFuZCByZXBvcnQgdGhlIGNvcnJlY3QgZm9ybWF0IGluc3RlYWQuCj4gPj4g KyAgICAgICAgKi8KPiA+PiArICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7Cj4gPj4gKyAgICAgICBj YXNlIERSTV9GT1JNQVRfQVJHQjg4ODg6Cj4gPj4gKyAgICAgICAgICAgICAgIGZvcm1hdCA9IERS TV9GT1JNQVRfWFJHQjg4ODg7Cj4gPj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ID4+ICsgICAg ICAgY2FzZSBEUk1fRk9STUFUX0FCR1I4ODg4Ogo+ID4+ICsgICAgICAgICAgICAgICBmb3JtYXQg PSBEUk1fRk9STUFUX1hCR1I4ODg4Owo+ID4+ICsgICAgICAgICAgICAgICBicmVhazsKPiA+PiAr ICAgICAgIGNhc2UgRFJNX0ZPUk1BVF9SR0JBODg4ODoKPiA+PiArICAgICAgICAgICAgICAgZm9y bWF0ID0gRFJNX0ZPUk1BVF9SR0JYODg4ODsKPiA+PiArICAgICAgICAgICAgICAgYnJlYWs7Cj4g Pj4gKyAgICAgICBjYXNlIERSTV9GT1JNQVRfQkdSQTg4ODg6Cj4gPj4gKyAgICAgICAgICAgICAg IGZvcm1hdCA9IERSTV9GT1JNQVRfQkdSWDg4ODg7Cj4gPj4gKyAgICAgICAgICAgICAgIGJyZWFr Owo+ID4+ICsgICAgICAgZGVmYXVsdDoKPiA+PiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gPj4g KyAgICAgICB9Cj4gPj4gKwo+ID4+ICsgICAgICAgaWYgKChmb3JtYXQgIT0gcGxhbmUtPnN0YXRl LT5mYi0+Zm9ybWF0WzBdLmZvcm1hdCkgfHwKPiA+PiArICAgICAgICAgICAobW9kZXNldC0+ZmJf aW5mby0+dmFyLnhyZXNfdmlydHVhbCAhPSBwbGFuZS0+c3RhdGUtPmZiLT53aWR0aCkpIHsKPiA+ PiArCj4gPj4gKyAgICAgICAgICAgICAgIC8qIFBpeGVsIGZvcm1hdCBjaGFuZ2VkLCB1cGRhdGUg ZmJfaW5mbyBhY2NvcmRpbmdseQo+ID4+ICsgICAgICAgICAgICAgICAgKi8KPiA+PiArCj4gPj4g KyAgICAgICAgICAgICAgIG1lbWNweSgmZmJfdmFyLCAmbW9kZXNldC0+ZmJfaW5mby0+dmFyLCBz aXplb2YoZmJfdmFyKSk7Cj4gPj4gKyAgICAgICAgICAgICAgIHJldCA9IGZiZGV2ZHJtX3VwZGF0 ZV9mYl92YXJfc2NyZWVuaW5mb19mcm9tX2ZyYW1lYnVmZmVyKAo+ID4+ICsgICAgICAgICAgICAg ICAgICAgICAgICZmYl92YXIsIHBsYW5lLT5zdGF0ZS0+ZmIsCj4gPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgbW9kZXNldC0+ZmJfaW5mby0+Zml4LnNtZW1fbGVuKTsKPiA+PiArICAgICAgICAg ICAgICAgaWYgKHJldCkKPiA+PiArICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Cj4gPj4g Kwo+ID4+ICsgICAgICAgICAgICAgICBmYl92YXIuYWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1c7 Cj4gPj4gKwo+ID4+ICsgICAgICAgICAgICAgICByZXQgPSBmYl9zZXRfdmFyKG1vZGVzZXQtPmZi X2luZm8sICZmYl92YXIpOwo+ID4+ICsgICAgICAgICAgICAgICBpZiAocmV0KSB7Cj4gPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgRFJNX0VSUk9SKCJmYmRldmRybTogZmJfc2V0X3ZhcigpIGZh aWxlZDogJWRcbiIsIHJldCk7Cj4gPj4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwo+ ID4+ICsgICAgICAgICAgICAgICB9Cj4gPj4gKyAgICAgICB9Cj4gPj4gKwo+ID4+ICsgICAgICAg aWYgKCFvbGRfc3RhdGUtPmZiIHx8IC8qIGZpcnN0LXRpbWUgdXBkYXRlICovCj4gPj4gKyAgICAg ICAgICAgKGZvcm1hdCAhPSBwbGFuZS0+c3RhdGUtPmZiLT5mb3JtYXRbMF0uZm9ybWF0KSkgewo+ ID4+ICsKPiA+PiArICAgICAgICAgICAgICAgLyogRFJNIHBvcnRpbmcgbm90ZXM6IEJlbG93IHdl IHNldCB0aGUgTFVUcyBmb3IgcGFsZXR0ZSBhbmQKPiA+PiArICAgICAgICAgICAgICAgICogZ2Ft bWEgY29ycmVjdGlvbi4gVGhpcyBpcyByZXF1aXJlZCBieSBzb21lIGZiZGV2IGRyaXZlcnMsCj4g Pj4gKyAgICAgICAgICAgICAgICAqIHN1Y2ggYXMgbnZpZGlhZmIgYW5kIGF0eWZiLCB3aGljaCBk b24ndCBpbml0aWFsaXplIHRoZQo+ID4+ICsgICAgICAgICAgICAgICAgKiB0YWJsZSB0byBwYXNz LXRocm91Z2ggdGhlIGZyYW1lYnVmZmVyIHZhbHVlcyB1bmNoYW5nZWQuIFRoaXMKPiA+PiArICAg ICAgICAgICAgICAgICogaXMgYWN0dWFsbHkgQ1JUQyBzdGF0ZSwgYnV0IHRoZSByZXNwZWN0aXZl IGZ1bmN0aW9uCj4gPj4gKyAgICAgICAgICAgICAgICAqIGNydGNfaGVscGVyX21vZGVfc2V0X25v ZmIoKSBpcyBvbmx5IGNhbGxlZCB3aGVuIGEgQ1JUQwo+ID4+ICsgICAgICAgICAgICAgICAgKiBw cm9wZXJ0eSBjaGFuZ2VzLCBjaGFuZ2VzIGluIGNvbG9yIGZvcm1hdHMgYXJlIG5vdCBoYW5kbGVk Cj4gPj4gKyAgICAgICAgICAgICAgICAqIHRoZXJlLiBXaGVuIHlvdSdyZSBwb3J0aW5nIGEgZmJk ZXYgZHJpdmVyIHRvIERSTSwgcmVtb3ZlCj4gPj4gKyAgICAgICAgICAgICAgICAqIHRoZSBjYWxs LiBHYW1tYSBMVVRzIGFyZSBDUlRDIHByb3BlcnRpZXMgYW5kIHNob3VsZCBiZQo+ID4+ICsgICAg ICAgICAgICAgICAgKiBoYW5kbGVkIHRoZXJlLiBFaXRoZXIgcmVtb3ZlIGdhbW1hIGNvcnJlY3Rp b24gb3Igc2V0IHVwCj4gPj4gKyAgICAgICAgICAgICAgICAqIHRoZSByZXNwZWN0aXZlIENSVEMg cHJvcGVydGllcyBmb3IgdXNlcnNwYWNlLgo+ID4+ICsgICAgICAgICAgICAgICAgKi8KPiA+PiAr ICAgICAgICAgICAgICAgc2V0X2NtYXAobW9kZXNldC0+ZmJfaW5mbyk7Cj4gPj4gKyAgICAgICB9 Cj4gPj4gKwo+ID4+ICsgICAgICAgLyogV2l0aCB0aGUgZmIgaW50ZXJmYWNlLCB3ZSBjYW5ub3Qg ZGlyZWN0bHkgcHJvZ3JhbQo+ID4+ICsgICAgICAgICogdGhlIHNjYW5vdXQgYnVmZmVyJ3MgYWRk cmVzcy4gSW5zdGVhZCB3ZSB1c2UgdGhlCj4gPj4gKyAgICAgICAgKiBwYW5uaW5nIGZ1bmN0aW9u IHRvIHBvaW50IHRoZSBncmFwaGljcyBjYXJkIHRvIHRoZQo+ID4+ICsgICAgICAgICogYnVmZmVy J3MgbG9jYXRpb24uCj4gPj4gKyAgICAgICAgKi8KPiA+PiArCj4gPj4gKyAgICAgICBnZW0gPSBw bGFuZS0+c3RhdGUtPmZiLT5vYmpbMF07Cj4gPj4gKyAgICAgICBmYm8gPSBmYmRldmRybV9ib19v Zl9nZW0oZ2VtKTsKPiA+PiArCj4gPj4gKyAgICAgICBsaW5lX2xlbmd0aCA9IHBsYW5lLT5zdGF0 ZS0+ZmItPnBpdGNoZXNbMF07Cj4gPj4gKyAgICAgICB5b2Zmc2V0ID0gZmJvLT5iby5vZmZzZXQ7 Cj4gPj4gKyAgICAgICB4b2Zmc2V0ID0gZG9fZGl2KHlvZmZzZXQsIGxpbmVfbGVuZ3RoKTsKPiA+ PiArICAgICAgIGlmICh5b2Zmc2V0ID4gKF9fdTMyKS0xKSB7Cj4gPj4gKyAgICAgICAgICAgICAg IC8qIFRoZSB2YWx1ZSBvZiB5b2Zmc2V0IGRvZXNuJ3QgZml0IGludG8gYSAzMi1iaXQgdmFsdWUs Cj4gPj4gKyAgICAgICAgICAgICAgICAqIHNvIHdlIGNhbm5vdCB1c2UgaXQgZm9yIGRpc3BsYXkg cGFubmluZy4gRWl0aGVyIHRoZQo+ID4+ICsgICAgICAgICAgICAgICAgKiBncmFwaGljcyBjYXJk IGhhcyBHaUJzIG9mIFZSQU0gb3IgdGhpcyBpcyBhIGJ1ZyB3aXRoCj4gPj4gKyAgICAgICAgICAg ICAgICAqIG1lbW9yeSBtYW5hZ2VtZW50LiAqLwo+ID4+ICsgICAgICAgICAgICAgICBEUk1fRVJS T1IoImZiZGV2ZHJtOiBidWZmZXIgb2JqZWN0IGlzIG5vdCBhbGlnbmVkIHRvIGEgIgo+ID4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIG9mIHRoZSBzY2FubGluZSBzaXplLlxu Iik7Cj4gPj4gKyAgICAgICAgICAgICAgIHJldHVybjsKPiA+PiArICAgICAgIH0gZWxzZSBpZiAo eG9mZnNldCkgewo+ID4+ICsgICAgICAgICAgICAgICAvKiBUaGUgYnVmZmVyIHN0YXJ0cyBpbiB0 aGUgbWlkZGxlIG9mIGEgc2NhbmxpbmUuIFRoZQo+ID4+ICsgICAgICAgICAgICAgICAgKiBtZW1v cnkgbWFuYWdlciBzaG91bGQgaGF2ZSBwcmV2ZW50ZWQgdGhpcy4gVGhpcwo+ID4+ICsgICAgICAg ICAgICAgICAgKiBwcm9ibGVtIGluZGljYXRlcyBhIGJ1ZyB3aXRoIHRoZSBidWZmZXIgYWxpZ25p bmcuICovCj4gPj4gKyAgICAgICAgICAgICAgIERSTV9FUlJPUigiZmJkZXZkcm06IGJ1ZmZlciBv YmplY3QgaXMgbm90IGFsaWduZWQgdG8gYSAiCj4gPj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAibXVsdGlwbGUgb2YgdGhlIHNjYW5saW5lIHNpemUuXG4iKTsKPiA+PiArICAgICAgICAgICAg ICAgcmV0dXJuOwo+ID4+ICsgICAgICAgfQo+ID4+ICsKPiA+PiArICAgICAgIG1lbWNweSgmZmJf dmFyLCAmbW9kZXNldC0+ZmJfaW5mby0+dmFyLCBzaXplb2YoZmJfdmFyKSk7Cj4gPj4gKyAgICAg ICBmYl92YXIueG9mZnNldCA9IHhvZmZzZXQ7Cj4gPj4gKyAgICAgICBmYl92YXIueW9mZnNldCA9 IHlvZmZzZXQ7Cj4gPj4gKwo+ID4+ICsgICAgICAgcmV0ID0gZmJfcGFuX2Rpc3BsYXkobW9kZXNl dC0+ZmJfaW5mbywgJmZiX3Zhcik7Cj4gPj4gKyAgICAgICBpZiAocmV0KSB7Cj4gPj4gKyAgICAg ICAgICAgICAgIERSTV9FUlJPUigiZmJkZXZkcm06IGZiX3Bhbl9kaXNwbGF5KCkgZmFpbGVkOiAl ZFxuIiwgcmV0KTsKPiA+PiArICAgICAgICAgICAgICAgcmV0dXJuOwo+ID4+ICsgICAgICAgfQo+ ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9pZCBwcmltYXJ5X3BsYW5lX2hlbHBlcl9hdG9t aWNfZGlzYWJsZSgKPiA+PiArICAgICAgIHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLCBzdHJ1Y3Qg ZHJtX3BsYW5lX3N0YXRlICpvbGRfc3RhdGUpCj4gPj4gK3sgfQo+ID4+ICsKPiA+PiArc3RhdGlj IGludCBwcmltYXJ5X3BsYW5lX2hlbHBlcl9hdG9taWNfYXN5bmNfY2hlY2soCj4gPj4gKyAgICAg ICBzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwgc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqc3RhdGUp Cj4gPj4gK3sKPiA+PiArICAgICAgIHJldHVybiAwOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0 aWMgdm9pZCBwcmltYXJ5X3BsYW5lX2hlbHBlcl9hdG9taWNfYXN5bmNfdXBkYXRlKAo+ID4+ICsg ICAgICAgc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsIHN0cnVjdCBkcm1fcGxhbmVfc3RhdGUgKm5l d19zdGF0ZSkKPiA+PiArewo+ID4+ICsgICAgICAgZHJtX3BsYW5lX2NsZWFudXAocGxhbmUpOwo+ ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wbGFuZV9oZWxwZXJf ZnVuY3MgcHJpbWFyeV9wbGFuZV9oZWxwZXJfZnVuY3MgPSB7Cj4gPj4gKyAgICAgICAucHJlcGFy ZV9mYiA9IHByaW1hcnlfcGxhbmVfaGVscGVyX3ByZXBhcmVfZmIsCj4gPj4gKyAgICAgICAuY2xl YW51cF9mYiA9IHByaW1hcnlfcGxhbmVfaGVscGVyX2NsZWFudXBfZmIsCj4gPj4gKyAgICAgICAu YXRvbWljX2NoZWNrID0gcHJpbWFyeV9wbGFuZV9oZWxwZXJfYXRvbWljX2NoZWNrLAo+ID4+ICsg ICAgICAgLmF0b21pY191cGRhdGUgPSBwcmltYXJ5X3BsYW5lX2hlbHBlcl9hdG9taWNfdXBkYXRl LAo+ID4+ICsgICAgICAgLmF0b21pY19kaXNhYmxlID0gcHJpbWFyeV9wbGFuZV9oZWxwZXJfYXRv bWljX2Rpc2FibGUsCj4gPj4gKyAgICAgICAuYXRvbWljX2FzeW5jX2NoZWNrID0gcHJpbWFyeV9w bGFuZV9oZWxwZXJfYXRvbWljX2FzeW5jX2NoZWNrLAo+ID4+ICsgICAgICAgLmF0b21pY19hc3lu Y191cGRhdGUgPSBwcmltYXJ5X3BsYW5lX2hlbHBlcl9hdG9taWNfYXN5bmNfdXBkYXRlCj4gPj4g K307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9pZCBwcmltYXJ5X3BsYW5lX2Rlc3Ryb3koc3RydWN0 IGRybV9wbGFuZSAqcGxhbmUpCj4gPj4gK3sKPiA+PiArICAgICAgIGRybV9wbGFuZV9jbGVhbnVw KHBsYW5lKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcGxh bmVfZnVuY3MgcHJpbWFyeV9wbGFuZV9mdW5jcyA9IHsKPiA+PiArICAgICAgIC51cGRhdGVfcGxh bmUgPSBkcm1fYXRvbWljX2hlbHBlcl91cGRhdGVfcGxhbmUsCj4gPj4gKyAgICAgICAuZGlzYWJs ZV9wbGFuZSA9IGRybV9hdG9taWNfaGVscGVyX2Rpc2FibGVfcGxhbmUsCj4gPj4gKyAgICAgICAu ZGVzdHJveSA9IHByaW1hcnlfcGxhbmVfZGVzdHJveSwKPiA+PiArICAgICAgIC5yZXNldCA9IGRy bV9hdG9taWNfaGVscGVyX3BsYW5lX3Jlc2V0LAo+ID4+ICsgICAgICAgLnNldF9wcm9wZXJ0eSA9 IE5VTEwsIC8qIHVudXNlZCAqLwo+ID4+ICsgICAgICAgLmF0b21pY19kdXBsaWNhdGVfc3RhdGUg PSBkcm1fYXRvbWljX2hlbHBlcl9wbGFuZV9kdXBsaWNhdGVfc3RhdGUsCj4gPj4gKyAgICAgICAu YXRvbWljX2Rlc3Ryb3lfc3RhdGUgPSBkcm1fYXRvbWljX2hlbHBlcl9wbGFuZV9kZXN0cm95X3N0 YXRlLAo+ID4+ICsgICAgICAgLmF0b21pY19zZXRfcHJvcGVydHkgPSBOVUxMLCAvKiB1bnVzZWQg Ki8KPiA+PiArICAgICAgIC5hdG9taWNfZ2V0X3Byb3BlcnR5ID0gTlVMTCwgLyogdW51c2VkICov Cj4gPj4gKyAgICAgICAubGF0ZV9yZWdpc3RlciA9IE5VTEwsIC8qIHVudXNlZCAqLwo+ID4+ICsg ICAgICAgLmVhcmx5X3VucmVnaXN0ZXIgPSBOVUxMLCAvKiB1bnVzZWQgKi8KPiA+PiArICAgICAg IC5hdG9taWNfcHJpbnRfc3RhdGUgPSBOVUxMLCAvKiB1bnVzZWQgKi8KPiA+PiArICAgICAgIC5m b3JtYXRfbW9kX3N1cHBvcnRlZCA9IE5VTEwgLyogdW51c2VkICovCj4gPj4gK307Cj4gPj4gKwo+ ID4+ICtzdGF0aWMgY29uc3QgdWludDMyX3QqCj4gPj4gK2Zvcm1hdHNfZnJvbV9mYl9pbmZvKGNv bnN0IHN0cnVjdCBmYl9pbmZvKiBmYl9pbmZvLCB1bnNpZ25lZCBpbnQqIGZvcm1hdF9jb3VudCkK PiA+PiArewo+ID4+ICsgICAgICAgLyogVE9ETzogRGV0ZWN0IHRoZSBhY3R1YWxseSBzdXBwb3J0 ZWQgZm9ybWF0cyBvciBoYXZlIHNvbWUKPiA+PiArICAgICAgICAqICAgICAgIHNvcnQgb2Ygd2hp dGVsaXN0IGZvciBrbm93biBoYXJkd2FyZSBkZXZpY2VzLgo+ID4+ICsgICAgICAgICovCj4gPj4g KyAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgZm9ybWF0c1tdID0gewo+ID4+ICsgICAgICAg ICAgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAo+ID4+ICsgICAgICAgICAgICAgICBEUk1fRk9S TUFUX1JHQjU2NQo+ID4+ICsgICAgICAgfTsKPiA+PiArCj4gPj4gKyAgICAgICAqZm9ybWF0X2Nv dW50ID0gQVJSQVlfU0laRShmb3JtYXRzKTsKPiA+PiArCj4gPj4gKyAgICAgICByZXR1cm4gZm9y bWF0czsKPiA+PiArfQo+ID4+ICsKPiA+PiAraW50IGZiZGV2ZHJtX2luaXRfcHJpbWFyeV9wbGFu ZV9mcm9tX2ZiX2luZm8oc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCj4gPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9kZXZpY2UgKmRldiwK PiA+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJf dCBwb3NzaWJsZV9jcnRjcywKPiA+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbykKPiA+PiArewo+ID4+ICsgICAgICAg dWludDMyX3QgY3VyX2Zvcm1hdDsKPiA+PiArICAgICAgIGNvbnN0IHVpbnQzMl90KiBmb3JtYXQ7 Cj4gPj4gKyAgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0X2NvdW50Owo+ID4+ICsgICAgICAgaW50 IHJldDsKPiA+PiArCj4gPj4gKyAgICAgICAvKiBXZSBmaXJzdCB0cnkgdG8gZmluZCB0aGUgc3Vw cG9ydGVkIHBpeGVsIGZvcm1hdHMgZnJvbSB0aGUKPiA+PiArICAgICAgICAqIGZiX2luZm8ncyBo YXJkd2FyZSBzZXR0aW5ncy4gSWYgdGhhdCBmYWlscywgd2UgdGFrZSB0aGUKPiA+PiArICAgICAg ICAqIGN1cnJlbnQgc2V0dGluZ3MuICovCj4gPj4gKyAgICAgICBmb3JtYXQgPSBmb3JtYXRzX2Zy b21fZmJfaW5mbyhmYl9pbmZvLCAmZm9ybWF0X2NvdW50KTsKPiA+PiArICAgICAgIGlmICghZm9y bWF0X2NvdW50KSB7Cj4gPj4gKyAgICAgICAgICAgICAgIGN1cl9mb3JtYXQgPSBmYmRldmRybV9m b3JtYXRfb2ZfZmJfaW5mbyhmYl9pbmZvKTsKPiA+PiArICAgICAgICAgICAgICAgZm9ybWF0ID0g JmN1cl9mb3JtYXQ7Cj4gPj4gKyAgICAgICAgICAgICAgIGZvcm1hdF9jb3VudCA9IDE7Cj4gPj4g KyAgICAgICB9Cj4gPj4gKyAgICAgICBpZiAoIWZvcm1hdF9jb3VudCkKPiA+PiArICAgICAgICAg ICAgICAgcmV0dXJuIC1FTk9ERVY7Cj4gPj4gKwo+ID4+ICsgICAgICAgcmV0ID0gZHJtX3VuaXZl cnNhbF9wbGFuZV9pbml0KGRldiwgcGxhbmUsIHBvc3NpYmxlX2NydGNzLAo+ID4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJ5X3BsYW5lX2Z1bmNzLAo+ID4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZm9ybWF0X2Nv dW50LAo+ID4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIERS TV9QTEFORV9UWVBFX1BSSU1BUlksIE5VTEwpOwo+ID4+ICsgICAgICAgaWYgKHJldCA8IDApCj4g Pj4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPj4gKyAgICAgICBkcm1fcGxhbmVfaGVs cGVyX2FkZChwbGFuZSwgJnByaW1hcnlfcGxhbmVfaGVscGVyX2Z1bmNzKTsKPiA+PiArCj4gPj4g KyAgICAgICByZXQgPSBkcm1fcGxhbmVfY3JlYXRlX3JvdGF0aW9uX3Byb3BlcnR5KHBsYW5lLCBE Uk1fTU9ERV9ST1RBVEVfMCwKPiA+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgRFJNX01PREVfUk9UQVRFXzApOwo+ID4+ICsgICAgICAgaWYgKHJldCA8 IDApCj4gPj4gKyAgICAgICAgICAgICAgIGdvdG8gZXJyX2RybV9wbGFuZV9jbGVhbnVwOwo+ID4+ ICsKPiA+PiArICAgICAgIHJldCA9IGRybV9wbGFuZV9jcmVhdGVfenBvc19pbW11dGFibGVfcHJv cGVydHkocGxhbmUsIDApOwo+ID4+ICsgICAgICAgaWYgKHJldCA8IDApCj4gPj4gKyAgICAgICAg ICAgICAgIGdvdG8gZXJyX2RybV9wbGFuZV9jbGVhbnVwOwo+ID4+ICsKPiA+PiArICAgICAgIHJl dHVybiAwOwo+ID4+ICsKPiA+PiArZXJyX2RybV9wbGFuZV9jbGVhbnVwOgo+ID4+ICsgICAgICAg ZHJtX3BsYW5lX2NsZWFudXAocGxhbmUpOwo+ID4+ICsgICAgICAgcmV0dXJuIHJldDsKPiA+PiAr fQo+ID4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZmJkZXZkcm0vZmJkZXZkcm1fcHJp bWFyeS5oIGIvZHJpdmVycy9ncHUvZHJtL2ZiZGV2ZHJtL2ZiZGV2ZHJtX3ByaW1hcnkuaAo+ID4+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPj4gaW5kZXggMDAwMDAwMDAwMDAwLi41MjljMjcyYzZl MGIKPiA+PiAtLS0gL2Rldi9udWxsCj4gPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2ZiZGV2ZHJt L2ZiZGV2ZHJtX3ByaW1hcnkuaAo+ID4+IEBAIC0wLDAgKzEsMjcgQEAKPiA+PiArLyogU1BEWC1M aWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIKPiA+PiArICoKPiA+PiArICogT25l IHB1cnBvc2Ugb2YgdGhpcyBkcml2ZXIgaXMgdG8gYWxsb3cgZm9yIGVhc3kgY29udmVyc2lvbiBv ZiBmcmFtZWJ1ZmZlcgo+ID4+ICsgKiBkcml2ZXJzIHRvIERSTS4gQXMgYSBzcGVjaWFsIGV4Y2Vw dGlvbiB0byB0aGUgR05VIEdQTCwgeW91IGFyZSBhbGxvd2VkIHRvCj4gPj4gKyAqIHJlbGljZW5z ZSB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIGEgbGljZW5zZSBvZiB5b3VyIGNob2ljZSBp ZiB5b3UncmUKPiA+PiArICogcG9ydGluZyBhIGZyYW1lYnVmZmVyIGRyaXZlci4gSW4gb3JkZXIg dG8gZG8gc28sIHVwZGF0ZSB0aGUgU1BEWCBsaWNlbnNlCj4gPj4gKyAqIGlkZW50aWZpZXIgdG8g dGhlIG5ldyBsaWNlbnNlIGFuZCByZW1vdmUgdGhpcyBleGNlcHRpb24uCj4gPj4gKyAqCj4gPj4g KyAqIElmIHlvdSBhZGQgY29kZSB0byB0aGlzIGZpbGUsIHBsZWFzZSBlbnN1cmUgdGhhdCBpdCdz IGNvbXBhdGlibGUgd2l0aCB0aGUKPiA+PiArICogc3RhdGVkIGV4Y2VwdGlvbi4KPiA+PiArICov Cj4gPj4gKwo+ID4+ICsjaWZuZGVmIEZCREVWRFJNX1BSSU1BUllfSAo+ID4+ICsjZGVmaW5lIEZC REVWRFJNX1BSSU1BUllfSAo+ID4+ICsKPiA+PiArI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cj4g Pj4gKwo+ID4+ICtzdHJ1Y3QgZHJtX2RldmljZTsKPiA+PiArc3RydWN0IGRybV9wbGFuZTsKPiA+ PiArc3RydWN0IGZiX2luZm87Cj4gPj4gKwo+ID4+ICtpbnQgZmJkZXZkcm1faW5pdF9wcmltYXJ5 X3BsYW5lX2Zyb21fZmJfaW5mbyhzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKPiA+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2LAo+ID4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVp bnQzMl90IHBvc3NpYmxlX2NydGNzLAo+ID4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKTsKPiA+PiArCj4gPj4gKyNl bmRpZgo+ID4+IC0tCj4gPj4gMi4yMS4wCj4gPj4KPiA+IF9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCj4gPiBkcmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4gPiBk cmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gPiBodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo+ID4KPgo+IC0tCj4gVGhvbWFzIFpp bW1lcm1hbm4KPiBHcmFwaGljcyBEcml2ZXIgRGV2ZWxvcGVyCj4gU1VTRSBMaW51eCBHbWJILCBN YXhmZWxkc3RyYXNzZSA1LCA5MDQwOSBOdWVybmJlcmcsIEdlcm1hbnkKPiBHRjogRmVsaXggSW1l bmTDtnJmZmVyLCBNYXJ5IEhpZ2dpbnMsIFNyaSBSYXNpYWgKPiBIUkIgMjEyODQgKEFHIE7DvHJu YmVyZykKPgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpk cmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWw=