Skip to content

mailbox.c mapmem needs to adjust size to allow for offset in call to mmap #408

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
steverpalmer opened this issue Jul 14, 2017 · 4 comments
Closed

Comments

@steverpalmer
Copy link

Hi,
I, like many others, have copied mailbox.c into my own projects to allow access to various features. The function mapmem correctly adjusts the value of base (by an amount offset) downwards to put it onto a page boundary. It also correctly adjusts the address returned by the same offset upwards. However, it should correspondingly adjust the value of size (upwards) so that the memory returned will include the memory identified in the original call parameters. In short, after base = base - offset;, there should be a size = size + offset;
Also, similar adjustments are required in the function unmapmem.
Thanks,
Steve

@popcornmix
Copy link
Contributor

I assume you are talking about mailbox.c in hello_fft?
I think for hello_fft the offset will always be zero.

Looking at the code the unmap won't work when offset is not zero (the address to pass to unmap will not be as expected).

I think this can only be solved by changing the API.
E.g. return address is actual mmap-ed buffer (4K aligned) and a separate offset is returned.

Or, make mapmem only accept 4K aligned addresses - return fail when offset != 0.
The calling code can always handle the offset for non-aligned blocks.

@steverpalmer
Copy link
Author

steverpalmer commented Jul 14, 2017

Yes, I do mean mailbox.c in hello_fft.
Yes, I think that in hello_fft the offset will always be zero.
I tweaked unmapmem as follows:

   const intptr_t offset = (intptr_t)addr % PAGE_SIZE;
   addr = (char *)addr - offset;
   size = size + offset;
   int s = munmap(addr, size);

(ugly, but I think it will work as the "reverse" of what is done in mapmem (including my size adjustment)).
Or the API could be changed as you suggest. In any case, although not apparent in hello_fft, I would still suggest that mapmem is wrong to adjust the base without adjusting size. It feels like it goes half way towards providing a feature.
Or perhaps there is some other file/module/library that I should be using to do this kind of mapping?
Cheers,
Steve

@popcornmix
Copy link
Contributor

Yes, I think that code is safe. The value returned from mmap will be 4K aligned, so the offset can be extracted from that.

As the current code looks like it handles non-zero offsets but doesn't then I'm happy to fix it up with your suggested change. It may save someone else some head scratching.

Added to internal repo - will appear in firmware/userland on next firmware build.

popcornmix added a commit to raspberrypi/firmware that referenced this issue Jul 21, 2017
…llback

See: raspberrypi/userland#390

firmware: RIL null_sink: Support MMAL opaque input
See: raspberrypi/userland#388

firmware: arm_display: Avoid hang when display_rotate is used with vc4-kms-v3d driver
See: guysoft/FullPageOS#137

firmware: 2ndstage: Fix printing of zero as a decimal in uart_printf

firmware: cdi_camera: Allow GPIO control on FS and FE events

firmware: IL ISP: Add option to alter the shift in the output stage
firmware: IL ISP: Add option for adjusting the input CCM
firmware: vc_image: fix size calcs for YUV_UV_16
firmware: vc_image_helper: Add YUV 16 bit formats to second header
firmware: isp: Avoid setting vpitch in YUVUV16 cases
firmware: isp: Handle 16 bit yuv in ip_is_supported_format

firmware: hello_fft: Fixup offset calculation when mapping/unmapping buffers
See: raspberrypi/userland#408
popcornmix added a commit to raspberrypi/firmware that referenced this issue Jul 21, 2017
…llback

See: raspberrypi/userland#390

firmware: RIL null_sink: Support MMAL opaque input
See: raspberrypi/userland#388

firmware: arm_display: Avoid hang when display_rotate is used with vc4-kms-v3d driver
See: guysoft/FullPageOS#137

firmware: 2ndstage: Fix printing of zero as a decimal in uart_printf

firmware: cdi_camera: Allow GPIO control on FS and FE events

firmware: IL ISP: Add option to alter the shift in the output stage
firmware: IL ISP: Add option for adjusting the input CCM
firmware: vc_image: fix size calcs for YUV_UV_16
firmware: vc_image_helper: Add YUV 16 bit formats to second header
firmware: isp: Avoid setting vpitch in YUVUV16 cases
firmware: isp: Handle 16 bit yuv in ip_is_supported_format

