lkml.org 
[lkml]   [2007]   [Feb]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: 2.6.20-rc7: known regressions
    From
    Date
    Le samedi 03 février 2007 à 10:58 +0100, Andi Kleen a écrit :
    > Define a efilinkage macro then that expands to nothing on ia64
    >
    > Probably asmlinkage would work already, syscall_linkage as used on ia64 doesn't
    > seem to affect function pointers.

    And here it goes:

    When calling into the EFI firmware, the parameters need to be passed on
    the stack. The recent change to use -mregparm=3 breaks x86 EFI support.
    This patch is needed to allow the new Intel-based Macs to suspend to ram
    (efi.get_time is called during the suspend phase).

    Signed-off-by: Frederic Riss <frederic.riss@gmail.com>
    ---

    diff --git a/include/linux/efi.h b/include/linux/efi.h
    index f8ebd7c..596e806 100644
    --- a/include/linux/efi.h
    +++ b/include/linux/efi.h
    @@ -157,22 +157,39 @@ typedef struct {
    unsigned long reset_system;
    } efi_runtime_services_t;

    -typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc);
    -typedef efi_status_t efi_set_time_t (efi_time_t *tm);
    -typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending,
    - efi_time_t *tm);
    -typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm);
    -typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr,
    - unsigned long *data_size, void *data);
    -typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name,
    - efi_guid_t *vendor);
    -typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor,
    - unsigned long attr, unsigned long data_size,
    - void *data);
    -typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count);
    -typedef void efi_reset_system_t (int reset_type, efi_status_t status,
    - unsigned long data_size, efi_char16_t *data);
    -typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size,
    +#ifdef CONFIG_X86_32
    +#define efilinkage asmlinkage
    +#else
    +#define efilinkage
    +#endif
    +
    +typedef efilinkage efi_status_t efi_get_time_t (efi_time_t *tm,
    + efi_time_cap_t *tc);
    +typedef efilinkage efi_status_t efi_set_time_t (efi_time_t *tm);
    +typedef efilinkage efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled,
    + efi_bool_t *pending,
    + efi_time_t *tm);
    +typedef efilinkage efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled,
    + efi_time_t *tm);
    +typedef efilinkage efi_status_t efi_get_variable_t (efi_char16_t *name,
    + efi_guid_t *vendor,
    + u32 *attr,
    + unsigned long *data_size,
    + void *data);
    +typedef efilinkage efi_status_t efi_get_next_variable_t (unsigned long *name_sz,
    + efi_char16_t *name,
    + efi_guid_t *vendor);
    +typedef efilinkage efi_status_t efi_set_variable_t (efi_char16_t *name,
    + efi_guid_t *vendor,
    + unsigned long attr,
    + unsigned long data_size,
    + void *data);
    +typedef efilinkage efi_status_t efi_get_next_high_mono_count_t (u32 *count);
    +typedef efilinkage void efi_reset_system_t (int reset_type,
    + efi_status_t status,
    + unsigned long data_size,
    + efi_char16_t *data);
    +typedef efilinkage efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size,
    unsigned long descriptor_size,
    u32 descriptor_version,
    efi_memory_desc_t *virtual_map);


    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-02-03 11:51    [W:0.033 / U:31.048 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site