firmware: hello_fft: Fixup offset calculation when mapping/unmapping buffers
See: raspberrypi/userland#408
popcornmix added a commit to raspberrypi/firmware that referenced this issue Jul 21, 2017
…llback

See: raspberrypi/userland#390

firmware: RIL null_sink: Support MMAL opaque input
See: raspberrypi/userland#388

firmware: arm_display: Avoid hang when display_rotate is used with vc4-kms-v3d driver
See: guysoft/FullPageOS#137

firmware: 2ndstage: Fix printing of zero as a decimal in uart_printf

firmware: cdi_camera: Allow GPIO control on FS and FE events

firmware: IL ISP: Add option to alter the shift in the output stage
firmware: IL ISP: Add option for adjusting the input CCM
firmware: vc_image: fix size calcs for YUV_UV_16
firmware: vc_image_helper: Add YUV 16 bit formats to second header
firmware: isp: Avoid setting vpitch in YUVUV16 cases
firmware: isp: Handle 16 bit yuv in ip_is_supported_format

firmware: hello_fft: Fixup offset calculation when mapping/unmapping buffers
See: raspberrypi/userland#408
popcornmix added a commit to Hexxeh/rpi-firmware that referenced this issue Jul 21, 2017
…llback

See: raspberrypi/userland#390

firmware: RIL null_sink: Support MMAL opaque input
See: raspberrypi/userland#388

firmware: arm_display: Avoid hang when display_rotate is used with vc4-kms-v3d driver
See: guysoft/FullPageOS#137

firmware: 2ndstage: Fix printing of zero as a decimal in uart_printf

firmware: cdi_camera: Allow GPIO control on FS and FE events

firmware: IL ISP: Add option to alter the shift in the output stage
firmware: IL ISP: Add option for adjusting the input CCM
firmware: vc_image: fix size calcs for YUV_UV_16
firmware: vc_image_helper: Add YUV 16 bit formats to second header
firmware: isp: Avoid setting vpitch in YUVUV16 cases
firmware: isp: Handle 16 bit yuv in ip_is_supported_format

firmware: hello_fft: Fixup offset calculation when mapping/unmapping buffers
See: raspberrypi/userland#408
mkreisl added a commit to xbianonpi/xbian-package-firmware that referenced this issue Sep 13, 2017
- firmware: platform: Move trait initialisation out of #ifdef'd function

- firmware: usb: Change USB PHY settings to make device mode work correctly

- firmware: dtoverlay: Update fixups when a node is renamed
- firmware: dtoverlay app: Add the -D (dry-run) option
  See: raspberrypi/linux#2002

- firmware: dispserver: Adjust open/close refcount on application exit
  See: #778

- firmware: filex: Optimise directory search of the root directory

- firmware: Revert Change USB PHY settings to make device mode work correctly.
  See: #816

- firmware: Comments: Replace copyright symbol with (c)

- firmware: arm_display: Remove unused sdtv variables

- firmware: tvservice: Avoid referencing uninitialised state when unsuccessful
  See: raspberrypi/userland#397

- firmware: dtoverlay: Short-circuit empty parameter handling
  See: raspberrypi/linux#2028

- firmware: rtos: Protect against null timer callback
  See: http://forum.kodi.tv/showthread.php?tid=280408

- firmware: arm_dt: Add txp node to device tree parsing to mask off transposer interrupt

- firmware: venc: Correct the validation on custom mb/mbps/br settings
  See: #819

- firmware: venc: Correct the validation on custom mb/mbps/br settings
  See: #819

- firmware: vc_image: Remove structure definition duplication
- firmware: vc_image/mmal/il/isp: Add support for 16bit/component YUV420 and YUVUV

- firmware: vcdbg: Don't use dma when file provided

- firmware: rtos: Avoid sleeping delay when RTOS is not present

- firmware: bootcode: Remove reliance on scanf to reduce bootcode.bin size
- firmware: bootcode: Changes to force to full speed
- firmware: bootcode: Make sure bootcode drops out
- firmware: bootcode: Mass storage changes to power off/on USB block
- firmware: bootcode: Change USB 1.1 to have 64 byte endpoints
- firmware: bootcode: Set MSD serial number to be the Pi serial number

- firmware: imx219: Extend line length for long frame times

- firmware: 2ndstage: Improve i2c_gpio support
- firmware: i2c_gpio: Improve implementation and usage

- firmware: Camplus: Enable RAW12 support in the ISP input formatter

- firmware: scalerlib: Don't flip tiled format and swap R/B
- firmware: arm_display: Provide mechanism to request tiled format framebuffer
  See: #820

- firmware: platform: Set BT LPO frequency to 32768Hz
  See: #831

- firmware: arm_display: Fix mixup with xres/xres_virtual
  See: https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=187058

- firmware: video_render: Relax the alignment requirements for pitches
- firmware: vc_image: Use vpitch when determining size of YUV buffers

- firmware: Fix regression in uart clock frequency
  See: #833

- bootcode: usb: Dont overwrite configured parameters

- firmware: usb: Force MSD app to use CM3 pin conf

- firmware: IL ISP: Fix typo in logging
- firmware: IL ISP: Add black level and lens shading controls
- firmware: isp: Correct ISP Bayer stride calcs for supported formats
- firmware: Remove unused duplicate versions of vc_sm_defs.h
- firmware: IL camera: add get_parameter for OMX_IndexConfigCustomAwbGains
- firmware: IL resize: Support get_parameter OMX_IndexConfigCommonInputCro
- firmware: MMAL/RIL: Add MMAL_PARAMETER_RESIZE_PARAMS / OMX_IndexParamResize mapping
- firmware: ISP IL: Add lresize output
- firmware: MMAL/RIL: Add mapping for OMX_IndexConfigCommon[In|Out]putCrop
- firmware: MMAL/RIL: Correct handling of MMAL_PARAMETER_VIDEO_SOURCE_PATTERN
- firmware: IL ISP: Add H & V flip support
- firmware: IL ISP: Implement OMX_IndexConfigCommonInputCrop

- firmware: imx219: Refactor exposure calculations

- firmware: dmalib: Stop spinning on dma_pause if END is signalled
  See: #824

- firmware: MMAL: Avoid lockup with opaque stripes into opaque frame callback
  See: raspberrypi/userland#390

- firmware: RIL null_sink: Support MMAL opaque input
  See: raspberrypi/userland#388

- firmware: arm_display: Avoid hang when display_rotate is used with vc4-kms-v3d driver
  See: guysoft/FullPageOS#137

- firmware: 2ndstage: Fix printing of zero as a decimal in uart_printf

- firmware: cdi_camera: Allow GPIO control on FS and FE events

- firmware: IL ISP: Add option to alter the shift in the output stage
- firmware: IL ISP: Add option for adjusting the input CCM
- firmware: vc_image: fix size calcs for YUV_UV_16
- firmware: vc_image_helper: Add YUV 16 bit formats to second header
- firmware: isp: Avoid setting vpitch in YUVUV16 cases
- firmware: isp: Handle 16 bit yuv in ip_is_supported_format

- firmware: hello_fft: Fixup offset calculation when mapping/unmapping buffers
  See: raspberrypi/userland#408

- bootcode: Default to using total_mem=1024

- firmware: logging: Avoid wraparound issue with total_mem=1024

- firmware: armstubs: Add wfe to ARMv7/ARMv8-32 stubs
  See: raspberrypi/linux#1989

- firmware: arm_loader: Use ethernet0 as fallback for placing DT MAC address
  See: #846

- firmware: dt-blob: Remove Zero W static I2C0 mapping on 28 & 29
  See: raspberrypi/linux#2130

- firmware: Revert arm_display: Avoid hang when display_rotate is used with vc4-kms-v3d driver

- firmware: arm_display: Avoid hang when display_rotate is used with vc4-kms-v3d driver 2
  See: #849
  See: #853

- firmware: vc_image headers: Tidy up duplication
- firmware: video_splitter: Only copy eColorFormat if not already set
  See: https://www.raspberrypi.org/forums/viewtopic.php?f=43&t=189830

- firmware: vcsm: Add new clean/invalidate command for 2D blocks
- firmware: gpuserver: Switch to using custom queue
- firmware: gpuserver: Add priority to queue

- firmware: MMAL/IL I420 and YUVUV 10bpp formats, + VCSM DMABUF import

- firmware: CEC: Fix crash when remote button release is received without a pressed
  See: https://forum.kodi.tv/showthread.php?tid=280408

- firmware: arm_loader display: Correct variable scope by renaming
  See: https://www.raspberrypi.org/forums/viewtopic.php?f=43&t=84889
@JamesH65
Copy link
Collaborator

JamesH65 commented Dec 5, 2017

Fixed.

@JamesH65 JamesH65 closed this as completed Dec 5, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants